基于51单片机的超声波测距

1.超声波测距原理
超声波是利用反射的原理测量距离的,被测距离一端为超声波传感器,另一端必须有能反射超声波的物体。测量距离时,将超声波传感器对准反射物发射超声波,并开始计时,超声波在空气中传播到达障碍物后被反射回来,传感器接收到反射脉冲后立即停止计时,然后根据超声波的传播速度和计时时间就能计算出两端的距离。
在这里插入图片描述
2.超声波模块
此次采用的是市面上常用的超声波模块HC-SR04;
在这里插入图片描述
HC-SR04参数:

  1. 工作电压:DC5V
  2. 静态电流:小于2mA
  3. 电平信号输出:高5V ,低0V
  4. 感应角度:不大于15度
  5. 探测距离:2cm-450cm

超声波模块工作原理:
在这里插入图片描述
(1)采用IO触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.
(4)单片机将得到的数据进行处理计算,公式如下

测试距离 = (高电平时间 * 声速(340M / S)) /2

3.系统总体硬件图
在这里插入图片描述
硬件组成:单片机最小系统+LCD1602显示屏+超声波模块+DC5V电源

4.程序分析

1.超声波模块控制程序
(1)触发信号发送

void  StartModule() 		         //启动模块
  {
	  TX=1;			                     //启动一次模块
	  _nop_();  _nop_(); _nop_(); _nop_(); _nop_(); 
	  _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
	  _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
	  _nop_(); _nop_();_nop_(); _nop_(); _nop_(); 
	  _nop_();
	  TX=0;
  }

TRIP引脚是内部上拉10K的电阻,用单片机的IO口拉低TRIP引脚,然后给一个10us以上的脉冲信号。

(2)接收回波并计算

void Conut(void)
{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	
	 S=(time*1.7)/100;     //算出来是CM
	 if((S>=700)||flag==1) //超出测量范围显示“-”
	 {	 
	  	flag=0;
	  	DisplayOneChar(0, 1, ASCII[11]);
	  	DisplayOneChar(1, 1, ASCII[10]);	//显示点
	  	DisplayOneChar(2, 1, ASCII[11]);
	  	DisplayOneChar(3, 1, ASCII[11]);
	  	DisplayOneChar(4, 1, ASCII[12]);	//显示M
	 }
	 else
	 {
	  	disbuff[0]=S%1000/100;
	  	disbuff[1]=S%1000%100/10;
	  	disbuff[2]=S%1000%10 %10;
	  	DisplayOneChar(0, 1, ASCII[disbuff[0]]);
	  	DisplayOneChar(1, 1, ASCII[10]);	//显示点
	  	DisplayOneChar(2, 1, ASCII[disbuff[1]]);
	  	DisplayOneChar(3, 1, ASCII[disbuff[2]]);
	  	DisplayOneChar(4, 1, ASCII[12]);	//显示M
	 }
}

一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值

(3) 主程序

void main(void)
{
	unsigned char TempCyc;
	Delay400Ms(); //启动等待,等LCM讲入工作状态
	LCMInit(); //LCM初始化
	Delay5Ms(); //延时片刻(可不要)
	DisplayListChar(0, 0, mcustudio);
	DisplayListChar(0, 1, email);
	ReadDataLCM();//测试用句无意义
	for (TempCyc=0; TempCyc<10; TempCyc++)
	Delay400Ms(); //延时
	DisplayListChar(0, 1, Cls);	
	while(1)
	{
	 	TMOD=0x01;		   //设T0为方式1,GATE=1;
	 	TH0=0;
	 	TL0=0;          
	 	ET0=1;             //允许T0中断
	 	EA=1;			   //开启总中断			
		while(1)
	  	{
	     	StartModule();
			// DisplayOneChar(0, 1, ASCII[0]);
	     	while(!RX);		//当RX为零时等待
	    	TR0=1;			    //开启计数
	     	while(RX);			//当RX为1计数并等待
	     	TR0=0;				//关闭计数
         	Conut();			//计算
         	delayms(80);		//80MS 
	    }
	}
}

注意事项:
1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响
模块工作。
2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。

源码+AD电路图 下载:关注公众号,首页回复“超声波测距”获取资料
在这里插入图片描述

  • 83
    点赞
  • 628
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值