一、超声波
超声波是一种波长极短的机械波,在空气中波长一般短于2cm。它必须依靠介质进行传播,无法存在于真空(如太空)中。它在水中传播距离比空气中远,但因其波长短,在空气中则极易损耗,容易散射,不如可听声和次声波传得远,不过波长短更易于获得各向异性的声能,可用于清洗、碎石、杀菌消毒等。在医学、工业上有很多的应用。
二、超声波测距模块
超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。
超声波测距模块有好多种类型,比较常用的有URM37超声波传感器默认是232接口,可以调为TTL接口,URM05大功率超声波传感器测试距离能到10米,算是测试距离比较远的一款了,另外还有比较常用的国外的几款SRF系列的超声波模块,超声波模块精度能到1cm。
在这里主要介绍的是HC-SR04,后面会详细介绍。
三、超声波测距原理
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2 。这就是所谓的时间差测距法。
超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。
测距的公式表示为:L=C×T
式中L为测量的距离长度;C为超声波在空气中的传播速度;T为测量距离传播的时间差(T为发射到接收时间数值的一半)。
四、HC-SR04模块介绍
HCSR04是一种基于超声波测距原理的测距模块,价格实惠,稳定性好,测距范围为2-400cm。该模块由超声波发射模块、超声波接收模块和控制板组成。其可编程性高,灵敏度较高,常用于智能小车、导航设备等场景。
HC-SR04实物图:
可以看到,在HC-SR04上有四个引脚:Vcc、Trig、Echo、Gnd。
- Vcc:为传感器提供+5V电源
- Trig:触发控制信号输入
- Echo:回响信号输出
- Gnd:接地引脚
超声波时序图:
- 以上时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将发出 8个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。
- 建议测量周期为 60ms 以上,以防止发射信号对回响信号的影响。
- 公式: uS/58=厘米 uS/148=英寸; 距离= 高电平时间*声速(340M/S)/2
四、参考代码
以下代码能够实现的功能为:
1.通过数码管实时显示当前的测试距离,显示单位默认为CM
2.测试距离小于10CM时,蜂鸣器发出“嘀嘀嘀提示声”
此代码或许存在错误,因此仅供参考。
#include "regx52.h"
#include "intrins.h"
#include "SMG.h"
#include "delay.h"
sbit BEEP=P2^5;
sbit ECHO=P2^0; //检测超声波返回脉冲
sbit TRIG=P2^1; //触发超声波开始测距
void SR04_Start()
{
TRIG = 1; //输出高电平
Delay_us(10); //延时10us,也就是产生10us的高电平
TRIG = 0; //输出低电平
}
int SR04_GetDistance()
{
double time;
TH0 = 0;
TL0 = 0; //让下一次测距,时间为0开始
//启动测距
SR04_Start();
//由低电平跳转高电平,表示返回脉冲的开始
while(ECHO == 0);
TR0 = 1; //启动定时器,开始计数
//由高电平跳转低电平,表示脉冲结束
while(ECHO == 1);
TR0 = 0; //停止定时器
//计算出中间经过多少时间
time=(TH0*256+TL0)*1.085;
//距离等于时间*速度(340m/s)/2=(34000cm/s)/2=(34cm/ms)/2=(0.034cm/us)/2
return (time*0.017);
}
void Beep()
{
int i=200;
while(i--)
{
BEEP =! BEEP;
Delay_us(50);
}
}
void main()
{
//初始化定时器
TMOD|=0x01; //定时器工作在方式1
TH0 = 0;
TL0 = 0;
TRIG = 0; //默认状态下,TRIG输出低电平
while(1)
{
int distance = 0;
distance = SR04_GetDistance();//得到的单位是CM
if(distance<10)
{
Beep();
}
else
{
Show_Num(distance);
}
Show_Num(distance);
}
}