汽车防撞报警器的设计_第1页
汽车防撞报警器的设计_第2页
汽车防撞报警器的设计_第3页
汽车防撞报警器的设计_第4页
汽车防撞报警器的设计_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、汽车防撞报警器的设计【摘 要】 本设计主要应用AT89S52作为控制核心,与显示器、驱动电路等相结合的系统。利用单片机AT89S52作为报警装置的控制器,能充分发挥AT89S52的数据处理和实时控制功能。使系统工作于最佳状态,提高系统的灵敏度。其优点是体积小、使用方便、硬件电路简单,软件功能完善,控制系统可靠,具有一定的使用和参考价值。该系统利用超声波实现对汽车的测距,利用单片机的实时控制和数据处理功能完成系统的控制。【关键词】单片机;AT89S52;超声波Design of automotive anti-collision alarm【Abstract】The design of the

2、main application AT89S52 as the control, and display driver integrated circuits and other systems. MCU AT89S52 using the controller as an alarm device that can give full play to AT89S52 of data processing and real-time control functions. Make the system work in the best condition, improve the system

3、 sensitivity. The advantage is small, easy to use, simple hardware circuit, software, functional, and reliable control system has some value in use and reference. The use of ultrasound to achieve collision avoidance alarm on the car's distance. Real-time control of single-chip computer and data

4、processing functions to complete control of the system.【Keywords】SCM;AT89S52;Ultrasonic目 录第一章 绪论131.1 课题研究的背景和意义131.2 汽车防撞报警器的发展现状13第二章 汽车防撞报警器的原理和总体设计162.1 汽车防撞报警器的原理162.1.1 压电式超声波传感器简介172.2 汽车防撞报警器的总体设计方案18第三章 硬件设计193.1 超声波发射模块与接收模块193.3单片机控制系统203.4显示模块21第四章 软件设计234.1 软件的设计要求234.2 软件设计的总体结构框图234.3

5、 各个程序的流程图234.3.1 主流程图244.3.2 发射接收模块流程244.3.3 中断程序流程254.4 部分程序26第五章 调试425.1 测距模块的调试425.2 调试结果445.3 误差分析45第六章 设计总结476.1 设计功能分析476.2 心得体会47致谢48参考文献49附录一:汽车防撞报警器电路图50附录二:汽车防撞报警器PCB图51附录三:所用元件清单52第一章 绪论随着我国社会经济的高速发展,交通运输业日益兴旺,汽车的数量逐渐增加。交通拥挤状况也日趋严重,撞碰车事件屡屡发生,造成了很大的人身伤亡和经济损失,汽车驾驶员也越来越担心车的安全了。针对这种情况,设计一种响应快

6、,可靠性高且较为经济的汽车防撞报警系统势在必行,超声波测距法是最常见的一种距离测距方法,本设计介绍用AT89S52单片机控制的汽车防撞报警系统。该装置将单片机的实时控制及数据处理功能与超声波的测距技术、传感器技术相结合,可检测汽车运行中前方障碍物与汽车的距离及汽车车速。通过数字显示装置显示距离,并由发声电路根据距离远近情况发出警告声。1.1 课题研究的背景和意义科技的飞速发展拉动了经济的飞跃,私家车逐渐走近了千家万户。但随着车辆的增加,停车难的问题也凸显出来。狭小的停车场地常常令有车一族感到苦恼,稍有不慎,车辆就可能与他人车辆或障碍物发生碰撞,造成损失。虽然车辆都有后视镜,但由于角度问题,不可

7、避免的存在着后视盲区,并不能有效的解决碰撞问题。汽车防撞报警器是汽车倒车或者泊车时使用的安全辅助装置,它可以通过声音、灯光指示或是屏幕显示等手段告知驾驶者车辆周围的障碍物情况,令驾驶者及时调整车辆行进方向以便于规避,解除了驾驶者不便于直接目测与障碍物间距离的困扰,大大的提高了驾驶的安全性。可以说,汽车防撞报警器是车辆必不可少的应用设备之一。1.2 汽车防撞报警器的发展现状通常,汽车防撞报警器由超声波传感器(俗称探头)、控制器和显示器(或蜂鸣器)等部分组成。汽车防撞报警器一般采用超声波测距原理,在控制器的控制下,由传感器发射超声波信号,当遇到障碍物时,产生回波信号,传感器接收到回波信号后经控制器

