超声波测距仪-液晶屏-设计报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

超声波测距仪设计报告一、设计要求1、提供2cm—400cm的非接触式距离测量功能,测距精度达到3mm。2、测量结果通过液晶屏实时显示。3、具有温度补偿功能。二、超声波测距原理测量距离的方法有很多种,短距离的可以用米尺,远距离的有激光测距等,超声波测距适用于高精度的中长距离测量。因为超声波在标准空气中的传播速度为331.45米/秒,由单片机负责计时,系统的测量精度理论上可以达到毫米级。超声波测距的原理一般采用渡越时间法TOF(timeofflight),也可以称为回波探测法,如图1所示。超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在介质中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。根据传声介质的不同,可分为液介式、气介式和固介式三种。根据所用探头的工作方式,又可分为自发自收单探头方式和一发一收双探头方式。而倒车雷达一般是装在车尾,超声波在空气中传播,超声波在空气中(20℃)的传播速度为340m/s(实际速度为344m/s这里取整数),根据计时器记录的时间就可以计算出发射点距障碍物的距离,公式2/*340tS=。图1超声波测距原理由于超声波也是一种声波,其声速c与温度有关,表1列出了几种不同温度下的声速。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。表1声速与温度的关系温度(℃)-30-20-100102030100声速(m/s)313319325323338344349386三、硬件系统设计1、设计框图本研究设计的超声波测距仪框图如图1所示。HC-SR04超声波收发模块触发电路中断接收计算距离模拟电压信号LCD距离显示STC89C52单片机图2超声波测距仪方框图2、HC-SR04超声波收发模块该超声波收发模块可自己产生40kHz的方波,并经放大电路驱动超声波发射探头发射超声波,发射出去的超声波经障碍物反射后由超声波接收探头接收。经接收电路的检波放大,积分整形,在ECHO引脚上产生方波脉冲,该脉冲宽度与被测距离成线性关系。具体过程如图3所示。图3HC-SR04超声波收发模块工作时序图使用HC-SR04超声波收发模块进行距离测量测量时,单片机只需要输出触发信号,并监视回响引脚,通过定时器计算回响信号宽度,并换算成距离即可。该模块简化了发送和接收的模拟电路,工作稳定可靠,其参数指标如表2所示。表2HC-SR04模块电气参数应注意测量周期必须在60毫秒以上,防止发射信号对回响信号的影响。图4HC-SR04超声波模块外形图3、单片机电路本设计选用宏晶公司高性能单片机STC89C52,其管脚如图5所示。图5STC89C52单片机管脚图该芯片为52内核8位单片机,兼容Intel等52内核单片机,支持ISP下载,适用于常用检测控制电路。由STC89C52组成的单片机系统原理图如图6所示。图中TRIG引脚为单片机发送触发信号的引脚,ECHO引脚为HC-SR04模块送回回响信号的引脚,接至单片机外部中断P3.2脚上,可以利用外部中断测量回响信号宽度。DS18B20引脚外接单总线数字温度传感器DS18B20,当需要温度补偿时选用。L2发光管保留给用户定义,实现用户功能。图6单片机系统原理图4、显示电路显示部分采用SMC1602液晶屏进行数据显示,其主要技术参数为:表3液晶屏技术指标接口信号说明如表4所示。表4液晶屏接口信号说明与单片机接口电路如图7所示。图7LCD与单片机接口电路5、温度测量电路(可选)通过DS18B20测量环境温度,即可通过表1所示的温度声速对所测量数据进行补偿,其电路如图8所示。图8DS18B20温度测量电路6、供电及程序下载电路本设计采用USB接口供电,电源电压5V。同时,USB接口通过内含PL2303芯片的转换电路对单片机进行程序编写。其电路原理如图9所示。图9供电及程序下载电路四、软件编程1、软件流程图本设计软件主程序流程图如图10所示,(a)为主程序流程图,(b)为定时中断子程序流程图,(c)为外部中断子程序流程图。(a)主程序流程图(b)外部中断流程图图10程序流程图2、主程序下面介绍main.c主程序编写,其他程序略。(1)头文件和一些宏定义/*******************************************************************//*******************超声波测距仪************************************//*******************(液晶屏显示)************************************//*******************晶振11.0592MHz********************************/#includereg52.h#include1602.htypedefunsignedcharU8;/*definedforunsigned8-bitsintegervariable无符号8位整型*/typedefsignedcharS8;/*definedforsigned8-bitsintegervariable有符号8位整型*/typedefunsignedintU16;/*definedforunsigned16-bitsintegervariable无符号16位整型*/typedefsignedintS16;/*definedforsigned16-bitsintegervariable有符号16位整型*/typedefunsignedlongU32;/*definedforunsigned32-bitsintegervariable无符号32位整型*/typedefsignedlongS32;/*definedforsigned32-bitsintegervariable有符号32位整型*/typedeffloatF32;/*singleprecisionfloatingpointvariable(32bits)单精度浮点数32位长度*/typedefdoubleF64;/*doubleprecisionfloatingpointvariable(64bits)双精度浮点数64位*///定时器0的定时值为1mS,即11059/12=922个时钟脉冲,其补为65536-922=64614#defineSYSTEMCLK921600//11059200/12#defineT0CLK921600//11059200/12#defineT1CLK921600//11059200/12#defineT1PERIOD1000000/921600//T1周期时间,以微秒为单位,约为1.085uS#defineTIMER0H0xFC//64614/256=252#defineTIMER0L0x66//54447%256=102(2)管脚、常量、变量定义和函数声明//管脚定义sbitTrig=P1^3;sbitEcho=P3^2;//回波必须接在外部中断引脚上//定义标志volatilebitFlagSucceed=0;//测量成功标志volatilebitFlagDisplay=0;//显示标志//定义全局变量U16DisplayCount=0;U16time=0;U32distance=0;//函数声明voiddelay_20us();voidStart_Module();voidINT0_Init(void);voidData_Init();voidTimer0_Init();voidTimer1_Init();(3)各子程序//20us延时程序,不一定很准voiddelay_20us(){U16bt;for(bt=0;bt100;bt++);//8M晶振是100}//数据初始化voidData_Init(){Trig=0;distance=0;DisplayCount=0;}//外部中断初始化函数voidINT0_Init(void){IT0=0;//负边沿触发中断EX0=0;//关闭外部中断}//外部中断处理用做判断回波电平voidINT0_ISR(void)interrupt0{time=TH1*256+TL1;//取出定时器的值FlagSucceed=1;//置成功测量的标志EX0=0;//关闭外部中断}//定时器0初始化,16位定时模式,初始化为1ms中断一次。voidTimer0_Init(){TMOD=0x11;//定时器0和1工作在16位方式TH0=TIMER0H;TL0=TIMER0L;TR0=1;//启动定时器ET0=1;//允许定时器0中断}//定时器0中断,用做显示计时voidTimer0_ISR(void)interrupt1//定时器0中断是1号{TH0=TIMER0H;TL0=TIMER0L;DisplayCount++;if(DisplayCount=1000)//1秒钟显示一次{FlagDisplay=1;DisplayCount=0;}}//定时器1初始化,16位计数模式,时钟为11059200/12=921600Hz//60ms计数为55296,即0xD800voidTimer1_Init(){TMOD=0x11;//定时器0和1工作在16位方式TH1=0;TL1=0;ET1=1;}//启动模块,Trig管脚20us正脉冲voidStart_Module()//启动模块{Trig=1;//启动一次模块delay_20us();Trig=0;}/*********************************************************************名称:Main()*功能:主函数***********************************************************************/voidmain(){U16i,j;EA=0;INT0_Init();Timer0_Init();//定时器0初始化Timer1_Init();//定时器1初始化Data_Init();EA=1;L1602_init();L1602_string(1,1,Welcometomy);L1602_string(2,1,distancemeter!);//延时for(i=0;i1000;i++)for(j=0;j1000;j++){;}while(1){EA=0;//以下为一次检测过程:先发出Trig电平,打开外部中断,清零T1,//最后在外部中断下降沿触发时取出T1当前值,计算出Trig脉冲宽度。Start_Module();while(Echo==0);//等待Echo回波引脚变高电平FlagSucceed=0;EX0=1;TH1=0;TL1=0;TF1=0;TR1=1;//启动定时器1开始计数EA=1;while(TH180);//盲区TR1=0;//关闭定时器1EX0=0;//关闭外部中断if(FlagSucceed==1)//一次测试成功,则计算距离,单位为厘米{distance=time*1.085;//计算得到脉冲时间(以微秒为单位)//将微秒时间转变成厘米距离的算法:Y米=(X秒*344)/2//X秒=(2*Y米)/344==》X秒=0.0058*Y米==》厘米=微秒/58distance/=58;}if(FlagDisplay==1)//1秒显示时间到{if(FlagSucceed==0){//LCD提示无回波L1602_string(1,1,OutOfRange(0-4m));L1602_string(2,1,------);}else{//LCD显示数据L1602_string(1,1,DistanceResult:);L1602_string(2,1,cm);L1602_int(2,5,distance);}FlagDisp

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功