1、目 录1 超声波测距的工作原理21.1 超声波传感器21.2 超声波测距原理及实现31.3 超声波测距系统参数选择32 系统硬件设计42.1 AT89C52芯片介绍42.2 发射与接收电路设计52.3 显示电路设计62.4 报警电路设计72.5 复位电路72.6 时钟电路83 系统软件实现83.1 主程序83.2 脉冲的产生及发送93.3 DS18B20温度采集程序103.4 LCD显示程序103.5 数据转换及距离计算113.6 蜂鸣报警程序124 基于PROTEUS的软件仿真125 系统误差分析及改进145.1 温度对超声波声速的影响145.2 超声波反射角的影响145.3 系统的改进14
2、6 结论15结束语15致谢15参考文献16附录17 基于单片机的倒车系统设计摘要:随着社会的进步,人们生活水平的提高,倒车过程中的安全问题就显得越来越受人重视。设计利用超声波测距原理来实现安全倒车。在硬件方面采用以AT89C52芯片为核心,辅助以LCD显示电路、声音报警电路、时钟电路、复位电路和超声波收、发电路,并对各个电路核心部分的原理进行详细的阐述。在软件编程方面是以汇编语言为主,再结合C语言在计算上的简便性,达到便于后期修改的模块化形式,同时给出了各个模块的具体流程图。在设计的最后还给出了超声波测距系统的误差分析及改进的方案。关键词:倒车; 超声波; AT89C52芯片; 测距Desig
3、n of Reverse System Based on SCMYangguang Zhang(Electronic & Information Engineering Department, Supervisor: Xuejun Chen)Abstract: Along with social progress, improvement of peoples living standards, the process of reversing security becomes more attention by people. The design using ultrasonic rang
4、ing principle to achieve safety reverseing. In the hardware in the AT89C52 as the core chip, aided by LCD display circuit, sound-light alarm circuit, clocking circuit,reset circuit and ultrasonic accept, Launch circuit, and the principle of the core part of each circuit detailed in this paper. To as
5、sembly language primarily in software programming, combine the simplicity of the C language in the calculation, to facilitate change of the modular form late, at the same time gives each module of the specific flow chart. and in the design of the last it gives the ultrasonic ranging system error ana
6、lysis and the improved scheme.Keywords: reversing; ultrasonic; AT89C52 chip; ranging1 超声波测距的工作原理1.1 超声波传感器超声波传感器中的超声波,是以前在中学的物理课上学过的,当物体振动时会发出声响。微小的振动不会被人耳感知,而超过一定大小的振动则会引起人耳的共鸣。通常来说正常人能听到的声频段是在20Hz20KHz范围之内,于是这个声频段的声波就被人称之为可听声波,超出该频率范围的声音,人耳便听不到了,其中频率低于可听声波的是低频声波,频率高于可听声波的是超声波,简称为超声。超声波与人耳平常听到的声波在本
7、质上其实是一致的,它们都是由一种物质振动产生,以横波或纵波的方式通过一定的介质传播开来的,是一种能量的传播形式,它们的不同点在于频率的高低与波长的长短等,超声波具有频率高,波长短的特点。课题之所以选择超声波作为传感器来测距,更重要的是因为它在空气中指向性很强而且可传递强能量,在短时间内它的能耗又很低。超声波传感器可以将电能转变为所需的任意超生能,当然反过来也可以将超生能转变为电能以便通过设计电路来进行数据处理1。超声波传感器主要分为两个类别即电声型和流体动力型,因这两者产生的超声波频率、声波及功率各不相同,也就导致了它们将适用于不同的场合。这里将使用的压电传感器是电声型的一种。它的探头部分由晶
8、片、楔块、外拉接头等组成如图1所示,是实现声电转换的重要部分。图1 超声波发生器图超声波传感器的内部是由两块压电晶片与一个共振盘组成,它们由两根金属线引出外壳作为两电极,外部是由金属网包裹。其工作原理简单的说就是当两电极外加的信号频率和压电晶片的固有频率相同时,两块压电晶片就产生共振,通过带动共振盘的振动,就得到了测距所需的超声波。相反,若两电极没有通电压,而此时外来的超声波又刚好被共振盘接收时,超声波就驱动共振盘振动并带动外接有导线的压电晶片一起振动,从而就实现了把振动的机械能转变为电能的目的,再通过导线传出以便于后期相应的数据处理。1.2 超声波测距原理及实现超声波测距的实现2是根据其特有
9、的性能分为脉冲回波法、频差法和共振法。每种方法都各有自己的优缺点,所以都是一些很有用的测距方法。这里根据本课题的实际情况来考虑将使用脉冲回波法3,它利用的就是超声波的反射特性。超声波测距,其原理是向超声波的发射器输入脉冲串,通过超声波发生器产生机械波,同时单片机开始计时。超声波通过介质沿直线传播到障碍物的表面,在被测面发生反射与折射作用后,其中被反射的部分中有一小部分可以被超声波的接收器接收,经过声/电转换,就完成了把不可测量转化为可测量的过程。但得到的信号由于在反射到被接收过程中有较多的损耗,所以能够到达接收器的信号只剩毫伏级的正弦波信号了,固需要经放大、整形电路后传送到单片机。期间,从发射
10、端发射信号到接收端接收信号的时间即为往返时间t。根据物理上计算路程的公式利用到超声波测距的实际中可转换为其中,s就是所求的车尾与障碍物间的距离,c是超声波在常温下于空气中的传播速度。1.3 超声波测距系统参数选择如图2所示超声波测距系统主要由超声波传感器、超声波发射及接受电路、放大、整形电路、单片机控制电路、LCD显示、报警系统等组成。探头通道选择激励脉冲中断信号回波信号超声波发射与接收电路双四选一开关超声波放大与整形电路单片机控制电路声光报警电路LCD显示电路图2 超声波测距系统图超声波传感器性能的好坏很大程度上决定了超声波测距的准确性、灵敏性。而超声波传感器中则是以探头的选择为主,超声波传
11、感器的探头一般有收发一体式与收发分体式,鉴于要测的表面不一定都是光滑平整的,所以反射时有一定的角度,固可以选择电子市场上较常见的收发分体式,其一般频率选40KHz。探头的型号接收端用SZW-R40-10P传感器和发射端用SZW-S40-12M传感器,这两支传感器的特性参数如表1所示。表1 收发传感器特性参数表型号SZW-S40-12MSZW-R40-1OP结构开放式开放式使用方式发射接收中心频率401KHz401KHz声压115dBmin(0dB=0.02mPa)-70dBmin(0dB=1V/bar)指向性7580容量250025%pF110025%pF最低使用温度-40-40最高使用温度8
12、585最小探测距离0.2m0.2m最大探测距离4m4m分辨率9mm9mm最大输入电压20Vp-p连续信号20Vp-p连续信号为了能够引起探头中压电晶片的共振,发射电路频率宜选择传感器的固有频率40KHz,这样才有可能使其工作于谐振频率从而达到最优的特性。超声波电信号放大、整形部分可用集成电路CX20106,选AT89C52作为单片机核心芯片。2 系统硬件设计 超声波测距系统硬件部分包括单片机控制电路,超声波收、发电路,信号整形、放大电路,LCD显示电路,蜂鸣报警电路,复位电路以及时钟电路等的设计。以上每种电路的设计都有多种方案,下面介绍的电路设计方案都是各个部分电路中比较常见的。2.1 AT8
13、9C52芯片介绍AT89C52单片机4是应用于超声波测距系统中常用的芯片之一。它是一种带8K字节闪存的高性能、低电压微处理器。包括以下几个部件:(1)兼容MCS51指令系统;(2)一个8位CPU;(3)一个片内振荡器及时钟电路;(4)8k Flash ROM;(5)128*8位内部RAM; (6)32条双向I/O口;(7)3个16位定时器/计数器中断;(8)8个中断源;(9)2个读写中断口线,3级加密位;(10)一个可编程串行通道。AT89C52单片机芯片的引脚介绍如图3所示。图3 AT89C52芯片图AT89C52单片机的输入输出端口在编程上是根据应用电路的具体要求和功能对其进行编程的,其具
14、体步骤有以下四点。(1)先根据实际电路的要求来选择输入输出端口;(2)初始化端口应尽量避免端口作为输出时的起初阶段会出现不确定状态,影响电路正常的工作;(3)用作输入的I/O管脚,如需上拉电阻就再通过输入上拉使能寄存器作为其内部配置的上拉电阻;(4)最后对输入输出端口进行输出与输入编程。2.2 发射与接收电路设计 发射电路是由脉冲发射电路与脉冲产生电路组成的。其中脉冲产生电路的目的是得到40KHz的脉冲电压,它是由多个74HC04反相器和电阻构成的,由单片机P2口控制。其中U1A反相器是让输入到传感器两端的电压置反以便得到足够的压差来驱动传感器发射超声波,电路图如图4所示。图4 超声波发射电路
15、图 超声波接收电路主要是用于检测回波,并在接收到超声波的同时向单片机发出中断来停止计时。超声波测距系统的一个主要因素传播时间是由接收电路设计的好坏决定的。如图5所示的接收电路主要由CX20106芯片执行命令其中包括检波、滤波放大和整形等功能。其中检波电路是用于接收反射回来的回波,接着由滤波放大电路对信号进行放大,而整形部分则是把接收到的信号整理成C52单片机能够识别的信号并向单片机提出中断计时的指示。在这里滤波电路的作用尤其重要,因为超声波在传播、反射与折射后能够被探头接收到的信号已经十分微弱而且还可能夹杂着一些噪声。鉴于此接收电路可以设计两个以上的滤波放大模块对信号进行多级放大。 图5 超声
16、波接收电路图2.3 显示电路设计显示部分采用LM016L液晶显示。它是利用液晶材料的光电效应,即对其施加电场,其分子排列就会发生变化,进而对液晶整体的光学折射特点产生影响,通过造成人们视觉的变化来达到显示所需数字的目的。它有着比较多的特点如微功耗、使用寿命长、屏幕大且清晰、低压等。电路图如图6所示,LM016L液晶显示共16个管脚,在编程时只用到其中主要的几个管脚,分别是:使能信号E;读写选择端R/W;数据命令端RS。接着就是对这三个管脚进行初始化、写命令等。这里当R/W中加高平电压时是进行读操作,而加低平电压时是进行写操作。RS作为寄存器的选择端,加高平电压是当做数据寄存器,加低平电压就是当
17、做指令寄存器5,该液晶显示的操作时序如表2所示。图6 显示电路图表2 操作时序表RSR/W操作说明00写入指令码D0D701读取输出的D0D7状态字10写入数据D0D711从D0D7读取数据注:开始时初始化时E为0,然后置E为1,再进行清零。读取状态字的时侯,D7位中,当D7=1时,是禁止读写操作;D7=0,是允许读写操作。2.4 报警电路设计系统的报警电路如图7所示其中由NPN管、电阻和蜂鸣器组成。声音报警指的是当超声波探测到的障碍物距离小于所设定的安全值时装置就会发出声音提醒驾驶员。声音报警器使用BUZZER,它自带着一种报警音,可以给驾驶员直接的提示。图7 声报警电路图2.5 复位电路复
18、位操作顾名思义就是指恢复到起始的状态,在这里是用来让单片机片初始化的,使单片机能够从出产前的状态运行。单片机复位电路通常采用上电自动复位、按键电平复位及系统复位。考虑到设计结构较简单,干扰又不是很大,固用上电自动复位4,电路图如图8所示。图8 上电复位电路图至于该测距系统为什么需要一个复位电路,是因为在单片机应用系统工作时,可能会由于一些程序上的运行出错或操作上的错误导致系统死循环跳不出来,从而使装置不能再正常工作。这时就需要复位来重新启动。固系统的复位电路是十分重要的要保证其精确、可靠的工作。要想使系统能可靠的复位,只要RST端保持高电平就可以让单片机处于循环复位中。2.6 时钟电路 每块核
19、心单片机都必须带有一个时钟电路,它是用来给单片机内部提供正常工作的一个时间基准。如图9所示的时钟电路是由两个起稳定振荡频率、快速起振作用的电容器与一个12MHz的晶体振荡器组成的。这里选用的是以内部振荡方式得到时钟信号的电路。图9 时钟电路图3 系统软件实现针对上述介绍的系统硬件基本框架,接下来辅助以软件方面的实现。系统软件实现的目标主要是增进系统功能的实现以及在数据处理方面的应用,这里在倒车系统中装配了四路测距通道,分别把传感器安装在车尾的左、左中、右中、右四个方位,这样能够比较精确的测得车尾与障碍物的实际距离。软件实现上对这四路测距通道采用分时工作的方式,就是以从左到右的顺序循环发射与接收
20、超声波进行测距。整个软件系统在编程方面采用汇编语言及C语言,这里利用了汇编语言具有较高的效率及易精细计算时间的优点与C语言在计算方面的简便。在上述两种语言作为编程的基础上系统软件采用模块化设计,这种设计方式比较有利于后续的改动,也有利于读者的理解。其主要包含有主程序、温度采集程序及显示报警程序。主程序要完成的是系统初始化的工作,中断程序包括定时中断服务子程序与外部中断服务子程序,前者的任务是合理、有序的分配四路测距系统超声波的收发,而后者是完成对超声波传播时间的读取及计算,最后将所得结果输出。显示报警电路是用来产生能给驾驶员直观提示的电路。3.1 主程序主程序流程图如图10所示所要的任务是要对
21、系统进行各种操作初始化的。它是一个单片机程序的主体,统领着单片机整个程序的有效运行,在这个过程中主程序可以不断的调用子程序与中断服务程序,既一个初始化、调用、等待响应的过程。NYYN单片机初始化开始发射超声波定时器开始计时停止计时定时器初始化结束计算距离检测是否有回波四路是否检测完YNLCD显示距离小于100cm蜂鸣报警图10 主程序流程图3.2 脉冲的产生及发送脉冲的产生是这个超声波测距系统的首要步骤,当然在这之前先要运行主程序中的初始化部分程序,也就是对定时/计数器T0进行初始化,选M1、M0分别为0和1的工作方式1的定时模式,在初始化程序中写入初始程序TMOD=0x11。接着通过P1.0
22、端口发送频率大约为40kHz的方波来作为超声波的脉冲信号,与此同时启动计数器T0进行计时。脉冲的产生程序较简单,而且又要求运行准确,固可以直接采用汇编语言进行编程,以获得超声波传播经过的时间,流程图如图11所示。中断入口定时器0初始化定时器1清零送出高电平延时子程序电平拉低启动定时器1返回图11 超声波发送子程序流程图3.3 DS18B20温度采集程序温度采集在软件方面的实现较为简单,其流程图如图12所示。初始化字节写入子程序字节读出子程序读温度子程序返回图12 温度采集流程图DS18B20的工作方式是先对其初始化,接着执行存储器的操作指令,最后进行数据的传输。3.4 LCD显示程序LCD显示
23、块的运行程序流程图如图13所示,包括LCD的初始化、检查忙碌状态、写指令与数据函数、接着就是LCD的显示操作了。由于液晶显示器是一种运行速度较为慢的零件,固在对其执行每一条指令时必须附带的先对其进行查忙操作,若检测到的是低电平信号则表示LCD显示器此时不忙,否则写入的任何指令都将被其视为无效。初始化LCD忙状态检测写指令函数写数据函数LCD显示返回图13 LCD显示程序流程图在编写这块程序的时候,是将通过计算所得的各个距离结果保存到一个数组中,接着读取需要的数据传送到LCD显示屏中呈现给驾驶员,以便驾驶员能直观的对倒车情形进行准确的判断。3.5 数据转换及距离计算通过上面对温度采集与LCD显示
24、的介绍可知,这两种显示方式都是只接受BCD码的,所以有必要设计一个数据转换程序,以便直接的读取显示,图14实现的就是数据的转换。首先从单片机中读取进数据,接着进行补码与原码的转化,最后就是把数据写入显示数组num 中。开始读取数据补码、原码转化子程序数据写入显示数组返回图14 数据转换程序流程图由于距离是不能直接测得的,它与温度有关,需要通过相应公式的计算才能间接的获得,所以有必要设计一个计算最终距离的程序如图15所示,其中包括温度与时间数据的读取以及结合温度与速度的关系再加上读进的时间值来进行距离的计算。开始读取速度值计算时间值计算距离值返回图15 距离计算流程图3.6 蜂鸣报警程序倒车系统
25、中的报警是根据测得的实际距离与设定警戒值之间的比较,在警戒值内的距离将激发报警程序,其流程图如图16所示,程序中主要包括报警与延时两个部分。YN开始读取距离值LCD显示距离小于100cm蜂鸣报警结束图16 报警流程图 4 基于PROTEUS的软件仿真Proteus是一款功能强大的软件,尤其是单片机系统的仿真,在设计的开发初期,用Proteus来仿真,以便验证设计的可行性,并对设计的准确性做出分析。首先是要在Proteus上绘制出准备作为仿真实验的电路原理图其如图17所示。用Proteus绘制好电路图后导入程序文件(用Keil编译过后的HEX文件),然后就可以执行仿真,在仿真的时候P2.6检测到
26、高电平即为返回信号获得,由于在软件中没有CX20106模型,所以P2.6悬空,则程序开始就认为返回信号获得了,所以显示了一个最小测量值0118mm,而温度为26C,通过调节DS18B20模型的温度可以测试显示温度是否正确,从图中可以看出显示的温度就是DS18B20的预设温度值。下面我们再来看看P2.5口是否有发射信号的产生。由于是频率比较高的信号(40KHz),所以不能通过二极管来观察到,所以在仿真的时候P2.5一直显示的是低电平状态,这时必须用示波器来查看,如图:图17 Proteus仿真原理图图18 仿真结果图 从图18的仿真结果图可以看出,P2.5口输出了信号,由于软件是间隔60ms发送
27、一次40KHz的信号,所以可以看到这样的尖脉冲信号产生。软件仿真的成功说明本设计达到了初步的要求。5 系统误差分析及改进5.1 温度对超声波声速的影响每一种声波在介质中传播时其速度都与温度有关6,超声波也不例外。表3列出了超声波在多种不同温度下的速度。表3 温度与声速的关系温度()3020100102030100声速(米秒)313319325323338344349386在一般状况下,如果实际的温度变化不是很大,那么可以认为声速是一个基本上不变的值,用于计算时取为346 m/s。而如果在应用中对精度的要求高,则可以尝试软硬件两个方面的改进办法,其中硬件方面可以增加一个补偿电路,软件方面可以通过
28、改进算法来加以校正。其中空气中声速与温度的关系如下:声速确定完,接着只要配合以超声波于空气中的往返时间,根据公式:即可得障碍物与车尾的距离。5.2 超声波反射角的影响系统测距采用的是渡越时间法,其工作方式是从发射传感器中发射出超声波经障碍物放射后由接收传感器获得信号,其原理如图19所示。图19 超声波测距原理为了进一步的改善倒车系统的测量精度,于是将增加反射角引起的距离误差7,如图根据公式 可得更为准确的距离值。5.3 系统的改进鉴于所学知识的局限及时间方面等的原因,下面将对设计存在的一些缺点进行简单的改进说明。(1)在超声波发射的波形方面,设计采用的是方波,由于方波是一种高次谐波占量比较大的
29、电压波形,它将影响精确的鉴相,同时会增加发射波与接收的回波的谐波失真。所以可以考虑在后期设计中将方波用正弦波来取代。(2)大多数的硬件设备在如今的生活中都免不了受到一些外界的干扰,更不用说汽车这种完成暴露于外界交通工具。所以进行系统设计时理所当然的的会想到使用一些抗干扰的措施。现在比较常见的硬件抗干扰措施有隔离技术、接地的抗干扰处理以及元件的合理布局8。比如,前面介绍的探头就有金属作为外壳来降低其抗干扰的程度。同样在此系统的其他设计方面也要考虑到受干扰的程度及使用什么方法对系统进行优化,在最大程度上减少整个系统的最后测量误差。(3)由于超声波在发出、反射到被传感器接收其振幅会有很大的衰减,并且
30、会呈现出指数规律。针对这种情况可以在超声波接收回路中增加一个增益调节电路与一个自动增益反馈控制环节9。增益调节的作用是使信号的放大倍数随着测量距离的增加同样呈指数规律增加,这样可以抵消接收到的波形振幅值的变化,而加上自动增益反馈控制环节能让接收到的回波更加稳定。6 结论系统是以单片机AT89C52为核心芯片,辅助以硬件电路与软件编程实现的一个可以用于对精度要求不是很高的汽车上。倒车系统可以对一定范围内的距离在理论上实现测距的任务,但是由于现实条件的制约,系统并没有达到最为理想的倒车测距系统的要求,存在着一定的缺陷,还有改进的空间。说实话对于那些稍微高档点的汽车,现在使用的倒车系统都是配备了整合
31、影音的系统,不仅能够报距,而且可以全方位的显示汽车周围的环境,不过这种倒车系统一般都具有昂贵的身价。此次设计着重于讲解了倒车系统的基本原理,并且可以据此生产出价格低廉的实物,具有较高的实用性。结束语:通过此次汽车倒车系统的设计,不仅巩固了本科期间所学的理论知识,同时也加强了把理论知识付诸于解决实际问题的能力。通过对课题的全方位理解,加之在细节方面的慎重考虑,思维与动手能力得到了前所未有的锻炼,并且丰富了这方面的经验知识,对以后的工作有一定的帮助,相信这样的结果已经达到了学校设定毕业设计的目的。这次的毕业设计单从题目上看虽然感觉不是特别难,但是整个设计过程其实是相当复杂的,不用说这次设计当中用到
32、了很多从未学过的知识需要自己上网查资料,就那对某块的设计方案的抉择已经够让人头疼的了,还有各种芯片的特点,各种设备的选用标准及适用条件。在设计中遇到的那些沟沟坎坎的都不是很可怕,可怕的是连战胜它的想法都没有,相信自己只要坚定信心,刻苦专研,就会有解决问题的办法。虽然设计的内容在很多方面都存在改进的地方,但伴随着自己在专业知识方面的不断巩固加强,在不久的将来或许会得以解决,即使那时候可能不会在为设计的完善工作做实际性的修改。但至少立足于此,学到了很多,这才是最重要的。致谢:此次毕业设计,首先要感谢陈老师,因为做这个毕业设计的时候由于考研等各方面的原因时间本来就不是很多,所以很多时候在提交一些前期
33、材料的时候总是有所推迟,给老师的总体工作进度造成了不可避免的影响,但就这样老师也还是在设计中对询问的问题给予了悉心的指导。当然也要感谢同一组做设计的同学,他们在毕业设计期间提了很多宝贵的意见,而且也曾经帮忙一起解决了很多设计中遇到的问题。除了他们外,当然还有很多的老师和同学对此次毕业设计做出了或直接或间接的帮助,在这里无法一一列举,不过还是表示衷心的感谢!参考文献:1 徐国华超声波测距系统的设计与实现J电子技术应用,2010,(12):6-72 肖质红超声波测距仪在汽车安全系统中的应用J浙江万里学院学报,2007,(5):43-463 赵珂时差法超声测距仪的研制J测控技术,2005,24(4)
34、:77-794 李群芳,张士军单片微型计算机与接口技术M北京:电子工业出版社,20085 赵亮用单片机控制液晶显示模块LCD1602J无线电,2007,03(634):36-376 赵小强,赵连玉超声波测距系统中的温度补偿J控制与检测,2008,12:62-647 苏伟,巩壁建超声波测距误差分析J传感器技术,2004,23(6):8-118 祝敏超声波测距误差分析及修正方法J计量与测试技术,2009,36(2):21-249 曾祥进,王敏,黄心汉自动增益电路在超声波测距系统中的应用研究J测控技术,2005,24(7):69-71附录Proteus中画得的系统总体电路图程序:#include #
35、include #include #define uchar unsigned char #define uint unsigned int uchar code dispBUF33=Temperature: Distance: mm ; uchar numcode10=0,1,2,3,4,5,6,7,8,9; uint num29=0; uchar jsh,jsl; /计数器的高低位 uchar count=0; /10秒计次数 uint distance; /距离 uint temp; /温度变量 uchar bdata flag; /DS18B20存在标准 sbit RS=P20; /L
36、CD RS sbit RW=P21; /LCD RW sbit E =P22; /LCD E sbit DQ=P27; /DS18B20数字端口 sbit Busy = P07; /LCD 忙 void Delay(uint time); void delay1ms(uint ms); void delay(); void delay15(uchar us); void BUMA(void); void B20_WDAT(uchar dat); uchar B20_RDAT(void); void Init_18B20(void); /初始化18B20 void Write_Comm(ucha
37、r); /写入LCD命令 void Write_Data(uchar); /写入LCD数据 void Init_LCD(void); sbit sta_flag =flag0; /10MS到标准位,flag即通用标志位,当sta_flag=1时,表示到了10ms sbit fuhao =flag1; /温度的符号位 sbit START =P10; /启动测距 sbit CNT =P25; /发射超声波 sbit CSBIN =P26; /返回信号 sbit BUZZER =P37; /*定时器1溢出*/ void timer1(void)interrupt 2 using 1TR1=0;/关
38、闭定时器/计数器1 /*定时器0溢出中断函数,每60MS溢出*/ void timer0(void)interrupt 1 using 0/定时器0 TH0=0x15; TL0=0xA0;/定时器0设定初值 TH1=0; TL1=0;/计数器1清零 sta_flag=1; count+; _nop_(); _nop_(); _nop_(); _nop_(); CNT=1; /先延时,后开始发送40KHz的超声波 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _n
39、op_(); _nop_(); /40KHZ的倒数就是25us,12个_nop_();就是24us CNT=0; /保持一段时间高电平 _nop_(); _nop_(); _nop_(); _nop_(); TR1=1; /延时,避免直达信号干扰,启动定时器/计数器1 delay15(50); /延时避开直达信号 /*系统初始化*/ void SYS_INIT() uchar i; for(i=0;i29;i+) /显示清零 numi=0; TMOD=0x11; /工作方式寄存器TMOD,设置定时器/计数器0和1均为16位定时/计数器 TH0 =0x15; TL0 =0xA0; /设置定时器/
40、计数器0的初值,60ms溢出 P0 =0; CNT=0; /P25口,发射发射超声波 CSBIN=1; /P26口,接收信号 EA =1; /开总中断 /*距离计算*/ void JULIJS() /使用全局变量,可以定义为空 float c,d,s; uint t; if(temp0x8000) c=331.4+0.61*temp*0.0625; else/温度为负 c=331.4-0.61*temp*0.0625; t=jsh*256+jsl-120; /计算计数值 d=(c*t*0.001)/2; d*=d; s=d-7.98; distance=sqrt(s); /修正后的值,数据通过
41、全局变量distance传输 /*转换成2进制*/ void HEXtoBCD() float tp; unsigned long int tmp; fuhao=0;/温度符号位 if(temp0x8000) tp=temp*0.0625; else /温度为负,则求补码得到原码 BUMA(); tp=temp*0.0625; fuhao=1; tp*=10; tmp=tp; num12=tmp/100;/数据转换后放到显示数组里面 if(fuhao) num12=num12|0x80; /最高位加上符号位 num13=tmp/10-(tmp/100)*10; tmp=distance; num25=tmp/1000; tmp%=1000; num26=tmp/100; tmp%=100; num27=tmp/10; tmp%=10; num28=tmp/1; /*温度转换函数*/ void TESTT