8、进行数据处理、判断出障碍物的位置,由显示器显示距离并发出其他警示信号,得到及时警示,从而使驾驶者倒车时做到心中有数,使倒车变得更轻松。在几年的时间里,随着技术发展和用户需求的变化,汽车防撞报警器经过了大致六代的发展。 第一代:倒车时通过喇叭提醒 。当车辆倒车时会发出“倒车请注意”的提醒声音,这就是汽车防撞报警器的第一代产品。现在只有小部分车辆还在使用。只要司机挂上倒档,它就会响起,提醒周围的人注意。从一定意义上说,它对驾驶者并没有直接的帮助,不是真正的汽车防撞报警器。它价格便宜,使用性能不高,已被市场淘汰。第二代:采用蜂鸣器不同声音提示驾驶员。这是汽车防撞报警器系统的真正开始。倒车时,如果车后

9、1.8米-1.5米处有障碍物,蜂鸣器就会开始工作,发出警报声。蜂鸣声越急,表示车辆离障碍物越近。但由于没有语音提示,也没有距离显示,司机即使知道有障碍物,却不能确定障碍物离车有多远,对驾驶员帮助也不是太大。第三代:数码波段显示具体距离或者距离范围。这代产品比第二代进步很多,可以显示车后障碍物离车体的距离。如果是物体,在1.8米开始显示;如果是人,在0.9米左右的距离开始显示。这一代产品有两种显示方式,数码显示产品显示距离数字,而波段显示产品由三种颜色来区别:绿色代表安全距离,黄色代表警告距离,红色代表危险距离,必须停止倒车。 第三代产品把数码和波段组合在一起,虽然比较实用,但安装在车内不太美观

10、。第四代:液晶荧屏动态显示。这一代产品有一个质的飞跃,特别是屏幕显示开始出现动态显示系统。不用挂倒档,只要发动汽车,显示器上就会出现汽车图案以及车辆周围障碍物的距离,色彩清晰漂亮,外表美观,可以直接粘贴在仪表盘上,安装很方便。不过液晶显示器外观虽精巧,但灵敏度较高,抗干扰能力较差,误报也较多。第五代:魔幻镜汽车防撞报警器。结合了前几代产品的优点,采用了最新仿生超声雷达技术,配以高速电脑控制,可全天候准确地测知2米以内的障碍物,并以不同等级的声音提示和直观的显示提醒驾驶员。魔幻镜汽车防撞报警器可以把后视镜、汽车防撞报警器、免提电话、温度显示和车内空气污染显示等多项功能整合在一起,并设计了语音功能

11、。因为其外形就是一块倒车镜,所以可以不占用车内空间,直接安装在车内后视镜的位置。而且颜色款式多样,可以按照个人需求和车内装饰选配。第六代:整合影音系统。它在第五代产品的基础上新增了很多功能,属于第六代产品,是专门为高档轿车生产的。从外观上来看,这套系统比第五代产品更为精致典雅;从功能上来看,它除了具备第五代产品的所有功能之外,还整合了高档轿车具备的影音系统,可以在显示器上观看DVD影像。价格较高。汽车防撞报警器对于驾驶者的巨大作用,使得它成为各种车辆上的必备品。第二章 汽车防撞报警器的原理和总体设计2.1 汽车防撞报警器的原理用来测距的方式多种多样。短距离测距可以使用尺子等刻度工具,远距离可以

