超声波测距程序主要由主程序、定时器T1 中断服务程序(产生驱动脉冲)、外中断 0 中断服务程序(接收到超声波的回波后进入外中断 0)、显示子程序、距离计算子程序、延时子程序和其他几个通用子程序组成。
在主程序中,首先对有关单元和标志位进行初始化,并设置定时器T0 和T1 工作模式为16 位的定时器模式,开启总中断和定时器T1 中断。然后进入循环状态,调用显示子程序,显示测量的距离,并判断接收标志位testok是否为 1。若为 1,说明接收成功,调用calulate( )子程序计算测量距离;若testok为 0,说明接收未成功,继续接收。
定时器T1 中断服务程序的作用是产生驱动脉冲,驱动超声波探头工作。定时器T1 定时时间为 65.536ms,也就是说,每隔 65.536ms,定时器T1 就中断一次。在定时器T1 中断中,对单片机的P1.0 引脚(wave_out)进行取反,延时,再取反,再延时,……,共 4 次,以产生40kHz的超声波脉冲。另外,在产生超声波脉冲的同时,还同时把计数器T0 打开进行计时。
为避免超声波从发射器直接传送到接收器引起的直接波触发,超声波脉冲发送后,再调用延时函数delay( ),延迟 0.1ms左右的时间,才打开外中断 0 接收返回的超声波信号。
在超声波测距仪中,由于采用 12MHz的晶振,机器周期为 1μs,当主程序检测到接收成功的标志位后,将计数器T0 中的数(即超声波来回所用的时间)按下式计算即可测得被测物体与测距仪之间的距离,设计时取 20℃时的声速为 340 m/s,则得到
d =( C ×T0)/2
=170T0/10000cm
式中 T0——计数器T0 的计数值。
超声波测距器利用外中断 0 检测返回超声波信号,一旦接收到返回超声波信号(单片机P3.2 引脚出现低电平),立即进入外中断 0 服务程序。进入该中断后,立即关闭定时器T0,停止计时,并将计数值T0 送变量distance进行保存,同时将测距成功标志位testok置 1。
根据要求,编写的源程序如下:
超声波测距仪的详细源程序在“附光盘”→“源程序”→“ch3 文件夹”中。
超声波测距仪设计和制作完成后,即可进行调试。调试时,首先将程序编译好下载到单片机;然后给测距仪通电,将探头对准一障碍物,观察数码管显示的结果;最后再用尺子进行测量,看超声波测距仪测距是否准确。正常情况下,误差应不大于 1cm,若误差过大,可对外中断 0 中的超声波脉冲宽度进行适当调整。
最后说明一下,该超声波测距仪最小检测距离为 27cm,为什么会有最小测量距离呢?这是为了防止超声波发射探头发出超声波沿电路板或者外壳直接进入超声波接收探头内引起误判断,所以程序要求超声波发射若干时间后必须停止若干时间,这个时间大约是超声波在空气中传播 20 多厘米的时间,这段时间内是不接收信号的,主要就是为了躲开直接传导的信号避免引起误判断。
另外,超声波测距仪中还设有蜂鸣器电路和 4 个按键,在本设计中并未使用到,主要是为后续开发和应用所预留的。例如,你可以在程序中定义为开关功能,按下一个按键,电路板开始测距,按下另一个按键电路板停止测距,或者设定多挡距离报警,当检测到低于设定距离时,驱动蜂鸣器报警。其实,该超声波测距仪也可以加以改进,如用 1602 的液晶模块代替LED数码管显示、增加语音电路实现语音播报探测距离等。