目 录
1绪论 ............................................................... 2
1.1设计目的 ...................................................... 2 1.2设计意义 ...................................................... 2 1.3系统功能 ...................................................... 3 2设计方案 ........................................................... 4
2.1方案设计 ...................................................... 4 2.2方案论证 ...................................................... 4 3硬件设计 ........................................................... 5
3.1设计方案 ...................................................... 5 3.2 STC89C52外围电路设计 ......................................... 6
3.2.1单片机 .................................................. 6 3.2.2复位电路与震荡电路 ...................................... 7 3.3 LCD显示模块的设计 ............................................ 8
3.3.1字符型液晶显示模块 ...................................... 8 3.3.2 字符型液晶显示模块引脚 ................................. 9 3.3.3 字符型液晶显示模块内部结构 ............................. 9 3.4温度传感器DS18B20电路设计 ................................... 10
3.4.1 温度传感器DS18B20简介 ................................. 10 3.4.2 DS18B20的主要特性 ..................................... 11 3.5数据采集模块 ................................................. 12 3.6 HC-SR04超声波测距模块 ....................................... 13 3.7报警电路设计 ................................................. 16 4 软件设计 .......................................................... 17
4.1系统软件设计说明 ............................................. 17 4.2主程序的设计 ................................................. 17 4.3超声波发射子程序和超声波接收中断子程序设计 ................... 18 4.4温度测量子程序设计 ........................................... 19 5 结果与结论 ........................................................ 21
5.1结果 ......................................................... 21 5.2结论 ......................................................... 22 致谢 ................................................................ 22 参考文献 ............................................................ 23 附录 ................................................................ 24
1
基于温度补偿的超声波测距设计
1绪论
1.1设计目的
随着国民经济的迅速发展,超声波在机械制造、石油化工、航空航天等领域发
挥着越来越重要的作用。超声波测距作为一种非接触式距离测量方法,具有不受外界光及电磁场等因素影响的优点,实现电路简单、成本低;同时,还具有易于定向发射、方向性好、对人体伤害小等特点。上述优势使得与超声波测距领域相关的仪器设备在数据处理、检测性能和工程设计系统化等方面有了更大的发展空间。利用超声波定位技术是蝙蝠等一些无目视能力的生物作为防御天敌及捕获猎物的生存手段, 这些生物体可发射人们听不到的超声波 ( 20KH 以上的机械波) ,借助空气介质传播, 根据猎物或障碍物反射回来的回波的时间间隔及强弱,判断猎物的性质或障碍物的位置。在影响超声波测距误差的因素中,温度的影响是比较大的,超声波的传播速度在不同的温度下是不同的,那就要得出其传播速度与环境温度t的关系式。因此用常温下的超声波速度341m/s来计算不同温度环境下的超声波测距的距离是有很大误差的。为了提高测距精度,我们必须对超声波的速度进行温度补偿,用温度传感器测环境温度的数值,从而得到改环境下的超声波速度
1.2设计意义
随着社会经济的快速发展,人们生活水平的不断提高,交通运输业的日益兴旺,汽车数量的越来越多。交通拥挤的状况也日趋严重,撞车事件也经常的发生,造成了很严重的人员伤亡和财产损失,针对这一情况,设计一种响应快,可靠性高且较为经济的汽车防撞报警系统事在必行,最常见的一种测量距离的方法是超声波测距,应用于汽车的近距离防撞。还有城市的快速发展,排水系统往往落后于城市建设,经常出现已经建设好建筑设施再重新开挖排水设施的情况,这样经常会造成城市污水的到处排放,影响城市卫生,针对这一情况,设计污水疏通移动机器人的自动控制系统是非常必要的,而这个自动控制系统核心就是超声波测距。以上举得只是超声波应用领域中的一小部分的例子,当今生活中还有很多方
2
基于温度补偿的超声波测距设计
面需要用到超声波测距,来解决人们日常生活中遇到的问题,因此设计一款超声波测距仪是非常重要的一件事。
1.3系统功能
超声波测距仪的设计要求如下: 1) 测量范围小于等于5米2) 测量误差小于0.3cm 3) 进行温度补偿 4) 以LCD显示温度和距离
3
基于温度补偿的超声波测距设计
2设计方案
2.1方案设计
利用超声波检测距离,设计比较方便,计算处理也较简单,其测量精度也能
达到使用要求。超声波发生器可以分为两大类:一类是用机械方式产生超声波,一类是用电气方式产生超声波。电气方式包括压电型、电动型等;机械方式有加尔统笛、液哨和气流旋笛等。目前在近距离测量方面常用的是压电式超声波换能器。根据设计要求并综合各方面因素,本设计采用 AT89C51 单片机作为控制器,用动态扫描法实现LCD数字显示,超声波驱动信号用单片机的定时器。
单片机发出 40kHz 的信号经放大后通过超声波发射器输出;超声波接收器将接收到的超声波信号经放大器放大,用锁相环电路进行检波处理后,启动单片机中断程序,测得时间为 t,再由软件进行判别、计算,得出距离数并送 LCD 显示。
2.2方案论证
方案一:基于单片机的超声波测距方案,基于单片机的超声波测距是以单片机编程产生40KHZ的频率,经过发射驱动放大,使发射端发射超声波,经被测物反射回来,通过反射电路,放大,整形,处理,测出距离。
方案二:基于CPLD的超声波测距系统。基于CPLD的超声波测距系统采用CPLD器件控制超声波的发射与接收,从而计算出测量的距离,其运用VHDL编写程序,并且配合MAX-plusⅡ进行软硬件的仿真与调试。
利用CPLD具有性能高、成本低的特点,但是单片机能够准确计时,测距精度高,而且单片机控制方便,计算简单,所以综合更方面因素本文采用STC89C52单片机作为控制器,用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器。
4
基于温度补偿的超声波测距设计
3硬件设计
3.1设计方案
本文介绍了一种采用脉冲回波方式,基于STC89C52单片机的超声波测距系统。
该系统充分利用单片机的硬件和软件资源,自动实现超声波的发射与接收控制。该系统充分考虑了环境温度对超声波传播速度的影响,通过单片机中计数器所计超声波往返所经历的时间,通过公式换算就可以计算出超声波发射器与被测物之间的距离。其主要包括单片机控制模块,超声波发射模块,超声波接收模块,LCD1602显示模块,温度补偿模块,报警模块,和扫描驱动模块这几个部分。其可以实现非接触测量物体的距离,并通过LCD1602液晶显示出来,当距离小于1M时实现报警。
图3.1超声波测距仪总设计框图
5
基于温度补偿的超声波测距设计
3.2 STC89C52外围电路设计 3.2.1单片机
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引脚、控制线引脚。根据开发的需要和单片机的结构,我们就可
6
基于温度补偿的超声波测距设计
以
图3.2 STC89C52的芯片引脚图
STC89C52共有40个引脚,大致可分为4类:电源引脚、时实现单片机的自动工作,即实现自动化!
3.2.2复位电路与震荡电路
单片机STC89C52作为主控芯片,控制整个电路的运行。其需要一个复位电路,
复位电路的功能是:系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号。复位电路的设计图如图3.3所示。
VCCC310UFS1RSTR110K
复位电路
图3.3复位电路图
STC89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和
7
基于温度补偿的超声波测距设计
XTAL2分别为该反向放大器的输入端和输出端。这个反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。
外接12M振荡器及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。由于外接电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性因此电容选择30pF10pF。
XTAL2XTAL1112MC130pC230p
振荡电路
图3.4振荡电路图
3.3 LCD显示模块的设计 3.3.1字符型液晶显示模块
图3.5 液晶面板
字符型液晶显示模块是一类专门用于显示字母,数字,符号等的点阵式液晶显
示模块。在显示器件上的电极图型设计,它是由若干个5*7或5*11等点阵符位组成。每一个点阵字符位都可以显示一个字符。点阵字符位之间有一空点距的间隔
8
基于温度补偿的超声波测距设计
起到了字符间距和行距的作用,模块见图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 字符型液晶显示模块引脚
编号 1 2 3 4 5 6 7 8 符号 VSS VDD VL RS R/W E D0 D1 引脚说明 电源地 电源正极 液晶显示偏压信号 数据/命令 读/写 使能信号 Data I/O Data I/O 编号 9 10 11 12 13 14 45 16 符号 D2 D3 D4 D5 D6 D7 BLA BLK 引脚说明 Data I/O Data I/O Data I/O Data I/O Data I/O Data I/O 背光源正级 背光源负级 3.3.3 字符型液晶显示模块内部结构
液晶显示模块WM-C1602N的内部结构如图3.6分为三部份:一为LCD控制器,二为LCD驱动器,三为LCD显示装置。与单片机接口见图3.6
9
基于温度补偿的超声波测距设计
图3.6 LCD1602内部结构
图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、温度传感器、
10
基于温度补偿的超声波测距设计
非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如图3.9所示,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端。
ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同,ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
图3.8 DS18B20内部结构图 图3.9 DS18B20管脚图
3.4.2 DS18B20的主要特性
(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℃
11
基于温度补偿的超声波测距设计
和0.0625℃,可实现高精度测温。
(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。
(8)测量结果直接输出数字温度信号,以\"一线总线\"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。
(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数, 当计数器 1的预置值减到0时温度寄存器的值将加1,计数器1的预置将重新被装入,重新开始对低温度系数晶振产生的脉冲信号进行计数。如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图3.10中的斜率累加器用于补偿和修正测温过程中振荡器温度特性的非线性,以产生高分辨率的温度测量。其输出用于修正计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
图3.10 DS18B20测温原理图
另外,由于 DS18B20单总线通信功能是分时完成的,因此他有严格的时隙概念, 因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为: 初始化DS18B20(发复位脉冲)发ROM功能命令
发存储器操作命令处理数据。
3.5数据采集模块
DS18B20有4个主要的数据部件:
A:64位激光ROM。64位激光ROM从高位到低位依次为8位CRC、48位序列号和8位家族代码(28H)组成。
B:温度灵敏元件。
C:非易失性温度报警触发器TH和TL。可通过软件写入用户报警上下限值。
12
基于温度补偿的超声波测距设计
D:配置寄存器。配置寄存器为高速暂存存储器中的第五个字节。其中R0、R1:温度计分辨率设置位,其对应四种分辨率如下表所列,出厂时R0、R1置为缺省值:R0=1,R1=1(即12位分辨率),用户可根据需要改写配置寄存器以获得合适的分辨率。
表 3.2 分辨率关系表
R0 0 0 1 1 R1 0 1 0 1 分辨率/bit 9 10 11 12 最大转换时间/us 93.75 187.5 375 750 高速暂存存储器由9个字节组成,其分配如表3.2所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表3.3所示。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。
表3.3 DS18B20存储器
温度LSB 温度MSB TH
TL 保留 保留 计数寄存器 计数寄存器 8位CRC 3.6 HC-SR04超声波测距模块
1.概述
HC-SR04超声波测距模块可实现2cm~4.5m的非接触测距功能,拥有2.4~5.5V的宽电压输入范围,静态功耗低于2mA,自带温度传感器对测距结果进行校正,同时具有GPIO,串口等多种通信方式,内带看门狗,工作稳定可靠。 主要技术参数如下表:
表3.4主要技术参数
13
基于温度补偿的超声波测距设计
电气参数 HC-SR04超声波测距模块 工作电压 静态电流 工作温度 输出方式 感应角度 探测距离 探测精度 UART模式下串口配置 DC 2.4V~5.5V 2mA -20~+70度 电平或UART(跳线帽选择) 小于15度 2cm-450cm 0.3cm+1% 波特率9600,起始位1位,停止位1位,数据位8位,无奇偶校验,无流控制。 本模块实物图及尺寸如图3.10所示
图3.10 HC-SR04正反面图
本模块的尺寸:45mm*20mm*1.6mm。板上有两个半径为1mm的机械孔 2.电平触发测距工作原理
在模块上电前,首先去掉模式选择跳线上的跳线帽,使模块处于电平触发模式。 电平触发测距的时序如图3.11所示:
14
基于温度补偿的超声波测距设计
图3.11 HC-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度。
15
基于温度补偿的超声波测距设计
3.7报警电路设计
如果距离小于1M,则单片机STC89C52则给P3.7口一个信号,使得报警电路工作,实现报警。如图3.11所示。
图3.11报警电路图
16
基于温度补偿的超声波测距设计
4 软件设计
4.1系统软件设计说明
进行测量控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每
个测量对象的实际需要设计应用程序。因此,软件设计在微机测量控制系统设计中占重要地位。本软件设计主要是对距离进行测量、显示。因此,整个软件可分为按照硬件电路对单片机位定义;发射子程序;接收子程序;显示子程序;延时子程序等。
4.2主程序的设计
17
基于温度补偿的超声波测距设计
图4.1主程序流程图
主程序首先是对系统环境初始化,设置定时器T0工作模式为16位定时计数器模式。置位总中断允许位EA并给显示端口P1和P3清0。然后调用超声波发生子程序送出一个超声波脉冲,为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延时约0.1 ms后,才打开外中断0接收返回的超声波信号。由于采用的是12 MHz的晶振,计数器每计 一个数就是1μs,当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按式计L=(△T/2)*V 算,即可得被测物体与测距仪之间的距离,设计时取20℃时的声速为344 m/s则有:L=(△T/2)*V =172T0/10000cm 其中,T0为计数器T0的计算值。 测出距离后结果将以十进制BCD码方式送往LCD显示约0.5s,然后再发超声波脉冲重复测量过程。
4.3超声波发射子程序和超声波接收中断子程序设计
超声波测距仪主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(即INT0引脚出现低电平),立即进入中断程序。进入中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将中断0关闭,并将测距成功标志字赋值2以表示此次测距不成功。
18
基于温度补偿的超声波测距设计
图4.2外部中断流程图
4.4温度测量子程序设计
DS18B20对时序和电性参数要求很高, 所以单片机在通过单总线接口访问 DS18B20时, 其工作流程必需要遵守严格的操作时序,如果顺序中任意一步缺少 或顺序错乱, DS18B20将不会响应。DS18B20的操作顺序是: 第一步: 对 DS18B20初始化; 第二步: 发送ROM 命令;第三步: 发送功能命令。超声波测距系统上电后,单片机开始初始化 DS18B20,检测现场温度,软件控制 DS18B20的具体流程如图 4.3所示。
图4.3 DS18B20总体操作流程
19
基于温度补偿的超声波测距设计
4.5报警子程序
如果距离小于下限或大于上限,则单片机STC89C52则给IO口一个信号,使得
报警电路工作,实现报警。
图4.4 报警子程序
4.6距离计算子程序
本段程序中temp是从DS18BB0读取的16位二进制温度数值,在对速度进行温度补偿的时候需要根据DS18B20协议转换成浮点数tp。 void calculater() {
float v; //声速 float tp; //温度 time=TH0*256+TL0; TH0=0;
20
基于温度补偿的超声波测距设计
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结果
设计的最终结果是使超声波测距仪能够产生超声波,实现超声波的发送与接收,从而实现利用超声波方法测量物体间的距离,以数字的形式显示测量距离。
经过实验表明,这套系统软硬件设计合理、抗干扰能力较好、实时性良好,实验结果比较符合预期要求。
21
基于温度补偿的超声波测距设计
5.2结论
采用高精度的温度传感器 DS18B20可实现对超声波测距系统的温度测量和补偿,即根据经验公式,对波速进行校正。通过引入DS18B20,使超声波测距系统的测量精度有了很大的提高, 使得应用领域也有所扩展,其不仅可用于倒车雷达、物位测量等一般场合, 且在移动机器人领域将会有广泛的应用前景。
致谢
随着论文的完成,我的大学生活,也得以划下了完美的句点。经过几个月的查找资料、整理材料、设计方案和写论文,今天终于可以顺利的完成论文的最后的谢辞了。
设计得以完成,要感谢的人实在太多了,在本次毕业设计的过程中非常感谢周荣生老师的细心指导。导师渊博的专业知识,严谨的治学态度,精益求精的工作作风,对我影响深远,不仅使我树立了远大的学术目标、掌握了基本的研究方
22
基于温度补偿的超声波测距设计
法,还使我明白了许多待人接物与为人处世的道理。
本论文从选题到完成,每一步都是在周老师的指导下完成的,倾注了大量的心血。在此,谨向赵老师表示崇高的敬意和衷心的感谢!赵老师要指导很多同学的设计,加上本来就有的教学任务,工作量之大可想而知,但在一次次的教导中,使我在设计之外明白了做学问所应有的态度。
同时,设计的顺利完成,离不开其它各位老师、同学和朋友的关心和帮助,感谢徐静、胡燕同学给予我的帮助。在整个的设计中,各位老师、同学和朋友积极的帮助我查资料,提供有利于论文写作的建议和意见,在他们的帮助下,设计得以不断的完善,最终帮助我顺利的写完论文。
通过此次的设计,我学到了很多知识,在设计过程中,通过查资料和搜集有关的文献,培养了自学能力和动手能力,由被动的接受知识转换为主动的寻求知识,这是学习方法上的一个很大的突破。通过毕业设计,我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好的处理知识和实践相结合的问题。
最后再一次感谢所有在毕业设计中曾经帮助过我的良师益友和同学,以及在设计中被我引用或参考的论著的作者。
参考文献
[1]赵晓安. MCS-51单片机原理及应用. 天津:天津大学出版社,2001.3 [2] 夏继强. 单片机实验与实践教程. 北京:北京航空航天大学出版社, 2001 [3] 余锡存、曹国华,单片机原理及接口技术,陕西: 西安电子科技大学出版社, 2002.8
[4] 李建忠,单片机原理及应用,陕西:西安电子科技大学出版社,2004.1
23
基于温度补偿的超声波测距设计
[5] 肖来胜、冯建兰,单片机技术实用教程 ,武汉:华中科技大学出版社, 2004.10 [6] 蔡美琴、张为民,MSC-51系列单片机系统及其应用,北京:高等教育出版社(第二版),北京,2005.7v
[7] 李华. MCS -51系列单片机实用接口技术[M] . 北京:北京航空航天大学出版社,1993
[8] 周航慈. 单片机应用程序设计技术[M] . 北京:北京航空航天大学出版社,1991
附录
附录一: 总原理图
24
基于温度补偿的超声波测距设计
附录二:
程序清单
#include #define uint unsigned int #define uchar unsigned char typedef unsigned char Uchar; typedef unsigned int Uint16; #define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80) #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40) //液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口) sbit en=P1^0; sbit rs=P1^1; sbit DQ_A=P3^7; //温度数据线 //校时按键与C51的引脚连接定义 sbit qh=P2^0; //切换键 sbit set=P2^1; //设置键 sbit add=P2^2; //加键 sbit dec=P2^3; //减键 sbit alarm=P2^7; //蜂鸣器,通过三极管9012驱动,端口低电平响 sbit red=P2^4; sbit green=P2^6; sbit RX=P3^3; sbit TX=P3^2; 25 基于温度补偿的超声波测距设计 uchar code tab1[]= {\"System loading \ uchar code tab2[]= {\"Distance system \ uchar code wd[] = {\"Temp: \uchar code jl[] = {\"Dis : CM \ uchar code yz[] = {\"SH: CMSL: CM\阈值固定符 uchar code qk[] = {\" \ uint tempa,temp;//tempa用于读取温度值 int sh=400,sl=2; uint time; unsigned long dis; float rate; uchar flag_qh,key_num; bit flag_set=0,flag=0; //延时函数,后面经常调用 void delayms(uint xms)//延时函数,有参函数 { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); } /********液晶写入指令函数与写入数据函数,以后可调用**************/ void write_com(uchar com)//****液晶写入指令函数**** { rs=0;//数据/指令选择置为指令 //rw=0; //读写选择置为写 P0=com;//送入数据 delayms(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delayms(1); en=0;//en由高变低,产生下降沿,液晶执行命令 }void write_data(uchar dat)//***液晶写入数据函数**** { rs=1;//数据/指令选择置为数据 //rw=0; //读写选择置为写 P0=dat;//送入数据 delayms(1); en=1; //en置高电平,为制造下降沿做准备 delayms(1); en=0; //en由高变低,产生下降沿,液晶执行命令} void Lcd_cls() { uchar i; write_com(er); for(i=0;i<16;i++) 26 基于温度补偿的超声波测距设计 { write_data(qk[i])}} //**************************************DS18B20温度采集时序程序 void delay_us(Uint16 t)//12MHz晶振 { while(t--);} void Init_18b20_A(void) { Uchar n; 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); } void write_byte_A(Uchar dat) { Uchar i; 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); } Uchar read_byte_A(void) { Uchar i,value; for(i=0;i<8;i++) { DQ_A=0; value>>=1; DQ_A=1; // if(DQ_A) value|=0x80; delay_us(4);} return value;} void get_temp_A(void) 左右 线与 27 基于温度补偿的超声波测距设计 {uchar a,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 } //=======================两声提示音 ======================== void TwoAlarm(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; } //---------------------------------------第一个-----------------------------------------// void fir_disp(void) { uchar i; Lcd_cls(); write_com(er); for(i=0;i<16;i++) { write_data(jl[i]); } } //------------第二个界面程序--------// void sec_disp() {uchar i; alarm=1;red=1; Lcd_cls(); write_com(er); for(i=0;i<16;i++) 28 界 面程序 基于温度补偿的超声波测距设计 {write_data(yz[i]);}} //------------第三个界面程序--------// void thi_disp() {uchar i; 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); } //---------切换键扫描程序--------// void keyscan_qh() {if(qh==0) {delayms(5); if(qh==0) {flag_qh++;} while(qh==0);} if(flag_qh==3) {flag_qh=0;}} void keyscan_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) 29 基于温度补偿的超声波测距设计 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);}}}}} void write_TA(uchar addr,uint dat) {write_com(er+addr); write_data(0x30+dat/100); write_data(0x30+dat%100/10); write_data(0x2e); write_data(0x30+dat%10);} 30 基于温度补偿的超声波测距设计 /********************************************************/ void StartModule() //启动模块 {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;} /********************************************************/ void Conut(void) {uchar num; time=TH0*256+TL0; TH0=0; TL0=0; //if(100 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); 31 基于温度补偿的超声波测距设计 for(num=0;num<6;num++) write_data(0x2e);//显示点} else { write_com(er+6); write_data(0x30+dis/100); write_data(0x30+dis%100/10); write_data(0x30+dis%10); write_data('C'); write_data('M'); write_data(' '); }} //-----------------------------检测程序-----------------------------// void chk() {if(dis>sl&&dis {TwoAlarm();}} void delay_80ms() {unsigned char ms=80; unsigned char i=100,j; for(;ms;ms--) {while(--i) {j=10; while(--j);}}} //----------------------主程序-----------------------// void main() { Uchar i; //---------------T0初始化---------------// TMOD=0x01; //设T0为方式1,GATE=1; TH0=0; TL0=0; ET0=1; //允许T0中断 EA=1; //开启总中断 //---------------1602LCD初始化---------------// en=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); //----------------系统登录------------------// write_com(yh); for(i=0;i<16;i++) { write_data(tab1[i]); 32 基于温度补偿的超声波测距设计 } write_com(er+10); for(i=0;i<6;i++) { write_data('.'); delayms(1000); } write_com(0x01); write_com(yh); for(i=0;i<16;i++) { write_data(tab2[i]); } while(1) { fir_disp(); do { get_temp_A(); StartModule(); while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); //计算 delay_80ms(); //80MS chk(); keyscan_qh(); }while(flag_qh==0); sec_disp(); do { write_com(er+3); write_data(0x30+sh/100); write_data(0x30+sh%100/10); write_data(0x30+sh%10); write_com(er+11); write_data(0x30+sl/100); write_data(0x30+sl%100/10); write_data(0x30+sl%10); do { keyscan_set(); }while(flag_set); 33 基于温度补偿的超声波测距设计 keyscan_qh(); }while(flag_qh==1); thi_disp(); do { get_temp_A(); write_TA(6,tempa); keyscan_qh(); }while(flag_qh==2); } } void t0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 { flag=1; //中断溢出标志 } 34 因篇幅问题不能全部显示,请点此查看更多更全内容