超声波模块的调试——该碰到的都碰到了 原文来自:牛奶动力博客 www.milk-power.com 接着上一篇《超声波工作原理》开讲。 由于项目需要,我们并没有使用超声波测量距离的功能,我们只用来判断是否有障碍物。另外,我们只让超声波检测1.5米范围内是否有障碍物,超出1.5米之外,全部要忽略掉。因此我编写的程序可能和大家不太一样。 我使用12Mhz的晶振,机器周期为1us,即定时器每次加1用1us时间。1.5米的距离,超声波来回一次走3米,3m/340米每秒 = 8823us,就是说,如果经过8823us后,还没有收到回响信号,说明距离已经超出了1.5米,我直接丢弃,并警告距离超出1.5米。这样,定时器的初始值可以设置为(65536 - 8823us)。那么怎么判断是否溢出呢?我使用TF0来做。程序如下,其中P1.7 、P0.7、P3.7是测试用的脚,可忽略,硬件链接为: Trig -->P1.0 Echo-->P3.2 VCC -->VCC GND -->GND 还有一个脚空着。 /*======超声波控制线=====*/ Trig BIT P1.0 //发射端,高电平有效 Echo BIT P3.2 //接收端,探测高脉冲有效,高脉冲持续时间,与距离成正比 //OUT BIT ORG 0000H AJMP CSB ORG 0003H AJMP INTT0 ORG 0100H CSB: SETB EA /*首先开启总中断 */ SETB EX0 /*开启外部中断 0 */ SETB IT0 /* 设置成 下降沿触发方式*/ MOV TMOD,#01H MOV TH0,#0DDH MOV TL0,#89H CLR P1.7 CLR Echo SETB Trig LCALL DELAY_10us CLR Trig /*==============END=====================*/ WAITE_1:NOP JNB Echo,WAITE_1 //检测高电平出现,启动定时 SETB TR0 CLR P0.7 LCALL DELAY_1 SETB P0.7 LJMP CSB /*==============外部中断0=====================*/ INTT0: CLR EA CLR TR0 JNB TF0,NEXT1 CLR TF0 LJMP BACK NEXT1: CLR P3.7 LCALL DELAY_1 SETB P3.7 //SETB EA BACK: RETI /*====延迟1s子程序====*/ DELAY_1: MOV R0,#100 DEL2: MOV R1,#10 DEL1: MOV R2,#7DH DEL0: NOP NOP DJNZ R2,DEL0 DJNZ R1,DEL1 DJNZ R0,DEL2 RET /*====延迟10us子程序====*/ DELAY_10us: MOV R0,#10 DEL3: NOP DJNZ R0,DEL3 RET END