单片机 超声波哪位大侠,谁有基于单片机超声波测距的程序啊,小弟急用啊

2025-02-26 19:46:32
推荐回答(1个)
回答1:

关键这个电路是硬件设计好就可以。做一个40KHz的发射电路。。。用2051的一个IO控制电源。。。动态扫描LED显示
另外再做一个40KHZ的接收电路。。。二者频率对准。。。接收电路接收到发射信号的时候输出一个电压触发中断,先接通40KHZ发射电路的工作电压。。。单片机开始计时。。。等侍接收电路触发中断。当有中断。停止计时。。。
这个时间除以2再乘以超声波在空气中传播速度。应该就是等于你要测试的距离。。。
这是参考源代码,可能不全,仅作参考!
#include
#define unit unsigned int
#define uchar unsigned char
sbit fs="P3"^0; //发送端;
sbit h="P3"^7;
sbit l="P3"^5; //数码管位选端;
sbit m="P3"^4;
uchar tab[16]=\{0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,0x60,0x25,0x3C,0x23,0x34,0x74};//段码;
uchar u[3]; //显示数组;
unit count,b;
void delay(unit a) //延时;
\{
unit m;
for(m=0;m}
void tx() //从P3.0发出40KHz的脉冲
\{
uchar n,p;
for(n=0;n<40;n++)\{
fs=1;
for(p=0;p<3;p++);
fs=0;
for(p=0;p<2;p++);
fs=0;
}
}
void display(void) //显示;
\{
for(;;)
\{
l=1;m=1;h=1;
P1=tab[u[0]];
m=0;
delay(10);
m=1;
P1=tab[u[1]];
l=0;
delay(10);
l=1;
P1=tab[u[2]];
h=0;
delay(10);
h=1;
}
}
void rx() interrupt 0 //外部中断0,接收信号
\{
TR0=0;
count=TH0*256+TL0;
if(count<300);
if(count>=300)
\{
b=(17*count)/1000;
u[0]=b%10;
u[1]=(b/10)%10;
u[2]=(b/100)%10;
display();
}
}
void over()interrupt 1 //T0溢出为无效测量FFF;
\{
u[0]=15;
u[1]=15;
u[2]=15;
display();
}
void main()
\{
fs=0;
delay(8600);
TH0=0;
TL0=0;
TMOD=0x01;
TR0=1;
EA=1;
ET0=1;
PT0=1;
tx();
IT0=1;
IE=0x83;

}