超声波测距模块利用声波传播特性实现精准距离测量。其工作原理是:首先发射超声波,当声波遇到障碍物后反射回模块,通过计算声波往返时间差与声速的乘积,即可准确测定模块与前方障碍物之间的距离。
要让设备发送超声波,需在Trig端口施加至少10微秒的高电平信号。如何判断超声波已开始发送?观察Echo信号:当其从低电平跳转为高电平时,表明超声波已开始发射。如何确认接收到返回波?当Echo信号从高电平跳回低电平时,表示超声波已返回。
计算时间的方法如下:测量Echo引脚保持高电平的持续时间。具体操作是:在超声波发射的瞬间启动定时器,在接收到返回波时停止定时器,即可计算出超声波往返所需的时间。
距离计算公式为:距离 = 声速(340米/秒)× 时间 / 2。其中,时间是指超声波往返所需的时间,除以2是因为超声波需要往返一次。

#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;
}
}