12、使用激光测距等方法,而超声波测距一般应用与中短距离测量。本设计的工作原理便是超声波测距原理。超声波因其频率下限大约等于人的听觉上限而得名。它方向性好,穿透能力强,易于获得较集中的声能,在水中传播距离远,在医学、军事、工业、农业上有很多的应用。声波的传播速度与温度有关。由于超声波也是一种声波,如果在测距过程中环境温度与常温差距较大,则必须考虑温度。下表列出了几种不同温度下的声速。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。声速确定后,只要测得超声波往返的时间,即可求得距离。表2-1 声速与温度的关系温度()-30-20-100102

13、030100声速(米/秒)313319325333338344349386超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在常温空气中(20)的传播速度为(V)为340m/s(实际速度为344m/s,这里取整数),根据计时器记录的时间(T),就可以计算出发射点距障碍物的距离(S)。S=340T/2这就是所谓的时间差测距法。为了以超声波作为检测手段,必须产生超生波和接收超声波。完成这种功能的装置就是超声波传感器。超声波传感器有发送器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。

14、常用的超声波传感器可以分为二大类,一是用电气方式产生超声波,如压电式、磁致伸缩式超声波发生器;二是用机械方式产生超声波,有加尔统笛、液哨和气流旋笛等。下面我们主要介绍本设计所使用的压电式超声波传感器。2.1.1 压电式超声波传感器简介压电式超声波传感器的主要组成部分是压电晶片。当压电晶片受发射电脉冲激励后产生振动,即可发射声脉冲,是逆压电效应。当超声波作用于晶片时,晶片受迫振动引起的形变可转换成相应的电信号,是正压电效应。前者用于超声波的发射,后者即为超声波的接收。超声波传感器一般采用双压电陶瓷晶片制成。这种超声传感器需要的压电材料较少,价格低廉,且非常适用于气体和液体介质中。在压电陶瓷上加有

15、大小和方向不断变化的交流电压时,根据压电效应,就会使压电陶瓷晶片产生机械变形,这种机械变形的大小和方向在一定范围内是与外加电压的大小和方向成正比的。也就是说,在压电陶瓷晶片上加有频率为 f0交流电压,它就会产生同频率的机械振动,这种机械振动推动空气等媒介,便会发出超声波。如果在压电陶瓷晶片上有超声机械波作用,这将会使其产生机械变形,这种机械变形是与超声机械波一致的,机械变形使压电陶瓷晶片产生频率与超声机械波相同的电信号。图2-1 压电式超声波传感器结构图压电式超声波发生器实际上是利用压电晶体的谐振来工作的,超声波发生器内部结构如图2-1所示,它有两个压电晶片和一个共振板,当它的两极外加脉冲信号

16、,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转化为电信号,这时它就成为超声波传感器。压电陶瓷晶片有一个固定的谐振频率,即中心频率 f0。发射超声波时,加在其上面的交变电压的频率要与它的固有谐振频率一致。这样,超声传感器才有较高的灵敏度。当所用压电材料不变时,改变压电陶瓷晶片的几何尺寸,就可非常方便的改变其固有谐振频率。利用这一特性可制成各种频率的超声传感器。2.2 汽车防撞报警器的总体设计方案按照系统设计的功能具体要求,初步设定汽车防撞报警器系统由单片机控制模块、

17、显示模块、键盘模块、超声波发射模块、超声波接收模块,一共五个模块构成。单片机控制系统使用51单片机系列的AT89S52单片机作为控制器,该型号单片机工作性能稳定,操作简单,比较适合本系统。发射线路由单片机输出端驱动超声波发送。图2-2 系统设计框图硬件电路的设计主要由超声波发射电路、超声波接收电路、单片机控制系统和显示电路四部分组成。第三章 硬件设计本汽车防撞报警器系统主要有主机和探头两部分组成。主机电路包括发射电路、接收电路、计数显示电路三部分。单片机采用AT89S52。采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。单片机用P1.0端口控制发射和停止输出超声波换能器所需的4

