自制的超声波模块,用的是74ALS04驱动发射,用CX20106来接收,用单片机一个IO口软件产生40KHZ的方波发送,另一个端口接收。
我的程序:
#include <reg52.H> //器件配置文件
#include <intrins.h>
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit dula=P2^0;
sbit wela=P2^1;
sbit RX=P3^2;
sbit TX=P3^7;
uchar flag=0,tt=0,i=0;
uint ge=0,shi=0,bai=0,qian=0,S=0,time;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,
0x89,0x86,0xc7,0xc0,0xff};
void delay(uint z)
{
uint t1,y;
for(t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
dula=1;
P1=table[qian];
dula=0;
P1=0x01;
wela=1;
P1=0x01;
wela=0;
delay(4);
dula=1;
P1=table[bai];
dula=0;
P1=0x00;
wela=1;
P1=0x04;
wela=0;
delay(4);
dula=1;
P1=table[shi];
dula=0;
P1=0x00;
wela=1;
P1=0x02;
wela=0;
delay(4);
dula=1;
P1=table[ge];
dula=0;
P1=0x00;
wela=1;
P1=0x08;
wela=0;
delay(1);
}
void tx() //从P3.7发出40KHz的脉冲
{
uchar n,p;
TR0=1;
EX0=1;
RX=1;
for(n=0;n<40;n++)
{
TX=0;
for(p=0;p<3;p++);
TX=1;
for(p=0;p<2;p++);
TX=1;
}
}
void Conut(void)
{
flag=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=time*0.17; //算出来是MM
qian=S/1000;
bai=S%1000/100;
shi=S%100/10;
ge=S%10;
display(qian,bai,shi,ge);
}
void main(void)
{
IT0=1; //外部中断低电平有效
TMOD=0x01; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允许T0中断
EA=1; //开启总中断
//RX=1;
while(1)
{
delay(13); //等待一会再发
tx();
while(!flag);
Conut();
}
}
void exter0() interrupt 0
{
TR0=0;
EX0=0;
flag=1;
}
void TimeOut(void) interrupt 1
{
TR0=0;
ET0=0;
EX0=0;
flag=1;
}
用的是stc89c52单片机
结果我直接把做好的模块放压在台面上,数码管也显示46mm,把它拿起来,数码管有反应,但是最多也只能到九十多mm,也就是只能检测5厘米,另外我看其他人的程序都是下降沿触发的,但是我试了用下降沿触发,结果没反应,用低电平还能检测几厘米,不知道是不是干扰而已,实际没有检测到。
电路图用的是网上的,不过接收电路CX20106我看到网上有两种接法,我用的是在端口1上接473电容的电路图,不知道这两种有没有区别。这是我第一次自己做一个小东西,希望大家指点一下,看看有什么问题,感激不尽! |