超声波测距模块(51单片机)

硬件介绍

1.使用场景

超声波测距模块在平时做电子产品、机器人、智能设备中的应用里还是非常常用的,使用非常简单,但是代码的编写和理解其实并不容易,在这里想和大家交流一下。有不同的意见和建议可以给我留言或者私信我。

2. 工作原理

  1. 超声波测距模块是用来测量距离的一种产品,通过发送和就接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。

  2. HC-SR04这个模块是2线制的(不包含电源线),Echo与Trig,Trig负责接收10us以上的触发信号,Echo则是输出距离信号;下面是时序图:
    时序图

(1)采用 IO 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 输出一高电平
(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;

  1. 总的来说就是:
    控制口发一个 10US 以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。
    在这里插入图片描述

  2. 接口定义:
    Vcc、 Trig(控制端)、 Echo(接收端)、 Gnd

  3. 调节最大距离
    在这里插入图片描述
    上图标志电阻即 R3,可以调节最大探测距离。R3 电阻为 392,探测距离最大 4.5M 左右,探测角度小于 15 度;
    R3 电阻为 472,探测距离最大 7M 左右,探测角度小于 30 度;出厂默认 392,即最大探测距离 4.5M 左右。
    R3 电阻大,接收部分增益高,检测距离大,但检测角
    度会相应变大,容易检测到前方旁边的物体。当然,客户在不要求很高的测试距离的条件下,可以改小 R3 来减小探测角度,这时最大测距会减小。

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

讲解代码

重点

代码的核心在于中断。这点很重要,超声波测距模块的重点就是在于中断,
定时器/计数器这部分需要有一定的理解。
初始化的同时打开了定时器,同时内部中断打开并开始计数操作,
待超声波的输入端接收到返回波之后关闭内部中断,
停止计数,接下来通过记到的时间计算被测物的距离(s=time*340/2m)

1、定义引脚

#include<reg52.h>
sbit Trig = P2^0;
sbit Echo = P2^1;

2、定义时间

void Delay10us()
{
 TMOD |= 0x1;
 TH0 = 0xFF;
 TL0 = 0xF6;
 TR0 = 1;
 while(!TF0);
 TF0 = 0;
}
void Rstart()  
{
 Trig=0;
 Trig=1;
 Delay10us();
 Trig=0;
}

3、获取时间和距离

int gettime()
{
 unsigned int time = 0;
 time = TH0*256+TL0// TH0<<8 | TL0;
 return time;
}
float Getdis(unsigned int time)  
{
 float distance;
 distance = (float)time * 0.0017;
 TH0=0;
 TL0=0;·
 return distance;
}
void star()
{
 TH0 = 0;
 TL0 = 0;
 TR0 = 1;
}
void end()
{
 TR0 = 0;
}
void GetOnce()  
{
 Rstart();
 while(!Echo);
 star();
 while(Echo);
 end();
}

4、主函数


 void main()
{
 unsigned int time = 0;
 float dis;
while(1)
 {  
  GetOnce();
  time = gettime();
  dis = Getdis(time);
}

}

5、延时函数

void delay()
{
 int i;
 int j;
 for(i=0;i<100;i++)
  for(j = 0;j<2000;j++);
}

结尾

这就是超声波模块的介绍和代码分析了。
如果想进行更深的使用和了解。可以在我们项目实战专栏里查看更多内容。在哪里有更多的代码注释可以帮助理解,还有项目工程源码可供提取。
我把利用串口打印超声波距离、LCD1602显示屏显示超声波距离等项目实战都放在了那里。

  • 48
    点赞
  • 344
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
以下是HC-SR04超声波测距模块51单片机代码示例: ``` #include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit Trig=P3^5; //定义超声波发射脚 sbit Echo=P3^2; //定义超声波接收脚 void delay_us(uint us) //微秒级延时函数 { while(us--) { _nop_(); _nop_(); _nop_(); _nop_(); } } void delay_ms(uint ms) //毫秒级延时函数 { while(ms--) { delay_us(1000); } } uint HCSR04_Ranging() //超声波测距函数 { uint distance; uint Time; Trig=0; //发射脚先置0 delay_us(2); Trig=1; //发射脚置1 delay_us(10); Trig=0; //发射脚置0 while(!Echo); //等待接收脚为高电平 TR0=1; //开启定时器0 while(Echo); //等待接收脚为低电平 TR0=0; //关闭定时器0 Time=TH0*256+TL0; //计算高电平时间 distance=Time/58; //计算距离,单位为厘米 return distance; } void main() { TMOD=0x01; //定时器0工作在模式1 TH0=0; //定时器0初始值为0 TL0=0; while(1) { uint distance=HCSR04_Ranging(); //调用超声波测距函数,得到距离 //这里可以根据测距结果进行相应的处理 delay_ms(500); //每隔500ms测一次距离 } } ``` 这段代码使用了定时器0来计算超声波接收到的高电平时间,然后根据时间计算出距离。可以根据测距结果进行相应的处理,比如控制LED的亮灭等。需要注意的是,定时器0的时钟频率是12MHz,每个机器周期为1/12MHz=0.083us。在实际应用中,还需要根据具体硬件情况进行调整。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网知识

编写不易,打赏支持一下我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值