从超声波的工作原理其实只要单片机的两个引脚就足够,一个引脚接发送端,一个引脚接接收端即可。工作时,发送端引脚置高电平10us时间的脉冲,这将激发超声波模块发送8个40khz周期的电平信号,然后模块的收端开始检测回波(实际上,两个眼睛,一个是发送的,一个是用来接收的)。一旦发现有回波信号,就会输出一个响应给接收端引脚,这个响应是一个高电平脉冲。所以,我们只要在接收端去检测是否有高电平脉冲即可。
但从程序编写与调试的过程来看,并没有那么简单。因为超声波第一次发送40KHZ的信号出去后反射回来,有可能又被反弹回去,这样以来,相当于超声波在两个障碍物之间不断地来回反弹,导致接收端不断地收到”回波信号“——实际上第一次反弹回来的才是回波信号,其他的都是二次、三次...的反弹回波信号。如果每次检测到回波就让蜂鸣器响一次,那么,我们程序运行时,可能会听到蜂鸣器不断地响,可能就是这个原因。
另外,需要关注的是,超声波如果前面没有障碍物,也会在接收端引脚上故意输出140us的电平,以”防止发射信号对回响信号的影响“。
从上面的分析看来,不管超声波前面有无障碍物,接收端引脚肯定都会出现高电平脉冲。所以我们在编程时,必须过滤掉这140us。
讲完超声波的工作原理,我们来看下编写程序的思路。
由于超声波可能会连续收到回响信号,导致接收端不断出现高电平脉冲,而实际上,我们有用的仅仅是第一次反射回来的回响信号,因此,使用”查询接收端引脚是否出现高电平“的方法行不通。可以使用外部中断,只检测第一次反射回来的信号,后续的反射信号全部丢弃不管。
下面看下140us的处理。根据公式us/58 = 厘米,140us就是约2cm的距离。因此在超声波前2cm有障碍物,刚好也会返回140us的高电平,而超声波的测量范围是3-4.5米,因此可以不考虑140us。
最后总结一下思路,发送端随便选一个引脚,这里选择P1.0,接收端使用外部中断0引脚P3.2。程序一开始,我们做定时器、中断的初始化,然后给发送端引脚一个高电平10us。
接下来,我们不断查询接收引脚是否有高电平出现,一旦出现高电平,立即启动定时器。选择单片机的外部中断0为下跳沿中断,因此当高电平一过,立即进入中断,此时关掉定时器,就OK了。后面再发现接收引脚跳变也不要进中断。
|