超声波测距模块工作原理
(1)采用IO口TRIG触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
(4)本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,即可以达到你移动测量的值
Trig负责接收10us以上的触发信号,Echo则是输出距离信号
本模块性能稳定,测度距离精确,模块高精度,盲区小
产品应用领域: 机器人避障 物体测距 液位检测 公共安防 停车场检测 。
模块测距的操作步骤:

编程原理
首先要对串口进行初始化,超声波模块必须要用到115200波特率的串口初始化
void InitUar_115200()
{
SCON = 0x50; //数据位8位,停止位1位,起始位1位怎么配!都要根据芯片手册来写 ,使能接收
T2CON = 0x34;// |=0x1 << 5 | 0x1 << 4; //RCLK TCLK 都置位1
TH2 =0xFF;
TL2 =0xFD;
RCAP2H=0xFF;
RCAP2L=0xFD;
TR2=1; //启动定时器,让定时器工作,数节拍!
ES = 1;
EA = 1;
}
接着是对超声波模块进行初始化,让超声波开始工作,给超声波10us的高电平,超声波初始化包括计时器功能。要给超声波脉冲,首先给它一个低电平,再给他连续的10us的高电平,再拉低。
void delay10us()
{
TMOD |= 0x1;
TH0 = 0xff;
TL0 = 0xf6;
TR0 = 1;
while(TF0 != 1); /等待溢出
TF0 = 0; //溢出后让它重新置0
}
void Init_CSB()
{
Trig = 0;
Trig = 1;
delay10us();
Trig = 0;
}
超声波接口Trig进行了10us的脉冲之后,会去检测接口Echo的值,Echo的值置为高电平后,开始计时,Echo=1置为低电平后返回,发出值,结束计时:
void Star_time()
{
TH0 = 0;
TL0 = 0; //让计时器从0开始数数
TR0 = 1; //开始计时
}
void Stop_time() //结束计时
{
TR0 = 0;
}
int Get_time() //获取波的时间
{
unsigned int time;
time = TH0 << 8 | TL0; //次数一次的时间 us或 TH0256+TL0 跳动的次数(跳动一次的时间是10us)
return time;
}
float Get_distance() //获取距离
{
float distance;
distance =(float)time * 0.017; //340/2 * 100/1000000
return distance;
}
主函数如下:
int main()
{
unsigned int time;
float dis;
char buf[24]={'\0'};
InitUar_115200();
while(1)
{
Init_CSB();
while(Echo != 1); //波出去,echo1,退出循环,并开始计时
Star_time();
while(Echo != 0); //波回来,echo0,退出循环,并结束计时
Stop_time();
time = Get_time(); //获取波的时间
dis=Get_distance(); //计算距离
sprintf(buf,"distance:%fcm\r\n",dis); //输出结果
Stringsend(buf);
定义全局变量
sbit Trig = P1^0;
sbit Echo = P1^1; //连接的接口
本文介绍了超声波测距模块的工作原理,包括触发测距的IO口操作,自动发送与检测信号的过程,以及如何计算测试距离。模块具有高精度和小盲区,适用于多种应用场景如机器人避障、物体测距等。编程原理部分提到需对串口进行115200波特率初始化,并通过给Trig口发送10us高电平使模块开始工作,通过Echo口的高电平时间计算距离。
4658

被折叠的 条评论
为什么被折叠?