18、0KHz的方波信号,利用外中断0口监测超声波接收电路输出的返回信号。显示电路采用简单实用的3位共阴LED数码管,段码用ZLG7289驱动。 3.1 超声波发射模块与接收模块超声波发射模块包括超声波产生电路和超声波发射控制电路两个部分,超声波探头选用压电式,可采用软件发生法和硬件发生法产生超声波。前者利用软件产生40KHz的超声波信号,通过输出引脚输入至驱动器,经驱动器驱动后推动探头产生超声波。这种方法的特点是充分利用软件,灵活性好,但需要设计一个驱动电流在100mA以上的驱动电路。第二种方法是利用超声波专用发生电路或通用发生电路产生超声波信号,并直接驱动换能器产生超声波。这种方法的优点是无须驱

19、动电路,但缺乏灵活性。本设计采用第二种方法产生超声波发射信号。40KHz的超声波是利用LC震荡电路振荡产生的。其振荡频率计算式如公式3-1为: (3-1)其中L=6.8mH,C=2200pF,计算得结果约等于40KHz。超声波接收模块包括超声波接收探头、信号放大电路及波形变换电路三部分。超声波探头必须采用与发射探头对应的型号,关键是频率要一致,本设计采用发生端同型号的压电式超声波传感器,否则将因无法产生共振而影响接收效果,甚至无法接收。由于经探头变换后的正弦波电信号非常弱,因此必须经放大电路放大。由于是汽车报警器系统所测距离在两米左右所以采用两级放大,用LF353实现。第一级放大100倍,第二

20、级放大50倍总计放大5000倍,这样不仅放大增益足够大,可以适合小信号的需求,而且信号增益也能够变化,适应信号变化范围大的需求。放大后的交流信号经LM567锁相环锁定后向CPU发中断申请。在中断服务程序中,读取时间计数器的计数值,并通过计算算出雷达与障碍物的距离。接收探头将超声波调制脉冲变为交变电压信号,经运算放大器两极放大后加至LM567。LM567是带有锁相环的音频译码集成块,LM567内部的压控振荡器的中心频率,接收电路如图4.2所示。电容C7决定其锁定带宽。调节R10在发射的载频上,则LM567输入信号大于25mV,输出端8脚由高电平跃变为低电平,作为中断请求信号,送至单片机处理。选频

21、放大电路的作用是仅允许一定频率的信号通过并放大,而其他频率的信号将被阻断或衰减。只要把选频放大电路工作的中心频率设定为40 KHz,就可以把其他频率的干扰信号清除或衰减,同时把40 KHz的回波信号进行放大。本设计中,将超声波发射模块与接收模块集成与一个电路板上,如图所示: 图3-1 超声波发射与接收模块3.3 单片机控制系统本设计控制系统中所用使用的单片机型号为AT89S52,下面就其功能特点及其结构作些简单介绍。AT89S52是美国ATMEL 公司所生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用其公司高密度非易失性存储器技术制造,片上Flash允许

22、程序存储器在系统可编程,亦适于常规编程器。AT89S52单片机具有很高的性价比,可以灵活应运于众多控制领域中。主要性能参数:·与MCS-51产品指令系统兼容 ·4K字节可编程闪烁存储器 ·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24Hz·三级程序存储器锁定·128*8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源 ·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路 图3-2 AT89S52简图3.4 显

23、示模块出于功能及性价比的考虑,显示模块中所用使用的显示器为LCD1062液晶显示器。以下对其进行一些说明。 图3-3 LCD1602液晶显示器简图 图3-4 LCD1602液晶显示器实物图  引脚说明引脚符号功能说明1VSS一般接地2VDD接电源(+5V)3V0液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。4RSRS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。5R/WR/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。6EE(或EN)端为

