51单片机与超声波测距模块

使用HC-SR04超声波测距模块与51单片机汇编。

--by Captdam @ Dec 20, 2018

目标

测距仪的目标当然是测距了 _(:3 _| <)__这不明摆着的嘛。

最近在零件堆里找到一块不知道什么时候买的超声波测距模块了,应该是有三五年以上了。正好最近在捣鼓6500陀螺仪模块,就想把这玩意可以和那个陀螺仪模块连在同一块单片机上,做成集成姿态感应模块。

因为那个陀螺仪的工作方式是上位机下达查询指令-单片机通过软件SPI(我用的STC89C52没有硬件SPI)走I2C协议查询陀螺仪的姿态数据寄存器,然后通过UART把信息回报给上位机。所以,这个超声波测距模块将连接到那一张单片机上,取得距离数据后通过UART,和姿态数据一并上传给上位机。

这一片blog是关于这个超声波模块的,因此陀螺仪模块的东西不涉及。

超声波模块

我手上的这一个模块是HC-SR04,有四个引脚:VCC(5V供电),Trigger,Echo,GND。工作的时候,首先给与Trigger脚一个大于10us的高电平(虽然我测试时8us也够了,但是为了保险还是使用datasheet给的的10us吧)。接下来,超声波模块上面的喇叭会发出8个40kHz的声波。然后,Echo脚将会被模块拉高声波从模块发出到达物体后返回模块的时间。也就是说,Echo脚的电压会被拉高的时间=声波从模块到模块前方物体运行一个来回的时间。

t = 2 * d / v

d = t * v / 2 = t * 170m/s

音速取340m/s

因为单片机使用12MHz晶振且运行于12T模式,所以单片机一个cycle就是1us,那么距离(cm)=cycle count / 58。

顺便吐槽一下,因为这个模块太基本了,所以很多厂商都在做,datasheet也是五花八门(只有logo部分)。不过基本90%的datasheet上关于声波频率都误写成了40Hz。

一个datasheet里面没有提到的东西:如果距离在模块的测距范围以外,模块将会在echo脚上返回大于65535us宽度的信号。(并没有使用逻辑分析仪测量,是根据不同写法的代码与运行结果测得盲测的)

单片机电路设计

首先,根据datasheet,这个模块需要4根连线:两根供电接电源上,另外两根数据接单片机上。

要测量距离,关键是测量echo脚上高电平的持续时间,所以,我们将需要使用一个timer来执行这个操作。因为timer0和timer1都已经被使用了,只剩下timer2,正好timer2支持外部下降沿对timer2的值进行捕获。所以,就将超声波模块的echo脚连接单片机的P1.1(T2EX,T2触发脚);对于超神波模块的trigger脚,我们只要能给它一个10us脉冲就行,所以任何脚都可以,于是我就选择P1.2了。

另外,需要再验证一下。因为datasheet表示这个模块最远能够测试4m的距离,也就是说echo的宽度最大可以达到23200us。对于12Mhz,12T的MSC-51,也就是23200个cycle。timer2支持16-bit捕获,也就是说最大可以支持65535cycle,所以使用timer2进行测量是可行的。

关于UART,RX,TX,波特率发生器倒没什么特别可说的。

代码与讲解

首先,完整的代码:

因为这个只是demo,单片机启动后只会测量一次。实际使用时,会使用UART或者其他中断触发MAIN的部分,达到“上位机发送请求-下位机测量返回数据”这样的工作模式。