超声波测距模块HC-SR04以及参考代码

一、超声波

        超声波是一种波长极短的机械波,在空气中波长一般短于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);
   }
  	
}

     

  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值