(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 都置位1TH2 =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]={' '};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:%fcmrn",dis);//输出结果Stringsend(buf);定义全局变量
sbit Trig = P1^0;
sbit Echo = P1^1; //连接的接口