一、原理分析
超声波测距是一种常见的测距方法,其原理是利用超声波在空气中传播的速度恒定且较快的特性,通过发送超声波信号并接收回波,计算出物体与传感器之间的距离。以下是超声波测距的原理和应用:
原理:
- 发送超声波信号:超声波传感器发送一个短脉冲的超声波信号。
- 接收回波:超声波信号遇到物体后会被反射回来,传感器接收到回波信号。
- 计算时间差:通过测量发送超声波和接收回波之间的时间差,可以计算出超声波在空气中传播的时间。
- 计算距离:利用声波在空气中的传播速度(约为340m/s),将时间差转换为距离,即距离 = 速度 x 时间差。
应用:
- 测距应用:超声波测距广泛应用于机器人导航、智能车辆、无人机等领域,用于测量物体与传感器之间的距离,实现避障、定位等功能。
- 液位检测:超声波传感器可以用于检测液体的液位高度,常见于水箱、油箱等液位监测系统中。
- 智能家居:超声波传感器可以用于智能家居系统中,如智能灯光控制、智能门窗感应等。
- 工业自动化:在工业自动化领域,超声波传感器常用于测量物体的距禋、检测物体的存在等。
注意事项:
超声波模块的TX引脚接到单片机的P1.0端口,RX引脚接到单片机的P1.1端口,注意按照上图连接好。
二、思维导图
三、示例框架
#include "intrins.h"
#include "stc15.h"
#include "smg.h"
sbit TX = P1^0;
sbit RX = P1^1;
extern unsigned int dat_f;
void Delay12us() //@12.000MHz 延时12us
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
void Send_Wave() //产生8个40KHx超声波信号
{
unsigned char i;
for(i = 0; i < 8; i++)
{
TX = 1; //将 TX 端口置为高电平,表示开始发送超声波信号。
Delay12us(); //调用延时函数 Delay12us(),延时12微秒。
TX = 0; //将 TX 端口置为低电平,表示停止发送超声波信号。
Delay12us();
}
}
void Measure_Distance() //超声波测距
{
unsigned int time = 0; //定义了一个无符号整型变量 time,用于存储测量到的时间。
//将 TMOD 寄存器的高四位清零,保留低四位不变。这样可以确保只修改定时器1的工作模式,而不影响其他位。
TMOD &= 0x0f; //定时器1模式0,13位定时器,最大8192个计数脉冲
TL1 = 0x00;
TH1 = 0x00;
Send_Wave(); //发送超声波信号
TR1 = 1; //启动定时器1
while((RX == 1) && (TF1 == 0)); //在循环中等待接收到超声波信号的回波且没有超出测量范围。
//TF1 是一个标识符,用于表示定时器1的溢出标志
TR1 = 0; //停止定时器
if(TF1 == 0) //正常测量范围
{
time = TH1; //将定时器1的值 TH1 读取到 time 变量中。
time = (time << 8) | TL1; //将定时器1的值 TL1 读取并与 TH1 合并,得到完整的时间值。
dat_f = ((time / 10) * 17) / 100 + 3; //根据计算公式将测量到的时间转换为距离,并存储在 dat_f 变量中。
}
else //超出测量范围
{
TF1 = 0;
dat_f = 999;
}
}
-
unsigned int dat_f;
:定义一个无符号整型变量dat_f
,用于存储测量到的距离。 -
void Delay12us()
:定义一个延时函数,用于实现12微秒的延时。 -
void Send_Wave()
:定义一个函数,用于产生8个40KHz的超声波信号。在循环中,先将 TX 端口置为高电平,然后调用Delay12us()
函数实现延时,再将 TX 端口置为低电平,再次调用Delay12us()
函数实现延时。 -
void Measure_Distance()
:定义一个超声波测距函数。在函数中:- 清零定时器1的模式位,设置为模式0,13位,最大8192个计数脉冲。
- 将定时器1的低8位寄存器 TL1 和高8位寄存器 TH1 初始化为0。
- 调用
Send_Wave()
函数发送超声波信号。 - 启动定时器1。
- 在 while 循环中,等待接收到超声波信号的回波或者超出测量范围。
- 停止定时器1。
- 如果测量在正常范围内,将定时器1的值读取到
time
变量中,然后根据一定的计算公式将测量到的时间转换为距离,并存储在dat_f
变量中。 - 如果超出测量范围,将
dat_f
设为999。