1、超声测距传感器
型号:HC-SR04引脚有VCC、GND、Trig、Echo
超声波测距模块是用来测量距离的一种产品,通过发送和接收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离。
(1)如何发送超声波?
给Trig端口至少10us的高电平
(2)怎么知道模块已经发送超声波了?
检测Echo信号,由低电平跳转到高电平,表示开始发送波
(3) 怎么知道接收了返回波
Echo,由高电平跳转回低电平,表示波回来了
(4)超声波时序图
(5) 怎么算时间?
Echo引脚维持高电平的时间波发出去的那一下,也就是Echo从低电平到电平,开始启动定时器波回来的那一下,也就是Echo从高电平到低电平,我们开始停止定时器,计算出中间经过多少时间距离 = 速度 (340m/s)* 时间/2
2、代码实现超声测距
当障碍物距离超声模块小于10cm,我们让D5亮,D6灭。大于10cm则反之。
(1)实现触发Trig的部分(10us触发)
void Trig_HC_SR04() { Trig = 0; Trig = 1; Delay10us(); Trig = 0; }
(2)主函数中注意判断Echo高低电平的部分 采用while循环
当Echo由低到高时 while(Echo==0); 不成立 ,说明此时为高电平,则打开定时器(TR0 = 1;)开始计时。计时结束原理相同
void Time0Init() { AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TH0 = 0; TL0 = 0; } void main() { double time; double dis; led5 = 1; led6 = 1; Time0Init(); while(1){ // 1.Trig,给Trig端口至少10us的高电平 Delay200ms(); Trig_HC_SR04(); //2.Echo由低电平跳转到高电平,表示开始发送波 while(Echo == 0); //波出去的那一下子开启定时器 TR0 = 1; //3.Echo由高电平到低电平,表示波回来了 while(Echo == 1); //波回来的那一下,我们开始关闭定时器 TR0 = 0; //4.计算出中间经过多长时间 time = ( TH0 * 256 + TL0 )* 1.085; //5.距离=速度*时间; 340m/s=34000cm/s=34cm/ms=0.034cm/us dis = 0.017*time; if(dis <10){ led5 = 0; led6 = 1; } else{ led5 = 1; led6 = 0; } TH0 = 0; TL0 = 0; } }
(3)在实验中需要注意,在while循环刚开始的时候需要延时一段时间,原因是需要给模块上多一点稳定时间,否则看不到灯的亮灭
这里或许会有人有疑问,那要是时间太长定时器溢出了,时间不久不对了吗,其实这个问题我也考虑过,但是我们需要测的是10cm的范围内,只有判断在10cm之内就可以了,16位定时器最大可以定时71ms,(定时器那节已经学过了),则可以测试的最大距离位0.071s*340m/s=24.14m!所以测试的范围还是很大的,根本不用担心的!