前言
超声波在气体、液体及固体中以不同速度传播,定向性好、能量集中、传输过程中衰减较小、反射能力较强。 超声波能以一定速度定向传播、遇障碍物后形成反射,利用这一特性,通过测定超声波往返所用时间就可计算出实际距离,从而实现无接触测量物体距离。 超声波测距迅速、方便,且不受光线等因素影响
目录
一、超声波测距应用广泛
二、超声波测距模块硬件介绍
三、主要思路
四、代码
一、超声波测距应用广泛
二、超声波测距模块硬件介绍
![](https://img-blog.csdnimg.cn/direct/3297322e46ab47ddbb3691b3ea55f780.jpeg)
Trig:针对这个模块来说Trig脚是输入,而我们在单片机上需要在这个引脚中输出一个10us以上的高电平,可触发模块测距,这时候就会驱动这个超声波模块发出声波。
Echo: 针对这个模块Echo是输出,接下来它会自动接收超声波,并且接收完后在Echo这个输出脚上输出一段高电平,当测距结束时,此管脚会输出一个高电平,电平宽度为超 声波往返时间之和。这个高电平的时间就是声波发出并且反射回来所用的时间,所以我们在单片机中就需要读取这个引脚。
三、主要思路
了解了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接口接收到反射回来的超声波信号,当接收到信号时开始计时,直到信号消失停止计时。最后根据计时时间和声速计算出距离值。需要注意的是,由于声速受温度等因素影响,因此实际测距精度可能会有一定误差。