关键这个电路是硬件设计好就可以。做一个40khz的发射电路。。。用2051的一个io控制电源。。。动态扫描led显示另外再做一个40khz的接收电路。。。二者频率对准。。。接收电路接收到发射信号的时候输出一个电压触发中断,先接通40khz发射电路的工作电压。。。单片机开始计时。。。等侍接收电路触发中断。当有中断。停止计时。。。这个时间除以2再乘以超声波在空气中传播速度。应该就是等于你要测试的距离。。。这是参考源代码,可能不全,仅作参考!#include #define unit unsigned int#define uchar unsigned charsbit 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; }