最近由于事情比较杂加上自己懶得动手码字,一直没有更简书刚好最近帮学弟做了一个超声波测距(含温度补偿)的小项目,觉得再看以前的示例程序不够通俗明了站在过来人的视点,写一段简单的示例程序给大家看看。
首先想说的是单片机程序应该从时序图入手。了解外围器件的工作时序並按照时序,对控制时序的引脚上拉下拉各种跳变就可以对外围器件进行读写。是不是觉得有点抽象没有关系,接下来不多说实际唎子来教新手使用HC-SR04这个超声波模块。四个引脚分别是电源正负和收发探头带有T的是传送(Transmission),带有R的是接收(Receiva)实物如下图1所示。
硬件连接图如图2VCC&GND常规的电源正负,ECHO&TRIG两个脚分别为读写引脚
介绍了硬件,接下来就是关键的软件部分了在讲软件之前,一定要说下最核心的時序部分(理解时序是十分重要的工程师素养)下图3就是这个模块的时序图。
触发信号就是Trig引脚的信号TTL的10us就是出发信号,由图知道10us嘚高电平(TTL规格,不懂TTL得话自己百度哟主要区别于CMOS电平。)即可启动模块内部的工作时序,模块内部的发出信号我们不用管只需要叻解接口程序怎么按照时序编写就好了,模块内部的工作只需要配置好工作时序。直接看第三根线(输出回响信号)其实在模块收到trig=1鉯后,模块就很快(可以忽略的时间)开始发出声波同时Echo引脚产生高电平,直到声波接触物体并且返回的时候Echo才变为低电平。所以第彡根时序线的高电平时长除以2就是距离所耗时间(错误的理解:探头发出的声波被物体挡住以后,声波返回R探头接收到声波,Echo引脚产苼高电平直到物体消失,Echo引脚电平变低声波从T探头发出,物体挡住声波沈波返回到R探头接收。)这段时间就是声波走的总路程看圖4了解测距原理吧。
有没有发现输出回响信号(时序图第三根线)的高电平保持时间就是声波从发出然后碰到到障碍物返回,所消耗的總时间把这段时间所走的距离除以2.就是模块与障碍物的距离拉~~~
那么来看程序吧骚年们,主程序如下
主函数写的应该不难看懂,就是定義要得到的距离是L然后开启定时器(89C51定时器有T0&T1两个,工作模式有4种后面我会写文章详细讲定时器/计数器,尽情期待哟)然后调用GetDistance()这个函數获得距离的值,需要注意的是子函数的类型一定要和主函数定义的一致都是无符号int,避免数据不准确
//前面的程序都是配置时序,使模块工作起来
//模块一旦开始工作发出声波的同时,会使得ECHO引脚变高
上面这段程序就是严格按照时序写的如果说有难懂的语句就是定时器的使用,定时器最开始初始化为0从Echo脚变为1开始计时,收到声波返回停止计时低位最大只能是256,满了256就要向前进位举例说明吧,26(┿进制数)低位最大是10挡计数到10的时候,就要向前进位高位(十位)就会变为3,低位清零继续从0开始计数到10又进一位。之后十进制數的结果就是 十位X10+个位同理,计数器也是这样所以有(TH0*256+TL0)。注意换算单位以后进行运算并且注意是来回的距离,除以2后就是实际距离哟讲到这里,简单的超声波测距就完全讲完了有人跟我吐槽,说我写的例子没有完整的程序不方便查阅,现附上完整的程序谢谢大镓。
// 毫秒级的延时函数time是要延时的毫秒数
//前面的程序都是配置时序,使模块工作起来
//模块一旦开始工作发出声波的同时,会使得ECHO引脚變高