一、超声波是什么?
超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,
计算出模块到前方障碍物的距离
二、如何测距
1、怎么让它发送脉冲波?
Trig ,给Trig端口至少10us的高电平
2、怎么知道脉冲波已发送?
Echo信号,由低电平跳转到高电平,表示开始发送波
3、怎么知道接收了返回波?
Echo,由高电平跳转回低电平,表示波回来了
4、怎么算时间?
Echo引脚维持高电平的时间!
波发出去的那一下,开始启动定时器
定时器设置为模式1,使用TH0和TL0这两个移位寄存器来计数,此模式下定时器配置为16位定时器/计数器,由TH0的8位和TL0的8位构成,TH0记录高8位,TL0记录低8位,TL0溢出则向TH0进位,TH0溢出则令TCON中的溢出标志位TF0置1。
波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间
Time = (TH0*256+TL0)*1.085
单位us,计算出TH0和TL0寄存器中保存的计次数,每1个计次为1.085us
5、怎么算距离?
距离 = 速度 (340m/s)* 时间/2 速度单位换算340m/s=34000cm/s=0.034cm/us
代码如下:
#include <reg52.h>
//距离小于10cmD5亮,D6灭,大于10cm反之
sbit D5=P3^7;
sbit D6=P3^6;
sbit Trig =P1^5;
sbit Echo =P1^6;
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void Timeinit()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x00; //让TL,TH寄存器从0开始计次
TH0 = 0x00;
}
void startHC()
{
Trig=0;
Trig=1;
Delay10us();
Trig=0;
}
void main()
{
double Time,dis; //时间、距离
Timeinit();
while(1)
{
//1.Trig,给Trig至少10us的高电平
startHC();
//2.echo由低电转到高电平,表示发波
while(Echo == 0); //Echo还是低电平的话,就一直卡在这
//变成高电平后,开始启动定时器
TR0=1;
//3.由高电平跳转成低电平,则表示波返回了
while(Echo == 1);
TR0 = 0; //停止计时
//4.计算出中间经过多长时间
//单位us,计算出TH0和TL0寄存器中保存的计次数,每1个计次为1.085us
Time = (TH0*256+TL0)*1.085;
//5.计算距离,距离= 速度(340m/s)*时间/2, 340m/s=34000cm/s=0.034cm/us
dis = 0.017 *Time;
if(dis<10)
{
D5=0;
D6=1;
}
else
{
D5=1;
D6=0;
}
//定时器数据清零,以便下一次测距
TL0 = 0x00; //让TL,TH寄存器从0开始计次
TH0 = 0x00;
}
}