c51单片机的超声波测距

前言

超声波在气体、液体及固体中以不同速度传播,定向性好、能量集中、传输过程中衰减较小、反射能力较强。 超声波能以一定速度定向传播、遇障碍物后形成反射,利用这一特性,通过测定超声波往返所用时间就可计算出实际距离,从而实现无接触测量物体距离。 超声波测距迅速、方便,且不受光线等因素影响

目录

一、超声波测距应用广泛

二、超声波测距模块硬件介绍

三、主要思路

四、代码

一、超声波测距应用广泛

超声波测距在各种不同领域和应用中都有广泛的使用,包括以下一些常见的场合:
1. 工业自动化:超声波传感器常用于工业自动化中,用于测量物体的距离和位置,以监控生产线上的
物体或机器人的位置。它们可以用于控制机器人的运动、检测物体的存在或测量液位。
2. 障碍物检测:超声波传感器被广泛用于车辆和机器人中,以检测周围环境中的障碍物。这在自动驾
驶汽车、智能洗衣机、无人机和工业机器人等应用中非常重要。
3. 距离测量:用于测量物体与传感器之间的距离,例如在仓储管理、建筑测量和地质勘探中。
4. 液位测量:用于测量液体或粉体的液位,例如在油罐、水池、粮仓和药品制造中。
5. 游戏和娱乐:一些玩具、游戏和娱乐设备中使用超声波传感器来实现互动和距离测量功能。
6. 医疗设备:用于医疗设备中,例如超声波图像设备(如超声波扫描仪)用于医学成像和超声波测距
传感器用于监测患者的距离和位置。
7. 安防系统:超声波传感器可用于入侵检测、人员计数和监控系统,以提高安全性。  
8. 非接触控制:超声波传感器还用于非接触控制,例如手势识别、触摸屏技术和自动门开关。

二、超声波测距模块硬件介绍

超声波
​​​​​
可以看到,超声波模块有 4 个引脚,分别为 Vcc Trig Echo GND ,这四个引脚的功能分别如下
VCC :接 VCC 电源(直流 3V-5.5V )。

Trig:针对这个模块来说Trig脚是输入,而我们在单片机上需要在这个引脚中输出一个10us以上的高电平,可触发模块测距,这时候就会驱动这个超声波模块发出声波。

Echo: 针对这个模块Echo是输出,接下来它会自动接收超声波,并且接收完后在Echo这个输出脚上输出一段高电平,当测距结束时,此管脚会输出一个高电平,电平宽度为超 声波往返时间之和。这个高电平的时间就是声波发出并且反射回来所用的时间,所以我们在单片机中就需要读取这个引脚。

GND :接外部电路的地。
如图 所示,单片机需要做的就是产生一个触发信号,然后检测输出回响信号的脉冲宽度即可,脉冲宽度的检测可以使用定时器来实现。

三、主要思路

 了解了Trig和Echo,对这个模块的工作原理基本上可以理解了,那么接下来就需要在单片机上完成Trig的触发信号、Echo接收信号。

初始化GPIO,使能总线和端口,由于Trig用作输出电平,而Echo用作读取电平,所以将Trig脚设置为推挽输出,Echo脚设置成浮空输入。初始化定时器,需要定时器来计时。

将Trig置为1高电平,再延时10us,之后将Trig复原为0低电平。这样就会让超声波模块内部发送触发信号然后发出超声波。

等待Echo变为1高电平,然后重载并开启定时器,等待Echo变为0低电平,最后定时器停止计数,读取TIM->CNT这个寄存器也就是计数次数。

四、代码

#include <reg52.h>  
  
#define Trig P1^0  // 定义Trig接口  
#define Echo P1^1  // 定义Echo接口  
  
void delay(unsigned int t);  // 延时函数  
void distance_test();        // 测距函数  
  
void main()  
{  
    while(1)  
    {  
        distance_test();  // 不断调用测距函数  
    }  
}  
  
void delay(unsigned int t)  // 延时函数  
{  
    while(t--);  
}  
  
void distance_test()  // 测距函数  
{  
    unsigned int time = 0;  // 记录时间  
    unsigned int distance;  // 记录距离  
    Trig = 1;  // 发送超声波信号  
    delay(15);  // 延时15us,等待超声波信号发送完毕  
    Trig = 0;  // 关闭Trig接口  
    while(!Echo);  // 等待Echo接口接收到反射回来的超声波信号  
    while(Echo)  // 当Echo接口接收到反射回来的超声波信号时,开始计时  
    {  
        time++;  
        delay(1);  // 延时1us,计时精度为1us  
    }  
    distance = (time * 17) / 100;  // 计算距离,单位为cm  
    // 在此处可以将距离值通过串口或其他方式输出显示  
}

以上代码使用了C51单片机的P1^0和P1^1两个接口,分别连接超声波模块的Trig和Echo接口。在main函数中不断调用distance_test()函数进行测距,并将距离值通过串口或其他方式输出显示。在distance_test()函数中,首先发送超声波信号,并等待一定时间,然后关闭Trig接口。接着等待Echo接口接收到反射回来的超声波信号,当接收到信号时开始计时,直到信号消失停止计时。最后根据计时时间和声速计算出距离值。需要注意的是,由于声速受温度等因素影响,因此实际测距精度可能会有一定误差。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值