基于温度补偿的超声波测距设计_第1页
基于温度补偿的超声波测距设计_第2页
基于温度补偿的超声波测距设计_第3页
基于温度补偿的超声波测距设计_第4页
基于温度补偿的超声波测距设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录TOC\o"1-3"\h\u58501绪论2200521.1设计目的 221041.2设计意义 2124241.3系统功能 343052设计方案447952.1方案设计 4228772.2方案论证 4169673硬件设计5110803.1设计方案 5139463.2STC89C52外围电路设计 6281443.2.1单片机 6310703.2.2复位电路与震荡电路 7191553.3LCD显示模块的设计 881053.3.1字符型液晶显示模块 862013.3.2字符型液晶显示模块引脚 844213.3.3字符型液晶显示模块内部结构 9261393.4温度传感器DS18B20电路设计 10120543.4.1温度传感器DS18B20简介 10100743.4.2DS18B20的主要特性 1120233.5数据采集模块 123773.6HC-SR04超声波测距模块 1375653.7报警电路设计 15244524软件设计1712724.1系统软件设计说明 1722444.2主程序的设计 17159594.3超声波发射子程序和超声波接收中断子程序设计 18170024.4温度测量子程序设计 18206655结果与结论21315915.1结果 21192015.2结论 2115350致谢 227610参考文献 237862附录 241绪论1.1设计目的随着国民经济的迅速开展,超声波在机械制造、石油化工、航空航天等领域发挥着越来越重要的作用。超声波测距作为一种非接触式距离测量方法,具有不受外界光及电磁场等因素影响的优点,实现电路简单、本钱低;同时,还具有易于定向发射、方向性好、对人体伤害小等特点。上述优势使得与超声波测距领域相关的仪器设备在数据处理、检测性能和工程设计系统化等方面有了更大的开展空间。利用超声波定位技术是蝙蝠等一些无目视能力的生物作为防御天敌及捕获猎物的生存手段,这些生物体可发射人们听不到的超声波(20KH以上的机械波),借助空气介质传播,根据猎物或障碍物反射回来的回波的时间间隔及强弱,判断猎物的性质或障碍物的位置。在影响超声波测距误差的因素中,温度的影响是比拟大的,超声波的传播速度在不同的温度下是不同的,那就要得出其传播速度与环境温度t的关系式。因此用常温下的超声波速度341m/s来计算不同温度环境下的超声波测距的距离是有很大误差的。为了提高测距精度,我们必须对超声波的速度进行温度补偿,用温度传感器测环境温度的数值,从而得到改环境下的超声波速度1.2设计意义随着社会经济的快速开展,人们生活水平的不断提高,交通运输业的日益兴旺,汽车数量的越来越多。交通拥挤的状况也日趋严重,撞车事件也经常的发生,造成了很严重的人员伤亡和财产损失,针对这一情况,设计一种响应快,可靠性高且较为经济的汽车防撞报警系统事在必行,最常见的一种测量距离的方法是超声波测距,应用于汽车的近距离防撞。还有城市的快速开展,排水系统往往落后于城市建设,经常出现已经建设好建筑设施再重新开挖排水设施的情况,这样经常会造成城市污水的到处排放,影响城市卫生,针对这一情况,设计污水疏通移动机器人的自动控制系统是非常必要的,而这个自动控制系统核心就是超声波测距。以上举得只是超声波应用领域中的一小局部的例子,当今生活中还有很多方面需要用到超声波测距,来解决人们日常生活中遇到的问题,因此设计一款超声波测距仪是非常重要的一件事。1.3系统功能超声波测距仪的设计要求如下:1)测量范围小于等于5米2)测量误差小于0.3cm3)进行温度补偿4)以LCD显示温度和距离2设计方案2.1方案设计利用超声波检测距离,设计比拟方便,计算处理也较简单,其测量精度也能到达使用要求。超声波发生器可以分为两大类:一类是用机械方式产生超声波,一类是用电气方式产生超声波。电气方式包括压电型、电动型等;机械方式有加尔统笛、液哨和气流旋笛等。目前在近距离测量方面常用的是压电式超声波换能器。根据设计要求并综合各方面因素,本设计采用AT89C51单片机作为控制器,用动态扫描法实现LCD数字显示,超声波驱动信号用单片机的定时器。单片机发出40kHz的信号经放大后通过超声波发射器输出;超声波接收器将接收到的超声波信号经放大器放大,用锁相环电路进行检波处理后,启动单片机中断程序,测得时间为t,再由软件进行判别、计算,得出距离数并送LCD显示。2.2方案论证方案一:基于单片机的超声波测距方案,基于单片机的超声波测距是以单片机编程产生40KHZ的频率,经过发射驱动放大,使发射端发射超声波,经被测物反射回来,通过反射电路,放大,整形,处理,测出距离。方案二:基于CPLD的超声波测距系统。基于CPLD的超声波测距系统采用CPLD器件控制超声波的发射与接收,从而计算出测量的距离,其运用VHDL编写程序,并且配合MAX-plusⅡ进行软硬件的仿真与调试。利用CPLD具有性能高、本钱低的特点,但是单片机能够准确计时,测距精度高,而且单片机控制方便,计算简单,所以综合更方面因素本文采用STC89C52单片机作为控制器,用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器。3硬件设计3.1设计方案本文介绍了一种采用脉冲回波方式,基于STC89C52单片机的超声波测距系统。该系统充分利用单片机的硬件和软件资源,自动实现超声波的发射与接收控制。该系统充分考虑了环境温度对超声波传播速度的影响,通过单片机中计数器所计超声波往返所经历的时间,通过公式换算就可以计算出超声波发射器与被测物之间的距离。其主要包括单片机控制模块,超声波发射模块,超声波接收模块,LCD1602显示模块,温度补偿模块,报警模块,和扫描驱动模块这几个局部。其可以实现非接触测量物体的距离,并通过LCD1602液晶显示出来,当距离小于1M时实现报警。图3.1超声波测距仪总设计框图3.2STC89C52外围电路设计单片机STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。外形及引脚排列如图3.2所示。钟电路引脚、I/O引脚、控制线引脚。根据开发的需要和单片机的结构,我们就可以图3.2STC89C52的芯片引脚图STC89C52共有40个引脚,大致可分为4类:电源引脚、时实现单片机的自开工作,即实现自动化!3.2.2复位电路与震荡电路单片机STC89C52作为主控芯片,控制整个电路的运行。其需要一个复位电路,复位电路的功能是:系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号。复位电路的设计图如图3.3所示。图3.3复位电路图STC89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为该反向放大器的输入端和输出端。这个反向放大器与作为反应元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。外接12M振荡器及电容C1、C2接在放大器的反应回路中构成并联振荡电路。由于外接电容容量的大小会轻微影响振荡频率的上下、振荡器工作的稳定性、起振的难易程度及温度稳定性因此电容选择30pF10pF。图3.4振荡电路图3.3LCD显示模块的设计字符型液晶显示模块图3.5液晶面板字符型液晶显示模块是一类专门用于显示字母,数字,符号等的点阵式液晶显示模块。在显示器件上的电极图型设计,它是由假设干个5*7或5*11等点阵符位组成。每一个点阵字符位都可以显示一个字符。点阵字符位之间有一空点距的间隔起到了字符间距和行距的作用,模块见图3.5。3.3.2字符型液晶显示模块引脚VSS为地电源,VDD接5V正电源,VL为液晶显示器比照度调整端,接正电源时比照度最弱,接地电源时比照度最高,比照度过高时会产生“鬼影〞,使用时可以通过一个10K的电位器调整比照度。RS为存放器选择,高电平时选择数据存放器、低电平时选择指令存放器。RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。DB0~DB7为8位双向数据线,BLK和BLA是背光灯电源。模块引脚如表3.1。表3.1字符型液晶显示模块引脚编号符号引脚说明编号符号引脚说明1VSS电源地9D2DataI/O2VDD电源正极10D3DataI/O3VL液晶显示偏压信号11D4DataI/O4RS数据/命令12D5DataI/O5R/W读/写13D6DataI/O6E使能信号14D7DataI/O7D0DataI/O45BLA背光源正级8D1DataI/O16BLK背光源负级3.3.3字符型液晶显示模块内部结构液晶显示模块WM-C1602N的内部结构如图3.6分为三部份:一为LCD控制器,二为LCD驱动器,三为LCD显示装置。与单片机接口见图3.6图3.6LCD1602内部结构图3.7液晶接口3.4温度传感器DS18B20电路设计3.4.1温度传感器DS18B20简介DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信(每个温度传感器的ROM里有不同的识别号码〕,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使DS18B20非常适用于远距离多点温度检测系统。DS18B20内部结构如图3.8所示,主要由4局部组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置存放器。DS18B20的管脚排列如图3.9所示,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端。ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同,ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。图3.8DS18B20内部结构图图3.9DS18B20管脚图3.4.2DS18B20的主要特性〔1〕适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电。〔2〕独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。〔3〕DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。〔4〕DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。〔5〕温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。〔6〕可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。〔7〕在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。〔8〕测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。〔9〕负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时温度存放器的值将加1,计数器1的预置将重新被装入,重新开始对低温度系数晶振产生的脉冲信号进行计数。如此循环直到计数器2计数到0时,停止温度存放器值的累加,此时温度存放器中的数值即为所测温度。图3.10中的斜率累加器用于补偿和修正测温过程中振荡器温度特性的非线性,以产生高分辨率的温度测量。其输出用于修正计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度存放器值到达被测温度值,这就是DS18B20的测温原理。图3.10DS18B20测温原理图另外,由于DS18B20单总线通信功能是分时完成的,因此他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。3.5数据采集模块DS18B20有4个主要的数据部件:A:64位激光ROM。64位激光ROM从高位到低位依次为8位CRC、48位序列号和8位家族代码(28H)组成。B:温度灵敏元件。C:非易失性温度报警触发器TH和TL。可通过软件写入用户报警上下限值。D:配置存放器。配置存放器为高速暂存存储器中的第五个字节。其中R0、R1:温度计分辨率设置位,其对应四种分辨率如下表所列,出厂时R0、R1置为缺省值:R0=1,R1=1〔即12位分辨率〕,用户可根据需要改写配置存放器以获得适宜的分辨率。表3.2分辨率关系表R0R1分辨率/bit最大转换时间/us00993.750110187.510113751112750高速暂存存储器由9个字节组成,其分配如表3.2所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表3.3所示。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。表3.3DS18B20存储器温度LSB温度MSBTHTL保存保存计数存放器计数存放器8位CRC3.6HC-SR04超声波测距模块1.概述HC-SR04超声波测距模块可实现2cm~4.5m的非接触测距功能,拥有2.4~5.5V的宽电压输入范围,静态功耗低于2mA,自带温度传感器对测距结果进行校正,同时具有GPIO,串口等多种通信方式,内带看门狗,工作稳定可靠。主要技术参数如下表:表3.4主要技术参数电气参数HC-SR04超声波测距模块工作电压DC2.4V~5.5V静态电流2mA工作温度-20~+70度输出方式电平或UART〔跳线帽选择〕感应角度小于15度探测距离2cm-450cm探测精度0.3cm+1%UART模式下串口配置波特率9600,起始位1位,停止位1位,数据位8位,无奇偶校验,无流控制。本模块实物图及尺寸如图3.10所示图3.10HC-SR04正反面图本模块的尺寸:45mm*20mm*1.6mm。板上有两个半径为1mm的机械孔2.电平触发测距工作原理在模块上电前,首先去掉模式选择跳线上的跳线帽,使模块处于电平触发模式。电平触发测距的时序如图3.11所示:图3.11HC-SR04测距时序图图3.11说明:只需要在Trig/TX管脚输入一个10US以上的高电平,系统便可发出8个40KHZ的超声波脉冲,然后检测回波信号。当检测到回波信号后,模块将距离值转化为340m/s时的时间值的2倍,通过Echo端输出一高电平,可根据此高电平的持续时间来计算距离值。即距离值为:(高电平时间*340m/s)/2。3.串口触发测距工作原理在模块上电前,首先插上模式选择跳线上的跳线帽,使模块处于串口触发模式。在此模式下只需要在Trig/TX管脚输入0X55〔波特率9600〕,系统便可发出8个40KHZ的超声波脉冲,然后检测回波信号。当检测到回波信号后,模块还要进行温度值的测量,然后根据当前温度对测距结果进行校正,将校正后的结果通过Echo/RX管脚输出。输出的距离值共两个字节,第一个字节是距离的高8位〔HDate〕,第二个字节为距离的低8位〔LData〕,单位为毫米。即距离值为〔HData*256+LData〕mm。4.串口触发测温工作原理在模块上电前,首先插上模式选择跳线上的跳线帽,使模块处于串口触发模式。在此模式下只需要在Trig/TX管脚输入0X50〔波特率9600〕,系统便启动温度传感器对当前温度进行测量,然后将温度值通过Echo/RX管脚输出。测量完成温度后,本模块会返回一个字节的温度值〔TData〕,实际的温度值为TData-45。例如通过TX发送完0X50后,在RX端收到0X45,那么此时的温度值为[69〔0X45的10进制值〕-45]=24度。3.7报警电路设计如果距离小于1M,那么单片机STC89C52那么给P3.7口一个信号,使得报警电路工作,实现报警。如图3.11所示。图3.11报警电路图4软件设计4.1系统软件设计说明进行测量控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个测量对象的实际需要设计应用程序。因此,软件设计在微机测量控制系统设计中占重要地位。本软件设计主要是对距离进行测量、显示。因此,整个软件可分为按照硬件电路对单片机位定义;发射子程序;接收子程序;显示子程序;延时子程序等。4.2主程序的设计图4.1主程序流程图主程序首先是对系统环境初始化,设置定时器T0工作模式为16位定时计数器模式。置位总中断允许位EA并给显示端口P1和P3清0。然后调用超声波发生子程序送出一个超声波脉冲,为了防止超声波从发射器直接传送到接收器引起的直射波触发,需要延时约0.1ms后,才翻开外中断0接收返回的超声波信号。由于采用的是12MHz的晶振,计数器每计一个数就是1μs,当主程序检测到接收成功的标志位后,将计数器T0中的数〔即超声波来回所用的时间〕按式计L=(△T/2)*V算,即可得被测物体与测距仪之间的距离,设计时取20℃时的声速为344m/s那么有:L=(△T/2)*V=172T0/10000cm

其中,T0为计数器T0的计算值。

测出距离后结果将以十进制BCD码方式送往LCD显示约0.5s,然后再发超声波脉冲重复测量过程。4.3超声波发射子程序和超声波接收中断子程序设计超声波测距仪主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号〔即INT0引脚出现低电平〕,立即进入中断程序。进入中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测到超声波返回信号,那么定时器T0溢出中断将中断0关闭,并将测距成功标志字赋值2以表示此次测距不成功。图4.2外部中断流程图4.4温度测量子程序设计DS18B20对时序和电性参数要求很高,所以单片机在通过单总线接口访问DS18B20时,其工作流程必需要遵守严格的操作时序,如果顺序中任意一步缺少或顺序错乱,DS18B20将不会响应。DS18B20的操作顺序是:第一步:对DS18B20初始化;第二步:发送ROM命令;第三步:发送功能命令。超声波测距系统上电后,单片机开始初始化DS18B20,检测现场温度,软件控制DS18B20的具体流程如图4.3所示。图4.3DS18B20总体操作流程4.5报警子程序如果距离小于下限或大于上限,那么单片机STC89C52那么给IO口一个信号,使得报警电路工作,实现报警。图4.4报警子程序4.6距离计算子程序本段程序中temp是从DS18BB0读取的16位二进制温度数值,在对速度进行温度补偿的时候需要根据DS18B20协议转换成浮点数tp。voidcalculater(){floatv;//声速floattp;//温度time=TH0*256+TL0;TH0=0;TL0=0;if(temp<0x8000)//温度为正直tp=temp*0.0625;else//温度为负值tp=temp*(-0.0625);c=331.4+0.61*tp;//温度补偿distance=(time*c/(2*100))/100;}5结果与结论5.1结果设计的最终结果是使超声波测距仪能够产生超声波,实现超声波的发送与接收,从而实现利用超声波方法测量物体间的距离,以数字的形式显示测量距离。经过实验说明,这套系统软硬件设计合理、抗干扰能力较好、实时性良好,实验结果比拟符合预期要求。5.2结论采用高精度的温度传感器DS18B20可实现对超声波测距系统的温度测量和补偿,即根据经验公式,对波速进行校正。通过引入DS18B20,使超声波测距系统的测量精度有了很大的提高,使得应用领域也有所扩展,其不仅可用于倒车雷达、物位测量等一般场合,且在移动机器人领域将会有广泛的应用前景。致谢随着论文的完成,我的大学生活,也得以划下了完美的句点。经过几个月的查找资料、整理材料、设计方案和写论文,今天终于可以顺利的完成论文的最后的谢辞了。设计得以完成,要感谢的人实在太多了,在本次毕业设计的过程中非常感谢周荣生老师的细心指导。导师渊博的专业知识,严谨的治学态度,精益求精的工作作风,对我影响深远,不仅使我树立了远大的学术目标、掌握了根本的研究方法,还使我明白了许多待人接物与为人处世的道理。本论文从选题到完成,每一步都是在周老师的指导下完成的,倾注了大量的心血。在此,谨向赵老师表示崇高的敬意和衷心的感谢!赵老师要指导很多同学的设计,加上本来就有的教学任务,工作量之大可想而知,但在一次次的教导中,使我在设计之外明白了做学问所应有的态度。同时,设计的顺利完成,离不开其它各位老师、同学和朋友的关心和帮助,感谢徐静、胡燕同学给予我的帮助。在整个的设计中,各位老师、同学和朋友积极的帮助我查资料,提供有利于论文写作的建议和意见,在他们的帮助下,设计得以不断的完善,最终帮助我顺利的写完论文。通过此次的设计,我学到了很多知识,在设计过程中,通过查资料和搜集有关的文献,培养了自学能力和动手能力,由被动的接受知识转换为主动的寻求知识,这是学习方法上的一个很大的突破。通过毕业设计,我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好的处理知识和实践相结合的问题。最后再一次感谢所有在毕业设计中曾经帮助过我的良师益友和同学,以及在设计中被我引用或参考的论著的作者。参考文献[1]赵晓安.MCS-51单片机原理及应用.天津:天津大学出版社,2001.3[2]夏继强.单片机实验与实践教程.北京:北京航空航天大学出版社,2001[3]余锡存、曹国华,单片机原理及接口技术,陕西:西安电子科技大学出版社,2002.8[4]李建忠,单片机原理及应用,陕西:西安电子科技大学出版社,2004.1[5]肖来胜、冯建兰,单片机技术实用教程,武汉:华中科技大学出版社,2004.10[6]蔡美琴、张为民,MSC-51系列单片机系统及其应用,北京:高等教育出版社〔第二版〕,北京,2005.7v[7]李华.MCS-51系列单片机实用接口技术[M].北京:北京航空航天大学出版社,1993[8]周航慈.单片机应用程序设计技术[M].北京:北京航空航天大学出版社,1991附录附录一:总原理图附录二:程序清单#include<reg52.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedchartypedefunsignedcharUchar;typedefunsignedintUint16;#defineyh0x80//LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1〔100000000=80〕#defineer0x80+0x40//LCD第二行初始位置〔因为第二行第一个字符位置地址是0x40〕//液晶屏的与C51之间的引脚连接定义〔显示数据线接C51的P0口〕sbiten=P1^0;sbitrs=P1^1;sbitDQ_A=P3^7;//温度数据线//校时按键与C51的引脚连接定义sbitqh=P2^0; //切换键sbitset=P2^1; //设置键sbitadd=P2^2; //加键sbitdec=P2^3; //减键sbitalarm=P2^7; //蜂鸣器,通过三极管9012驱动,端口低电平响sbitred=P2^4;sbitgreen=P2^6;sbitRX=P3^3;sbitTX=P3^2;ucharcodetab1[]={"Systemloading"};ucharcodetab2[]={"Distancesystem"}; ucharcodewd[]={"Temp:"};ucharcodejl[] ={"Dis:CM"};ucharcodeyz[] ={"SH:CMSL:CM"};//阈值固定符ucharcodeqk[]={""}; uinttempa,temp;//tempa用于读取温度值intsh=400,sl=2;uinttime;unsignedlongdis;floatrate;ucharflag_qh,key_num;bitflag_set=0,flag=0;//延时函数,后面经常调用voiddelayms(uintxms)//延时函数,有参函数{ uintx,y; for(x=xms;x>0;x--) for(y=110;y>0;y--);}/********液晶写入指令函数与写入数据函数,以后可调用**************/voidwrite_com(ucharcom)//****液晶写入指令函数****{ rs=0;//数据/指令选择置为指令 //rw=0;//读写选择置为写 P0=com;//送入数据 delayms(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delayms(1); en=0;//en由高变低,产生下降沿,液晶执行命令}voidwrite_data(uchardat)//***液晶写入数据函数****{ rs=1;//数据/指令选择置为数据 //rw=0;//读写选择置为写 P0=dat;//送入数据 delayms(1); en=1;//en置高电平,为制造下降沿做准备 delayms(1); en=0;//en由高变低,产生下降沿,液晶执行命令}voidLcd_cls(){uchari; write_com(er); for(i=0;i<16;i++) { write_data(qk[i])}}//**************************************DS18B20温度采集时序程序voiddelay_us(Uint16t)//12MHz晶振{while(t--);}voidInit_18b20_A(void){Ucharn; DQ_A=1; delay_us(8);DQ_A=0; delay_us(80);//600us左右 DQ_A=1; delay_us(8); n=DQ_A; delay_us(4);}voidwrite_byte_A(Uchardat){ Uchari; for(i=0;i<8;i++) { DQ_A=0; DQ_A=dat&0x01;delay_us(4);//40-50us DQ_A=1; dat>>=1; } delay_us(4);}Ucharread_byte_A(void){Uchari,value; for(i=0;i<8;i++) { DQ_A=0; value>>=1; DQ_A=1;//线与 if(DQ_A) value|=0x80; delay_us(4);} returnvalue;}voidget_temp_A(void){uchara,b; Init_18b20_A(); write_byte_A(0xcc); write_byte_A(0x44);//启动测量 delay_us(300); Init_18b20_A(); write_byte_A(0xcc); write_byte_A(0xbe); a=read_byte_A();//lsb b=read_byte_A();//msb temp=b*256+a;//26.8 tempa=temp*0.625;//268}//=======================两声提示音========================voidTwoAlarm(void){ green=1; alarm=0;red=0; delayms(50);alarm=1;red=1; delayms(50); alarm=0;red=0; delayms(50);alarm=1;red=1;}//第一个界面程序//voidfir_disp(void){ uchari; Lcd_cls(); write_com(er); for(i=0;i<16;i++) { write_data(jl[i]); }}//第二个界面程序//voidsec_disp(){uchari; alarm=1;red=1; Lcd_cls(); write_com(er); for(i=0;i<16;i++) {write_data(yz[i]);}}//第三个界面程序//voidthi_disp(){uchari; Lcd_cls(); write_com(er); for(i=0;i<16;i++) {write_data(wd[i]);} write_com(er+10); write_data(0xdf); write_data(0x43); }//切换键扫描程序//voidkeyscan_qh(){if(qh==0) {delayms(5); if(qh==0) {flag_qh++;} while(qh==0);} if(flag_qh==3) {flag_qh=0;}}voidkeyscan_set(){if(set==0) {delayms(5); if(set==0) {while(set==0); key_num++; if(key_num==1) {flag_set=1; write_com(er+5); write_com(0x0f);//光标显示并闪烁} if(key_num==2) { write_com(er+13);} if(key_num==3) {key_num=0; write_com(0x0c);//光标关闭 flag_set=0;}}} if(key_num!=0) {if(add==0) {delayms(5); if(add==0) {while(add==0); if(key_num==1) {sh++; if(sh>=400) sh=0; write_com(er+3); write_data(0x30+sh/100); write_data(0x30+sh%100/10); write_data(0x30+sh%10); write_com(er+5);} if(key_num==2) {sl++; if(sl>=400) sl=0; write_com(er+11); write_data(0x30+sl/100); write_data(0x30+sl%100/10); write_data(0x30+sl%10);; write_com(er+13);}}} if(dec==0) {delayms(5); if(dec==0) {while(dec==0); if(key_num==1) {sh--; if(sh<-1) sh=400; write_com(er+3); write_data(0x30+sh/100); write_data(0x30+sh%100/10); write_data(0x30+sh%10); write_com(er+5);} if(key_num==2) {sl--; if(sl<-1) sl=400; write_com(er+11); write_data(0x30+sl/100); write_data(0x30+sl%100/10); write_data(0x30+sl%10);; write_com(er+13);}}}}}voidwrite_TA(ucharaddr,uintdat){write_com(er+addr); write_data(0x30+dat/100); write_data(0x30+dat%100/10); write_data(0x2e); write_data(0x30+dat%10);}/********************************************************/voidStartModule() //启动模块{TX=1; //启动一次模块 _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0;}/********************************************************/voidConut(void){ucharnum;time=TH0*256+TL0; TH0=0; TL0=0; //if(100<tempa<200) //rate=1.7f; //if(200<tempa<300) //rate=1.8f; //if(300<tempa<999) //rate=1.9f; rate=331.4+0.61*temp; dis=(time*rate/(2*100))/100;//算出来是CM //dis=(time*1.7)/100; if((dis>=700)||flag==1)//超出测量范围显示“-〞 { red=1;alarm=1;flag=0; write_com(er+6); for(num=0;num<6;num++) write_data(0x2e);//显示点} else {write_com(e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论