24、使能(enable)端,写操作时,下降沿使能。读操作时,E高电平有效7DB0低4位三态、 双向数据总线 0位(最低位)8DB1低4位三态、 双向数据总线 1位9DB2低4位三态、 双向数据总线 2位10DB3低4位三态、 双向数据总线 3位11DB4高4位三态、 双向数据总线 4位12DB5高4位三态、 双向数据总线 5位13DB6高4位三态、 双向数据总线 6位14DB7高4位三态、 双向数据总线 7位(最高位)(也是busy flag)15BLA背光电源正极16BLK背光 电源负极表3-1LCD1602液晶显示器引脚说明键盘模块和供电单元略第四章 软件设计4.1 软件的设计要求本系统的设计

25、要求是利用超声波测距原理设计一个汽车防撞报警器。要求通过设计能够测量出并显示车与障碍物之间的距离,并能在距离小于一定的值的时候根据设定的值进行声光报警。4.2 软件设计的总体结构框图图4-1 系统模块框图系统初始化模块:即系统刚上电的时候对系统的各个引脚的电平分配和对各寄存器的初值赋值。数码管显示模块:通过该模块的设计能够让所测得的距离等信息显示在数码管上。按键扫描模块:此模块用来通过键盘控制系统的工作。发射接收控制模块:发射控制模块是软件控制超声波发射电路发射。超声脉冲启动定时器工作,同时启动接收电路工作,当接收电路有信号输入时,对输入信号进行处理。运算结果处理模块:运算结果处理模块将多次所

26、测的时间进行处理,进行软件取大值工作,根据公式计算出距离,然后再对计算得出的结果进行修正处理,数据处理后送至数码管显示模块。声光报警模块:当所测距离小于一定值时,通过声光报警来提醒使用者。4.3 各个程序的流程图本节讲述的是各个程序流程图的设计,包括:主程序流程图、测距程序流程图、距离处理流程图、语音播报程序流程图、LED显示程序流程图、中断程序流程图。4.3.1 主流程图图4-2 主程序流程图工作时,微处理器AT89S52先把P1.0置0,启动超声波传感器发射超声波,同时启动内部定时器T0开始计时。要检测返回信号必须在启动发射信号后1.4ms才可以检测,这样就可以抑制输出得干扰。当超声波信号

27、碰到障碍物时信号立刻返回,微处理器不停的扫描INT0引脚,如果INT0接收的信号由高电平变为低电平,此时表明信号已经返回,微处理器进入中断关闭定时器。再把定时器中的数据经过换算就可以得出超声波传感器与障碍物之间的距离。然后再根据现场的情况进行声光报警。4.3.2 发射接收模块流程主程序调用测量子程序,计算子程序,显示子程序完成一个测量周期。测量子程序如下:图4-3 测量子程序流程图考虑到在测量的距离超过一定限度后误差会变大,可以在大于一定距离后采用软件修正,补偿实际测的数据,当然这要在调试中收集大量的实际测试数据后在单片机中设置。当计算时为了提高计算精度可以用计算计数脉冲个数来提高计算精度,改

28、进后的公式如公式4-1: (4-1)其中N表示为计数脉冲个数,v为超声波在空气中的速度,f为计数频率也即单片机的晶振频率。4.3.3 中断程序流程在中断程序中,当有中断产生也即接收到超声波信号就马上关闭中断与定时器,并进行距离计算与判断的工作。图4-4 中断程序流程图时间计测:超声波从发射到接收的间隔时间的测定是由单片机内部的计数器T0来完成的。在调试过程中出现的发送部分与接收部分的直接串扰问题是由于换能器之间的距离不大,有部分声波未经被测物就直接绕射到接收换能器上。从发射开始一直到“虚假反射波”结束这段时间,通过控制触发器不能触发,也即超声波发射后不是马上的接收,而是要经过一段时间的等待再接

29、收,使不会发中断申请,可有效躲避干扰,但也会形成所谓的“盲区”。本系统的盲区通过计算在24cm左右。4.4 部分程序#include <AT89x51.H>/器件配置文件#include <intrins.h>#define RX P3_1#define TX P3_2#define LCM_RW P2_1 /定义LCD引脚#define LCM_RS P2_0#define LCM_E P2_2sbit BUSY = P07;#define LCM_Data P0#define buzzer P2_3#define LED P3_6#define LCD_COMMAN

