【嵌入式】基于STC89C52RC的51单片机学习(四)——超声测距

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!所以测试的范围还是很大的,根本不用担心的!

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值