首页 > 编程知识 正文

单片机超声波测距系统设计,为什么使用超声波测距

时间:2023-05-06 03:16:41 阅读:207903 作者:234

超声波测距模块工作原理

(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; //连接的接口

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。