2. 51单片机驱动超声波测距模块(HC-SR04)

3. 超声波测距
3.1 简介
型号: HC-SR04
接线参考:模块除了两个电源引脚外,还有 TRIG ECHO 引脚,这两个引脚分别接我们开发板的 P1.0和 P1.1端口.

超声波测距模块利用声波传播特性实现精准距离测量。其工作原理是:首先发射超声波,当声波遇到障碍物后反射回模块,通过计算声波往返时间差与声速的乘积,即可准确测定模块与前方障碍物之间的距离。

要让设备发送超声波,需在Trig端口施加至少10微秒的高电平信号。如何判断超声波已开始发送?观察Echo信号:当其从低电平跳转为高电平时,表明超声波已开始发射。如何确认接收到返回波?当Echo信号从高电平跳回低电平时,表示超声波已返回。

计算时间的方法如下:测量Echo引脚保持高电平的持续时间。具体操作是:在超声波发射的瞬间启动定时器,在接收到返回波时停止定时器,即可计算出超声波往返所需的时间。

距离计算公式为:距离 = 声速(340米/秒)× 时间 / 2。其中,时间是指超声波往返所需的时间,除以2是因为超声波需要往返一次。

3.2 超声波的时序图
3.3 超声波测距代码实现

#include "reg52.h"
#include "intrins.h"

sbit sonic_trig = P1^0;
sbit sonic_echo = P1^1;

sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;

void Timer1_Init(void)
{
    TMOD &= 0x0f;
    TMOD |= 0x10;
    TL1 = 0;
    TH1 = 0;
}

void Delay20us(void)    //@11.0592MHz
{
    unsigned char data i;

    _nop_();
    i = 6;
    while (--i);
}


void main(void)
{
    unsigned int time = 0;
    unsigned int dis = 0;
    
    Timer1_Init();
    while(1)
    {
        led1 = 0;
        //1.给trig至少10us的脉冲电平
        sonic_trig = 0;
        sonic_trig = 1;
        Delay20us();
        sonic_trig = 0;
        
        led2 = 0;
        //2.echo从低电平到高电平跳转,然后开启定时器
        while(sonic_echo == 0);
        TR1 = 1;
        
        led3 = 0;
        //3.echo从高电平到低电平跳转,然后关闭定时器
        while(sonic_echo);
        TR1 = 0;
        
        led4 = 0;
        //4.获取定时器的计时时间
        time = (TH1 << 8 | TL1) * 1.085;
        
        //5.计算距离
        dis = time * 0.017;
        
        if(dis <= 10)
        {
            led5 = 0;
            led6 = 1;
        }
        else
        {
            led5 = 1;
            led6 = 0;
        }
        
         //6.计数器清零
        TL1 = 0;
        TH1 = 0;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值