30、D0 / Command#define LCD_DATA1 / Datasfr DBPort = 0x80;sbit DQ = P37; /温度传送数据IO口unsigned int TempBuffer7;unsigned int temp_value,xiaoshu; /温度值#define Busy 0x80 /用于检测LCM状态字中的Busy标识void LCMInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigne

31、d char X, unsigned char Y, unsigned char code *DData);void Delay5Ms(void);void Delay400Ms(void);void Decode(unsigned char ScanCode);void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);unsigned char ReadDataLCM(void);unsigned char ReadStatusLCM(void);unsigned char c

32、ode mcustudio ="Temp: " /unsigned char code email = "NAME:Zhu Kailun "unsigned char code Cls = " "unsigned char code Distance = "Distance: "unsigned char code ASCII15 = '0','1','2','3','4','5','6','7&

33、#39;,'8','9','.','-','M'static unsigned char DisNum = 0; /显示用指针 unsigned int time=0; unsigned long S=0; bit flag =0; unsigned char disbuff4 = 0,0,0,0,;/写数据void WriteDataLCM(unsigned char WDLCM) ReadStatusLCM(); /检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E

34、= 0; /若晶振速度太高可以在这后加小的延时LCM_E = 0; /延时LCM_E = 1;/写指令void WriteCommandLCM(unsigned char WCLCM,BuysC) /BuysC为0时忽略忙检测if (BuysC) ReadStatusLCM(); /根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;/读数据unsigned char ReadDataLCM(void)LCM_RS = 1; LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_

35、E = 1;return(LCM_Data);/读状态unsigned char ReadStatusLCM(void)LCM_Data = 0xFF; LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy); /检测忙信号return(LCM_Data); 等待繁忙标志void wait(void)P0 = 0xFF;doLCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 1;while (BUSY = 1);LCM_E = 0;void w_dat(unsig

36、ned int dat)wait();LCM_E = 0;P0 = dat;LCM_RS = 1;LCM_RW = 0;LCM_E = 1;LCM_E = 0;void w_cmd(unsigned int cmd)wait();LCM_E = 0;P0 = cmd;LCM_RS = 0;LCM_RW = 0;LCM_E = 1;LCM_E = 0;void w_string(unsigned int addr_start, unsigned int *p)w_cmd(addr_start | 0x80);while (*p != '0')w_dat(*p+);void w_d

37、ata(unsigned int addr_start, unsigned int dat)w_cmd(addr_start | 0x80);w_dat(dat%100/10 + '0');w_dat(dat%10 + '0');void LCMInit(void) /LCM初始化LCM_Data = 0;WriteCommandLCM(0x38,0); /三次显示模式设置,不检测忙信号Delay5Ms(); WriteCommandLCM(0x38,0);Delay5Ms(); WriteCommandLCM(0x38,0);Delay5Ms(); Write

38、CommandLCM(0x38,1); /显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); /关闭显示WriteCommandLCM(0x01,1); /显示清屏WriteCommandLCM(0x06,1); / 显示光标移动设置WriteCommandLCM(0x0F,1); / 显示开及光标设置/按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)Y &= 0x1;X &= 0xF; /限制X不能大于15,Y不能大于1i

39、f (Y) X |= 0x40; /当要显示第二行时地址码+0x40;X |= 0x80; /算出指令码WriteCommandLCM(X, 1); /发命令字WriteDataLCM(DData); /发数据/按指定位置显示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)unsigned char ListLength; ListLength = 0;Y &= 0x1;X &= 0xF; /限制X不能大于15,Y不能大于1while (DDataListL

40、ength>0x19) /若到达字串尾则退出if (X <= 0xF) /X坐标应小于0xFDisplayOneChar(X, Y, DDataListLength); /显示单个字符ListLength+;X+;LCD_Wait(void)LCM_RS=0;LCM_RW=1;_nop_();LCM_E=1;_nop_(); LCM_E=0;return DBPort;void LCD_Write(bit style, unsigned char input)LCM_E=0;LCM_RS=style;LCM_RW=0;_nop_();DBPort=input;_nop_();/注意

41、顺序LCM_E=1;_nop_();/注意顺序LCM_E=0;_nop_();LCD_Wait();void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);void Print(unsigned char *str)while(*str!='0')LCD_Write(LCD_DATA,*str);str+;void delay_18B20(unsigned int i)while(i-)

42、;void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i

43、-) DQ = 0; / 给脉冲信号 dat>>=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); return(dat); void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i>0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; void ReadTemp(void)unsigned char a=0;unsigned char b=0;unsi

44、gned char t=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(100); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar(); /读取温度值低位b=ReadOneChar(); /读取温度值高位x

45、iaoshu=a&0x0f;temp_value=b<<4;temp_value+=(a&0xf0)>>4; void temp_to_str() /温度数据转换成液晶字符显示 TempBuffer0=temp_value/10+'0' /十位 TempBuffer1=temp_value%10+'0' /个位 TempBuffer2=0x2e; TempBuffer3=xiaoshu*10/16+'0'/小数 TempBuffer4=0xdf; /温度符号 TempBuffer5='C'

46、TempBuffer6='0' /5ms延时void Delay5Ms(void)unsigned int TempCyc = 5552;while(TempCyc-);/400ms延时void Delay400Ms(void)unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA-)TempCycB=7269;while(TempCycB-); void Conut(void) time=TH0*256+TL0; TH0=0; TL0=0; LED=1; /rsd=0; S=(time*1.7)/100;

47、 /算出来是CM if(S<50)&(S>30) buzzer=0; LED=0; Delay400Ms(); /延时 buzzer=1; LED=1; else if(S<30)&(S>1) buzzer=0; LED=0; Delay5Ms(); /延时 Delay5Ms(); /延时 Delay5Ms(); /延时 Delay5Ms(); /延时 buzzer=1; LED=1; if(S>=700)|flag=1) /超出测量范围显示“-” flag=0; DisplayOneChar(11, 1, ASCII11); DisplayOne

48、Char(12, 1, ASCII10);/显示点 DisplayOneChar(13, 1, ASCII11); DisplayOneChar(14, 1, ASCII11); DisplayOneChar(15, 1, ASCII12);/显示M else disbuff0=S%1000/100; disbuff1=S%1000%100/10; disbuff2=S%1000%10 %10; DisplayOneChar(11, 1, ASCIIdisbuff0); DisplayOneChar(12, 1, ASCII10);/显示点 DisplayOneChar(13, 1, ASCI

49、Idisbuff1); DisplayOneChar(14, 1, ASCIIdisbuff2); DisplayOneChar(15, 1, ASCII12);/显示M void zd0() interrupt 1 /T0中断用来计数器溢出,超过测距范围 flag=1; /中断溢出标志 void StartModule() /启动模块 TX=1; /启动一次模块 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

50、 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; void delayms(unsigned int ms)unsigned char i=100,j;for(;ms;ms-)while(-i)j=10;while(-j);void main(void)unsigned char TempCyc;Delay400Ms(); /启动等待,等LCM讲入工作状态LCMInit(); /LCM初始化Delay5Ms(); /延时片刻(可不要)DisplayListChar(0, 0, mcustudio);ReadDataLCM();/测试用句无意义for (TempCyc=0; TempCyc<10; TempCyc+)Delay400Ms(); /延时DisplayListChar(0, 1, Distance);DisplayListChar(11, 1, Cls);ReadTemp(); /开启温度采集程序 temp_to_str(); /温度数据转换成液晶字符GotoXY(8,0); Print(TempBuffer); /显示温度while(1) TMOD=0x01; /设T0为方

温馨提示

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

评论

0/150

提交评论