基于单片机的超声波测距仪

前言

随着我国科学技术的迅速发展,许多场合都需要测距仪器的应用,如汽车倒车,建筑工地的施工以及一些工业现场的位置监控,还有矿井深度、水位位置、管道长度等场合都需要用到测距仪器。要求仪器简单,方便,易操作控制,而超声波测距仪,就能实现以上的要求。它测量范围在0.10-1.20m,测量精度1cm,测量时仪器与被测物体不会直接接触,而且能够清晰稳定的在液晶显示屏上显示出测量结果。

但就目前整体的技术水平来说,人们可以具体利用的测距技术还十分有限。因此,这是一个正在蓬勃发展而又有无限前景的技术及产业领域。展望未来数十年,超声波测距仪作为一种新型的非常重要且有用的工具在各方面都将有很大的发展空间,它将朝着更加高定位高精度的方向发展,以满足日益发展的社会需求。

本设计采用以AT89C51单片机为控制器核心的高精度、低成本、微型化数字显示超声波测距仪的硬件电路和软件设计方法。整个电路采用模块化设计,由主程序、中断程序、发射子程序、接收子程序、显示子程序等模块组成。各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。

1 总体方案设计介绍

所谓的超声波就是指频率高于20MHZ的机械波。既然是以超声波为检测工具,那么肯定要产生超声波和接受超声波的工具,这就需要用到我们的传感器,俗称探头。它有发射器和接收器之分,主要原理就是利用电效应把电能和超声波相互转换,利用声波介质对被检测物进行非接触式无磨损的检测。超声波传感器对透明或有色物体,金属或非金属物体,固体、液体、粉状物质均能检测。

本文所研究的超声波测距仪利用超声波指向性强、能量消耗缓慢、传播距离较远、中长距的高精度测距等优点,即用超声波发射器向某一方向发送超声波,将电能转换,发射超声波,同时在发射的时候单片机就开始计时,在超声波遇到障碍物的时候反射回来,超声波接收器在接收到反射回来的超声波回波时,将超生振动转换成电信号,同时单片机停止计时。超声波测距原理一般采用渡越时间法TOF,设超声波在空气中的传播速度为C,从发射到遇到障碍物反射回来在空气中的传播时间为T,声源与障碍物的距离为L,则易知L=C*T/2,这样可以测出声源与障碍物之间的距离,然后在LED显示屏上稳定的显示出来[1]。

传感器的工作机理是依据压电材料的正逆压电效应,利用逆压电效应产生超声波,即逆压电效应是在压电材料上加上某种特定频率的交变正弦信号,材料就会产生随所加

电压的变化规律而变化的机械形变,这种机械形变推动周围介质振动,产生疏密相间的机械波,如果其振动频率在超声范围内,这种机械波就是超声波[1]。

根据设计要求并综合各方面因素考虑,本文决定采用AT89C52单片机作为主控制器,超声波发射电路、超声波接收放大电路、显示电路,并用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器完成。超声波测距仪的系统硬件原理框图如图1-1所示。

图1-1 超声波测距系统硬件原理框图

超声波在标准空气中的传播速度为331.45米/秒,由单片机驱动产生12MHZ晶振,所以此系统理论上可以达到毫米级。由发射器发送超声波出去,在遇到障碍物反射回来时的回波由接收器检测到信号,然后经过滤波、放大、整形之后送入AT89C52单片机进行计算,并将计算结果显示到LED液晶显示屏上。超声波发生器可以分为两大类:一类是用电气方式产生超声波;另一类是用机械方式产生超声波。电气方式包括压电型、电动型等;机械方式有加尔统笛、液 和气流旋笛等。它们所产生的超声波的频率,功率和声波特性各不相同,因而用途也各不相同。本文属于近距离测量,适合汽车的倒车雷

达,故可采用常用的压电式超声波换能器[2]。

2 超声波的相关知识

2.1 超声波测距仪的主要功能概述[3]:

★ 实时稳定显示当前测量距离;

★ 实时稳定显示当前测量温度;

★ 具有近距离和远距离两种测量模式;

★ 能够实时报警功能;

★ 具有开机系统自检功能;

★ 耗电量低;

★ 可靠性高;

★ 高灵敏度和高声压

2.2 超声波测距仪的主要技术指标

测量距离:0.20m-1.3m

测温范围:-10℃~115℃

测量距离精度:1cm

实时功率:0.05W

标准频率:40kHz

声压级:120±3(公式:S.P.L.= 20logP/Pre (dB))

系统发射功率:1mW(max)

工作电流:80mA(min)、90mA(max)

输入电源电压:5V

3 系统设计原理[4]

超声波测距其实有很多的方法,包括声波幅值检测法、相位检测法、以及往返时间检测法等等,声波幅值检测法容易受到反射波损耗的映像,相位检测法虽然精度高,但是检测范围有限,所以本系统采用往返时间检测法,其原理就是利用超声波在空气介质中的传播速度,测量声波从发射到遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离,进而达到测距的效果。

测距的公式表示为:L=C*T/2 (3-1) 式中L为被测量的距离长度;C为超声波在空气中的传播速度;T为测量距离传播的时间差(T为发射到接收之间时间数值的两倍)。要想利用超声波准确的测得发射点与障碍物之间的实际距离,那么就应该准确的测得超声波在空气介质中得实际传播速度。

我们知道超声波是要随环境中的气压和介质温度的变化而变化,一般情况下受大气压力的影响非常小,但是受温度的影响确实非常大的,例如在摄氏0度时其传播速度为331.45m/s,在摄氏20度时其传播速度为343.869m/s,在摄氏30度时其传播速度为349.176m/s,具体参考表1。故要考虑到温度给实际测量带来的影响,尽量使测距准确性大大提高,本方案中采用测量温度的方法来补偿声速,即用测温元件测量实际环境的温度来校正声速,这就是温度补偿法。其中超声波在空气中的传播速度和温度有如下的关系:

V=331.4+0.607T m/s T-℃ (3-2) 其中V为超声波在该温度下的实际传播速度(单位为 m/s),T为摄氏温度。当温度知道的情况下,通过该式就可以知道该温度下超声波的传播速度了。

4 超声波测距系统的硬件组成

4.1 控制芯片的选择[5]

一般情况下采用AT89C51单片机,但是他的资源有限,只有4K的程序存储空间和两个定时器,而它的兄弟模块AT89C52单片机兼容MCS51指令系统,内部集成了8K的可反复擦写的程序存储空间(Flash ROM),四个8位的双向I/O口,256x8bit内部RAM,2个串行中断,可编程UART串行通道,中断源增加一个,即额外增加了一个定时器/计数器 T2,而且有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。

AT89C52支持串口程序下载,具有操作简便、价格便宜、应用简单等许多优点。因此我们选用这一型号的单片机作为控制器实现对超声波模组进行控制,然后单片机不停 的检测INT0引脚,当INT0引脚的电平由高电平变为低电平时就认为超声波已经返回。单片机用P1.0端口输出超声波换能器所需的40kHz的方波信号,占空比50%,连续发10个波(3-15个波都可以),然后拉低(或拉高)50mS以上,接着再输出,如此循环。利用外中断0口监测超声波接收电路输出的返回信号。采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差,是后面计算的基础。计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离。控制电路如图4.1-1所示。

图4.1-1 超声波控制电路

4.2 超声波发射电路[6]

MAX232是美国MAXIM公司专为串口路通信设计的芯片,它能将TTL电平和RS232电平相互转换,具有功耗低,只需要单一 +5V电源供电,供电电流5mA;内部集成2个RS-232C驱动器,高集成度,片外最低只需4个电容即可工作,所以这里超声波发射电路采用基于MAX232的方波发射电路。电路前级主要由一块反向器芯片74LS04和超声波发射探头T构成,74LS04内部具有6个独立的反相器,通过将外部管脚的组合连接来实现对单片机发出的超声发射探头激励信号进行功率放大处理;单片机P1.0端口输出超声波转化器所需的40KHz方波信号,占空比为50%的方波信号,一路通过74LS04内部一级反向器后送到超声波发射探头T的一个电极,另一路经两极反向器后送到超声波换能器的另一个电极。用这种推挽形式将方波信号反相叠加到超声波换能器的两端,可以将超声波发射强度提高一倍。同时输出端两路信号都采用两个反向器并联得方式,这样可以提高超声脉冲的驱动能力。上拉电阻R10、R11一端接上正5V电源,另一端连

接超声波发射探头T的一极,一方面可以提高反向器74LS04输出高电平的驱动能力,使发射探头发射超声波的能力更强;另一方面还可以增加超声波发射探头T的自身阻尼效果,缩短其自由振荡的时间得到更加完整的超声脉冲波形,这样驱动MAX232实现从TTL电平到RS232电平的转换,具体电平转换图4.2-1所示[10]

图4.2-1 MAX232电平转换图

图4.2-2 基于MAX232的超声波发射电路

由于发射到换能器的电压高,波形比较完整,因此可以达到很高的发射功率与效率,可以测量到比较远的距离,同时用这个电路发射方波,电路工作稳定,适合单电源供电,功耗也非常小。所以我们采用这个方案作为发射电路。电路图如图4.2-2所示。

4.3 超声波接收电路[7]

超声波接收电路所用的芯片,我们采用SONY公司生产的红外接收专用芯片CX20106A(内部结构如图4.3-1所示),它采用集成接收芯片对超声波回波信号进行放

大和整形,由于红外线的载波频率和测距超声波频率40MKz非常接近,且具有很高的灵敏度和较强的抗干扰能力,可以利用它作为超声波接收电路。外围电路简单易于实现,同时减少了生产调试的麻烦,因此我采用这个接收方案。

图4.3-1 CX20106内部结构

当超声波接收头收到发射信号时,便通过CX20106进行前置放大、限幅放大、带通滤波、峰值检波和比较、积分及施密特触发比较得到解调处理后的信号。7脚为信号输出口,没收到信号时为高电平,收到后变为低电平,之后又恢复高电平。(a)为接收信号,(b)为有源峰值检波,如图4.3-2所示。

图4.3-2 信号图

CX20106A内部集成了前置放大与限幅放大,总增益可达80dB,带通滤波电路,峰值检波,噪声抑制电路,自动增益控制电路和波形整形电路。芯片CX20106A的2引脚与GND之间连接RC串联网络,它们是负反馈串联网络的一个组成部分,改变它们的数值便能改变芯片内部前置放大器的增益和频率特性,调整外部电阻R6可以的调整它的接收中心频率与增益,当R6阻值越大时,滤波器的中心频率越低。当取R6=200kΩ时,

fn≈42kHz,若取R6=220kΩ,则中心频率f0≈38kHz。增大电阻R或是通过调整外部的电容C2,都将使负反馈量增大,放大倍数下降,反之则放大倍数增大。这样便可以调节超声波接收探头R的接收灵敏度。但电容C的改变会影响到频率特性,一般在实际使用中不必改动,直接使用推荐的参数值R=4.7Ω,C=3.3μF。它工作稳定,灵敏度高,功耗小,接收回波能力强,所以我采用这个方案作为接收电路。超声波接收电路如图4.3-3所示。

图4.3-3 基于CX20106A的超声波接收电路

4.4 温度检测模块

检测模块采用DALLAS 公司生产的1-Wire,即以数字温度传感器DS18B20为核心,是单总线器件,具有线路简单,体积小的特点。如果用它来组成一个测温系统,具有线路简单,在一根通信线上,外部可以挂很多这样的数字温度计,并实现双向通讯。

4.4.1数字温度传感器DS18B20的特点

★ 数字温度传感器DS18B20具有很多特点,轻松准确实现测温。

★ 只要求一个I/O 口即可实现多个信号同线传输,。

★ 适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电,

[8]

零功耗。

★ 简单网络化温度感知,可测量温度范围在-55 到+125摄氏度间,在-10~+85℃时精度为±0.5℃。DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。

★ 数字温度计的分辨率用户可以从9 位到12 位选择,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。

★ 在DS18B20 中的每个器件上都有独一无二的序列号。

★ 内部有温度上、下限告警设置。

4.4.2 DS18B20的引脚功能

数字温度传感器DS18B20详细引脚功能描述如下。

★ GND 地信号。

★ I/Q数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,也可以向器件提供电源。

★ VDD可选择的VDD 引脚。当依靠寄生电源时,此引脚必须接地,否则将被烧毁。 ★ 由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线上实现数据的双向传输通信,而对AT89C52 单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。

图4.4.2-1 DS18B20温度检测电路

本系统用外部寄生电源连接数据线的供电方式,即2脚接一个4.7K的上拉电阻到VCC,DS18B20的1脚GND和3脚分别接地和VCC电源,这样有有一个方便之处就是检测温度的范围将增大。温度检测电路如图4.4.2-1所示。

4.5 显示电路

液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电 就有显示,这样即可以显示出图形。由于LCD1602模块独有的蓝色背光电路可以在环境光线较弱的条件下应用,画面显示清晰,价格便宜,颜色靓丽的特点,是很好的显示设备。同时,还能够根据情况来调节显示的亮度。由于本系统可以不用显示汉字,介于设计成本上的需要,我采用了这个显示方案。

4.5.1 LCD1602引脚功能说明

4.5.2 LCD1602主要技术参数

LCD液晶显示电路采用LCD1602液晶显示模块,它的显示容量为2×16个字符,最佳工作电压为5V,工作电流2mA,通过单片机控制将所测的频率信号读数显示出来,字符尺寸为2.95×4.35(W×H)mm,完全可以满足我们的设计要求。

4.5.3 LCD1602的一般初始化过程

延时15mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

以后每次写指令、读/写数据操作均需要检测忙信号 写指令38H:显示模式设置 写指令08H:显示关闭 写指令01H:显示清屏

写指令06H:显示光标移动设置 写指令0CH:显示开及光标设置 4.5.4液晶显示模块

LCD1602液晶显示模块如下图4.5.3-1所示。

图4.5.2-1 LCD1602液晶显示模

5软件设计

5.1 主程序

超声波测距仪的软件设计主要由主程序,中断服务子程序组成。主程序包括超声波温度补偿子程序,计算子程序,显示子程序。中断服务子程序主要完成计数值的读取、距离计算等工作。

主程序主要是开始要对系统初始化,第一是设置定时器T0工作模式为16位定时/计数器模式,置位总中断允许位EA并对显示端口P0和P2清0;第二是调用超声波发生子程序循环发送4个40MKz的超声波脉冲,并开始计时。为了避免超声波从发射器直接传到接收器引起的直射波,需要延时约0.1ms后才可打开外中断0接收返回的超声波信号。第三是第三读取外界环境的温度,由该温度确定环境中的超声波传输速度。第四等待中断,若超声波被接收探头捕捉到,那么通过中断可测得超声波在环境中的传播时长。由于采用的是12MHz的晶振,计数器每计一个数就是1us,所以当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按测距公式计算,即可得被测物体与测距器之间的实际距离[9]。主程序流程图如图5.1-1所示。

图5.1-1 主程序流程

5.2超声波接受和发射子程序[10]

超声波发生子程序包括定时中断服务子程序(如图5.3-1所示)和外部中断服务子程序(如图5.3-2所示)。

图5.3-1 定时中断服务子程序

图5.3-2 外部中断服务子程序

它们的作用是通过P1.0端口发送2个左右的超声波信号频率约40KHz的方波,脉冲宽度为12us左右,同时把计数器T0打开进行计时。超声波测距器主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(INT0引脚出现低电平),立即进入中断程序。进入该中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2以表示此次测距不成功。

6 系统测试

6.1 调试

超声波测距器的制作和调试都较为简单,其中超声波发射和接收采用ø15的超声波换能器TCT40—10F1(T发射)和TCT40—10S1(R接收),中心频率为40KHz,安装时应保持两换能器中心轴线平行并相距4~8cm,其余元件无特殊要求。若能将超声接收电路用金属壳屏蔽起来,则可提高抗干扰性能。根据测量范围要求不同,可适当地调整与接收换能器并接的滤波电容C4的大小,以获得合适的接收灵敏度和抗干扰能力。

硬件电路制作完成并调整好后,便可将程序编译好下载到单片机试运行。根据实际情况,可以修改超声波子程序每次发送的脉冲个数和两次测量的间隔时间,以适应不同距离的测量需要。 6.2 性能分析

虽然结果和预想的有很大的差距,但总体来说已经基本上达到了要求,理想上超声波测距能达到5到7米左右,而我们所能实现的最大距离只有3米,造成这种原因我想有以下几点:

★ 由于我们采用的是11.0592MHZ的晶振,理论上是按照12MHZ的晶振计算的,所以对系统造成了一定的误差。

★ 由于温度传感器DS18B20距离单片机较近,所采集到的温度严重受到单片机的影响,造成系统误差

6.3 超声波测距注意问题及改善方法

★超声波在空气中传播经过多条相隔很近的路径多次来回影响,解决方法有两个:第一是超声波发射间隔时间增长;第二就是超声波发射模块做小,同时探头T与R平行于电路板,减小其来回反射路径。

★ 提高超声波发射功率,可以增加测量距离,可以采用变压器实现升压。 ★ 超声波发射头和接收头由于靠的很近,容易受到发射的干扰,应该尽量避免余波的干扰。 从图13中可以看到,当发射超声波脉冲时,几乎在同一时刻收到了。解决

方法:一个是增加T/R之间的安装距离,第二就是软件解决,在发射完后,延长一段时间再开启检测超声波发射的信号。这就是超声波存在最小测量距离的主要原因。

★ 避免手接触超声波电路板,容易产生干扰。 ★ 提高电源的稳定性。

★ 测量距离时,应尽量保证,传感器轴线与被测物表面垂直。

★ 实际测距范围与被测物表面材料有关,一般不要测量表面为毛料的物体表面。

图11 发射波和反射波示意图

7 总结

在本论文的制作过程中,我发现我在此只考虑了环境温度对超声波速度的影响,如果能将其它环境因素(如:气压、湿度等)考虑进去和采用更精密的温度传感器,在测量精度可以有很大的提高,误差可以越接近于“0”。由于超声波的发射功率有限,在最大测量范围指标上尚未达到要求,这可以通过加大发射功率得到解决。不过经设计后的超声波测距仪仍然具有使用方便、操作简单、读数直观、精度高、成本低、性价比高、具有系统诊断功能等特点。既可随身携带,又可远程控制,人机界面友好,应用范围广。如可用在精度需要比较高的场合:自动气象站中水气日蒸发量的测试,水位或液面测量。也可用于安防系统中,如:汽车“雷达”。还可配合PC或GSM无线模块应用于无线远距离环境测量系统,实现远距离的操控以及数据的远距离传输。

经过本论文的设计制作,我学会了很多东西,更加坚定了认真严谨的工作态度。虽然我遇到各种各样的困难,但我没有放弃,我查阅网上和图书馆资料,请教老师相关问题,最终凭着严谨认真的科研态度,创新求实的科学精神,克服了这种种困难。同时,多得各位老师和同学的耐心分析和指导,尤其是杨梅老师给予了我很大的帮助!为此,我们要向我的指导老师杨梅老师表示由衷的感谢,在她的耐心帮助下,我终于顺利地完成我们的这次设计制作!

附录一:超声波测距系统原理图

附录二:超声波测距PCB图

附录三:超声波测距主程序 #include

#define uchar unsigned char #define uint unsigned int sbit d8=P2^7; sbit d1=P2^0; sbit d2=P2^2; sbit d3=P2^4; sbit fang=P3^1;

sbit ds=P1^4; //define ds18b20 sbit lcden=P1^0; sbit lcdrs=P1^2;

uchar table[]="TMP:"; uchar table1[]="distance:";

uchar table2[]="0123456789.`CM"; double TT; float S6;

uint temp,temp1,time,V,S; uint S5[3],temp2[3];

uchar A1,A2,A3,S1,S2,S3,S4,timeh,timel,flag; /************延时**********/ void delay(uint z) {

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--); }

/*********初始化DSB18B20********/ void dsreset() {

uint i; ds=0; i=103;

while(i>0) i--; ds=1; i=4;

while(i>0) i--; }

/**********read a bit******/ bit tmpreadbit() {

uint i; bit dat; ds=0; i++; ds=1; i++;i++;

dat=ds;

i=8;

while(i>0) i--;

return(dat);

}

/*********read a byte********/

uchar tmpread()

{

uchar i,j,dat;

dat=0;

for(i=1;i

{

j=tmpreadbit();

dat=(j>1);

}

return(dat);

}

/********** write a byte *********/

void tmpwritebyte(uchar dat)

{

uint i;

uchar j;

bit testb;

for(j=1;j

{

testb=dat&0x01;

dat=dat>>1;

if(testb)

{

ds=0;

i++;i++;

ds=1;

i=8;

while(i>0) i--;

}

else

{

ds=0;

i=8;

while(i>0) i--;

ds=1;

i++; i++;

}

}

}

/********** temchange 温度转换命令******/

void tmpchange()

{

dsreset();

delay(1);

tmpwritebyte(0xcc);

tmpwritebyte(0x44);

}

/*******get tmp******/

uint gettmp()

{

float tt;

uchar a,b;

dsreset();

delay(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe);

a=tmpread();

b=tmpread();

temp=b;

temp

temp=temp|a;

tt=temp*0.0625;

temp=tt*10+0.5;

return temp;

}

/********** fen li******/

void display1(uint temp)

{

A1=temp/100;

A2=(temp%100)/10;

A3=temp%10;

}

void display2(uint S)

{

S1=S/1000;

S2=S%1000/100;

S3=S%100/10;

S4=S%10;

}

/**************write a data***********/

void write_data(uchar date)

{

lcdrs=1; //rs =1

P0=date;

delay(5);

lcden=1; //EN 一个高脉冲写入

delay(5);

lcden=0;

}

/**************write a command*******/

void write_com(uchar com) //液晶写指令

{

lcdrs=0; //RS =0

P0=com; //送指令

delay(5);

lcden=1; //EN 一个高脉冲写入

delay(5);

lcden=0;

}

/*********init lcd***********/

void init() //初始化液晶

{

uchar i;

lcden=0;i++;i++;

write_com(0x38);

i++; i--;

write_com(0x0e); //光标不闪烁指令

i++;i--;

write_com(0x06);

i++;i--;

write_com(0x01); //清除所有指令

i++;i--;

}

void xianshi()

{

uchar a;

init();

write_com(0x80+3);

delay(5);

for(a=0;a

{

write_data(table[a]);

delay(5);

}

write_com(0x80+11);

delay(5);

for(a=11;a

{

write_data(table2[a]);

delay(5);

}

write_com(0x80+9);

delay(5);

write_data(table2[10]);

delay(5);

write_com(0xc0);

delay(5);

for(a=0;a

{

write_data(table1[a]);

delay(5);

}

write_com(0xc0+11);

delay(5);

write_data(table2[10]);

delay(5);

write_com(0xc0+14);

delay(5);

write_data('M');

delay(5);

}

void xianshi1()

{

write_com(0x80+7);

delay(5);

write_data(table2[A1]);

delay(5);

write_data(table2[A2]);

delay(5);

write_com(0x80+10);

delay(5);

write_data(table2[A3]);

delay(5);

if(S1>0)

{

write_com(0xc0+9);

delay(5);

write_data(table2[S1]);

delay(5);

write_data(table2[S2]);

delay(5);

write_com(0xc0+12);

delay(5);

write_data(table2[S3]);

delay(5);

write_data(table2[S4]);

delay(5);

}

else

{

write_com(0xc0+10);

delay(5);

write_data(table2[S2]);

delay(5);

write_com(0xc0+12);

delay(5);

write_data(table2[S3]);

delay(5);

write_data(table2[S4]);

delay(5);

}

}

void send()

{

uchar i,j,k;

EX1=0;

TH0=0;

TL0=0x01;

for(i=15;i>0;i--)

{

fang=1;

j=5; while(j>0) j--;

fang=0;

j=4; while(j>0) j--;

}

TR0=1; //启动定时器0

j=250; while(j>0) j--;

IE1=0;

EX1=1; //开外部中断1

for(k=2;k>0;k--) //等待中断回波

for(i=255;i>0;i--)

for(j=255;j>0;j--);

}

void baojing()

{

if(S6>=1.0)

{

d1=1;

d2=0;

}

if(S6=0.5)

{

d1=1;

d2=1;

}

if(S6

{

d2=1;

d1=0;

}

}

void exter1(void) interrupt 2

{

EX1=0;

TR0=0;

timeh=TH0;

timel=TL0;

TH0=0;

TL0=0x01;

d8=0;

flag=1;

}

void main()

{

uchar i;

EA=1;//开总中断

TMOD=0x01;//设置T0为工作方式1

TH0=0;

TL0=0x01; // 赋初值

EX1=0; //开外部中断1

IT1=1; //设置为下降沿触发中断

IE1=0;

xianshi();

while(1)

{

for(i=0;i

{

ss:

send();

if(flag==0)

goto ss;

EX1=0;

flag=0;

time=timeh*256;

time=time+timel;

TT=(time*(0.0001));

tmpchange(); //发送温度转换命令

temp2[i]=gettmp(); //获得温度

V=(33240+(6*temp2[i]));

V=(V/200+0.5);

S5[i]=((V*TT)+(0.5));

V=0;

TT=0;

delay(200);

}

} } for(i=0;i

参考文献

[1] 张毅刚:基于超声波的实例应用,哈尔滨工业大学出版社,2000.6,P79-P86

[2] 楼然苗、李光飞:51系列单片机设计实例,北京航空航天大学出版社,2003.3,P23-P32

[3] 孔雅琼:基于单片机的超声波测距仪研究与开发,国防科技大学出版社,2008. 9,P37

[4] 陈萤:基于单片机的超声测距系统,华中科技大学出版社,2006. 7,P24-P33

[5] 王巧芝:51单片机开发应用从入门到精通,中国铁道出版社,2011.4,P106-P113

[6] 永学:串口通信技术实例,北京航空航天大学出版社2005.2,P5

[7] 白顺先:超声波测距系统的设计与实现[J],机械工业出版社,2000.3,P28-P32

[8] 何希才:传感器及其应用实例,机械工业出版社2004.2,P22

[9] 何小海、刘嘉勇:微型计算机原理与接口技术,四川大学出版社,2008.5,P253-P305

[10] 宋永东、周美丽、白宗文:高精度超声波测距系统设计,现代电子技术出版社,2008.6,P15-P32

前言

随着我国科学技术的迅速发展,许多场合都需要测距仪器的应用,如汽车倒车,建筑工地的施工以及一些工业现场的位置监控,还有矿井深度、水位位置、管道长度等场合都需要用到测距仪器。要求仪器简单,方便,易操作控制,而超声波测距仪,就能实现以上的要求。它测量范围在0.10-1.20m,测量精度1cm,测量时仪器与被测物体不会直接接触,而且能够清晰稳定的在液晶显示屏上显示出测量结果。

但就目前整体的技术水平来说,人们可以具体利用的测距技术还十分有限。因此,这是一个正在蓬勃发展而又有无限前景的技术及产业领域。展望未来数十年,超声波测距仪作为一种新型的非常重要且有用的工具在各方面都将有很大的发展空间,它将朝着更加高定位高精度的方向发展,以满足日益发展的社会需求。

本设计采用以AT89C51单片机为控制器核心的高精度、低成本、微型化数字显示超声波测距仪的硬件电路和软件设计方法。整个电路采用模块化设计,由主程序、中断程序、发射子程序、接收子程序、显示子程序等模块组成。各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。

1 总体方案设计介绍

所谓的超声波就是指频率高于20MHZ的机械波。既然是以超声波为检测工具,那么肯定要产生超声波和接受超声波的工具,这就需要用到我们的传感器,俗称探头。它有发射器和接收器之分,主要原理就是利用电效应把电能和超声波相互转换,利用声波介质对被检测物进行非接触式无磨损的检测。超声波传感器对透明或有色物体,金属或非金属物体,固体、液体、粉状物质均能检测。

本文所研究的超声波测距仪利用超声波指向性强、能量消耗缓慢、传播距离较远、中长距的高精度测距等优点,即用超声波发射器向某一方向发送超声波,将电能转换,发射超声波,同时在发射的时候单片机就开始计时,在超声波遇到障碍物的时候反射回来,超声波接收器在接收到反射回来的超声波回波时,将超生振动转换成电信号,同时单片机停止计时。超声波测距原理一般采用渡越时间法TOF,设超声波在空气中的传播速度为C,从发射到遇到障碍物反射回来在空气中的传播时间为T,声源与障碍物的距离为L,则易知L=C*T/2,这样可以测出声源与障碍物之间的距离,然后在LED显示屏上稳定的显示出来[1]。

传感器的工作机理是依据压电材料的正逆压电效应,利用逆压电效应产生超声波,即逆压电效应是在压电材料上加上某种特定频率的交变正弦信号,材料就会产生随所加

电压的变化规律而变化的机械形变,这种机械形变推动周围介质振动,产生疏密相间的机械波,如果其振动频率在超声范围内,这种机械波就是超声波[1]。

根据设计要求并综合各方面因素考虑,本文决定采用AT89C52单片机作为主控制器,超声波发射电路、超声波接收放大电路、显示电路,并用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器完成。超声波测距仪的系统硬件原理框图如图1-1所示。

图1-1 超声波测距系统硬件原理框图

超声波在标准空气中的传播速度为331.45米/秒,由单片机驱动产生12MHZ晶振,所以此系统理论上可以达到毫米级。由发射器发送超声波出去,在遇到障碍物反射回来时的回波由接收器检测到信号,然后经过滤波、放大、整形之后送入AT89C52单片机进行计算,并将计算结果显示到LED液晶显示屏上。超声波发生器可以分为两大类:一类是用电气方式产生超声波;另一类是用机械方式产生超声波。电气方式包括压电型、电动型等;机械方式有加尔统笛、液 和气流旋笛等。它们所产生的超声波的频率,功率和声波特性各不相同,因而用途也各不相同。本文属于近距离测量,适合汽车的倒车雷

达,故可采用常用的压电式超声波换能器[2]。

2 超声波的相关知识

2.1 超声波测距仪的主要功能概述[3]:

★ 实时稳定显示当前测量距离;

★ 实时稳定显示当前测量温度;

★ 具有近距离和远距离两种测量模式;

★ 能够实时报警功能;

★ 具有开机系统自检功能;

★ 耗电量低;

★ 可靠性高;

★ 高灵敏度和高声压

2.2 超声波测距仪的主要技术指标

测量距离:0.20m-1.3m

测温范围:-10℃~115℃

测量距离精度:1cm

实时功率:0.05W

标准频率:40kHz

声压级:120±3(公式:S.P.L.= 20logP/Pre (dB))

系统发射功率:1mW(max)

工作电流:80mA(min)、90mA(max)

输入电源电压:5V

3 系统设计原理[4]

超声波测距其实有很多的方法,包括声波幅值检测法、相位检测法、以及往返时间检测法等等,声波幅值检测法容易受到反射波损耗的映像,相位检测法虽然精度高,但是检测范围有限,所以本系统采用往返时间检测法,其原理就是利用超声波在空气介质中的传播速度,测量声波从发射到遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离,进而达到测距的效果。

测距的公式表示为:L=C*T/2 (3-1) 式中L为被测量的距离长度;C为超声波在空气中的传播速度;T为测量距离传播的时间差(T为发射到接收之间时间数值的两倍)。要想利用超声波准确的测得发射点与障碍物之间的实际距离,那么就应该准确的测得超声波在空气介质中得实际传播速度。

我们知道超声波是要随环境中的气压和介质温度的变化而变化,一般情况下受大气压力的影响非常小,但是受温度的影响确实非常大的,例如在摄氏0度时其传播速度为331.45m/s,在摄氏20度时其传播速度为343.869m/s,在摄氏30度时其传播速度为349.176m/s,具体参考表1。故要考虑到温度给实际测量带来的影响,尽量使测距准确性大大提高,本方案中采用测量温度的方法来补偿声速,即用测温元件测量实际环境的温度来校正声速,这就是温度补偿法。其中超声波在空气中的传播速度和温度有如下的关系:

V=331.4+0.607T m/s T-℃ (3-2) 其中V为超声波在该温度下的实际传播速度(单位为 m/s),T为摄氏温度。当温度知道的情况下,通过该式就可以知道该温度下超声波的传播速度了。

4 超声波测距系统的硬件组成

4.1 控制芯片的选择[5]

一般情况下采用AT89C51单片机,但是他的资源有限,只有4K的程序存储空间和两个定时器,而它的兄弟模块AT89C52单片机兼容MCS51指令系统,内部集成了8K的可反复擦写的程序存储空间(Flash ROM),四个8位的双向I/O口,256x8bit内部RAM,2个串行中断,可编程UART串行通道,中断源增加一个,即额外增加了一个定时器/计数器 T2,而且有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。

AT89C52支持串口程序下载,具有操作简便、价格便宜、应用简单等许多优点。因此我们选用这一型号的单片机作为控制器实现对超声波模组进行控制,然后单片机不停 的检测INT0引脚,当INT0引脚的电平由高电平变为低电平时就认为超声波已经返回。单片机用P1.0端口输出超声波换能器所需的40kHz的方波信号,占空比50%,连续发10个波(3-15个波都可以),然后拉低(或拉高)50mS以上,接着再输出,如此循环。利用外中断0口监测超声波接收电路输出的返回信号。采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差,是后面计算的基础。计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离。控制电路如图4.1-1所示。

图4.1-1 超声波控制电路

4.2 超声波发射电路[6]

MAX232是美国MAXIM公司专为串口路通信设计的芯片,它能将TTL电平和RS232电平相互转换,具有功耗低,只需要单一 +5V电源供电,供电电流5mA;内部集成2个RS-232C驱动器,高集成度,片外最低只需4个电容即可工作,所以这里超声波发射电路采用基于MAX232的方波发射电路。电路前级主要由一块反向器芯片74LS04和超声波发射探头T构成,74LS04内部具有6个独立的反相器,通过将外部管脚的组合连接来实现对单片机发出的超声发射探头激励信号进行功率放大处理;单片机P1.0端口输出超声波转化器所需的40KHz方波信号,占空比为50%的方波信号,一路通过74LS04内部一级反向器后送到超声波发射探头T的一个电极,另一路经两极反向器后送到超声波换能器的另一个电极。用这种推挽形式将方波信号反相叠加到超声波换能器的两端,可以将超声波发射强度提高一倍。同时输出端两路信号都采用两个反向器并联得方式,这样可以提高超声脉冲的驱动能力。上拉电阻R10、R11一端接上正5V电源,另一端连

接超声波发射探头T的一极,一方面可以提高反向器74LS04输出高电平的驱动能力,使发射探头发射超声波的能力更强;另一方面还可以增加超声波发射探头T的自身阻尼效果,缩短其自由振荡的时间得到更加完整的超声脉冲波形,这样驱动MAX232实现从TTL电平到RS232电平的转换,具体电平转换图4.2-1所示[10]

图4.2-1 MAX232电平转换图

图4.2-2 基于MAX232的超声波发射电路

由于发射到换能器的电压高,波形比较完整,因此可以达到很高的发射功率与效率,可以测量到比较远的距离,同时用这个电路发射方波,电路工作稳定,适合单电源供电,功耗也非常小。所以我们采用这个方案作为发射电路。电路图如图4.2-2所示。

4.3 超声波接收电路[7]

超声波接收电路所用的芯片,我们采用SONY公司生产的红外接收专用芯片CX20106A(内部结构如图4.3-1所示),它采用集成接收芯片对超声波回波信号进行放

大和整形,由于红外线的载波频率和测距超声波频率40MKz非常接近,且具有很高的灵敏度和较强的抗干扰能力,可以利用它作为超声波接收电路。外围电路简单易于实现,同时减少了生产调试的麻烦,因此我采用这个接收方案。

图4.3-1 CX20106内部结构

当超声波接收头收到发射信号时,便通过CX20106进行前置放大、限幅放大、带通滤波、峰值检波和比较、积分及施密特触发比较得到解调处理后的信号。7脚为信号输出口,没收到信号时为高电平,收到后变为低电平,之后又恢复高电平。(a)为接收信号,(b)为有源峰值检波,如图4.3-2所示。

图4.3-2 信号图

CX20106A内部集成了前置放大与限幅放大,总增益可达80dB,带通滤波电路,峰值检波,噪声抑制电路,自动增益控制电路和波形整形电路。芯片CX20106A的2引脚与GND之间连接RC串联网络,它们是负反馈串联网络的一个组成部分,改变它们的数值便能改变芯片内部前置放大器的增益和频率特性,调整外部电阻R6可以的调整它的接收中心频率与增益,当R6阻值越大时,滤波器的中心频率越低。当取R6=200kΩ时,

fn≈42kHz,若取R6=220kΩ,则中心频率f0≈38kHz。增大电阻R或是通过调整外部的电容C2,都将使负反馈量增大,放大倍数下降,反之则放大倍数增大。这样便可以调节超声波接收探头R的接收灵敏度。但电容C的改变会影响到频率特性,一般在实际使用中不必改动,直接使用推荐的参数值R=4.7Ω,C=3.3μF。它工作稳定,灵敏度高,功耗小,接收回波能力强,所以我采用这个方案作为接收电路。超声波接收电路如图4.3-3所示。

图4.3-3 基于CX20106A的超声波接收电路

4.4 温度检测模块

检测模块采用DALLAS 公司生产的1-Wire,即以数字温度传感器DS18B20为核心,是单总线器件,具有线路简单,体积小的特点。如果用它来组成一个测温系统,具有线路简单,在一根通信线上,外部可以挂很多这样的数字温度计,并实现双向通讯。

4.4.1数字温度传感器DS18B20的特点

★ 数字温度传感器DS18B20具有很多特点,轻松准确实现测温。

★ 只要求一个I/O 口即可实现多个信号同线传输,。

★ 适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电,

[8]

零功耗。

★ 简单网络化温度感知,可测量温度范围在-55 到+125摄氏度间,在-10~+85℃时精度为±0.5℃。DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。

★ 数字温度计的分辨率用户可以从9 位到12 位选择,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。

★ 在DS18B20 中的每个器件上都有独一无二的序列号。

★ 内部有温度上、下限告警设置。

4.4.2 DS18B20的引脚功能

数字温度传感器DS18B20详细引脚功能描述如下。

★ GND 地信号。

★ I/Q数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,也可以向器件提供电源。

★ VDD可选择的VDD 引脚。当依靠寄生电源时,此引脚必须接地,否则将被烧毁。 ★ 由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线上实现数据的双向传输通信,而对AT89C52 单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。

图4.4.2-1 DS18B20温度检测电路

本系统用外部寄生电源连接数据线的供电方式,即2脚接一个4.7K的上拉电阻到VCC,DS18B20的1脚GND和3脚分别接地和VCC电源,这样有有一个方便之处就是检测温度的范围将增大。温度检测电路如图4.4.2-1所示。

4.5 显示电路

液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电 就有显示,这样即可以显示出图形。由于LCD1602模块独有的蓝色背光电路可以在环境光线较弱的条件下应用,画面显示清晰,价格便宜,颜色靓丽的特点,是很好的显示设备。同时,还能够根据情况来调节显示的亮度。由于本系统可以不用显示汉字,介于设计成本上的需要,我采用了这个显示方案。

4.5.1 LCD1602引脚功能说明

4.5.2 LCD1602主要技术参数

LCD液晶显示电路采用LCD1602液晶显示模块,它的显示容量为2×16个字符,最佳工作电压为5V,工作电流2mA,通过单片机控制将所测的频率信号读数显示出来,字符尺寸为2.95×4.35(W×H)mm,完全可以满足我们的设计要求。

4.5.3 LCD1602的一般初始化过程

延时15mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

以后每次写指令、读/写数据操作均需要检测忙信号 写指令38H:显示模式设置 写指令08H:显示关闭 写指令01H:显示清屏

写指令06H:显示光标移动设置 写指令0CH:显示开及光标设置 4.5.4液晶显示模块

LCD1602液晶显示模块如下图4.5.3-1所示。

图4.5.2-1 LCD1602液晶显示模

5软件设计

5.1 主程序

超声波测距仪的软件设计主要由主程序,中断服务子程序组成。主程序包括超声波温度补偿子程序,计算子程序,显示子程序。中断服务子程序主要完成计数值的读取、距离计算等工作。

主程序主要是开始要对系统初始化,第一是设置定时器T0工作模式为16位定时/计数器模式,置位总中断允许位EA并对显示端口P0和P2清0;第二是调用超声波发生子程序循环发送4个40MKz的超声波脉冲,并开始计时。为了避免超声波从发射器直接传到接收器引起的直射波,需要延时约0.1ms后才可打开外中断0接收返回的超声波信号。第三是第三读取外界环境的温度,由该温度确定环境中的超声波传输速度。第四等待中断,若超声波被接收探头捕捉到,那么通过中断可测得超声波在环境中的传播时长。由于采用的是12MHz的晶振,计数器每计一个数就是1us,所以当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按测距公式计算,即可得被测物体与测距器之间的实际距离[9]。主程序流程图如图5.1-1所示。

图5.1-1 主程序流程

5.2超声波接受和发射子程序[10]

超声波发生子程序包括定时中断服务子程序(如图5.3-1所示)和外部中断服务子程序(如图5.3-2所示)。

图5.3-1 定时中断服务子程序

图5.3-2 外部中断服务子程序

它们的作用是通过P1.0端口发送2个左右的超声波信号频率约40KHz的方波,脉冲宽度为12us左右,同时把计数器T0打开进行计时。超声波测距器主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(INT0引脚出现低电平),立即进入中断程序。进入该中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2以表示此次测距不成功。

6 系统测试

6.1 调试

超声波测距器的制作和调试都较为简单,其中超声波发射和接收采用ø15的超声波换能器TCT40—10F1(T发射)和TCT40—10S1(R接收),中心频率为40KHz,安装时应保持两换能器中心轴线平行并相距4~8cm,其余元件无特殊要求。若能将超声接收电路用金属壳屏蔽起来,则可提高抗干扰性能。根据测量范围要求不同,可适当地调整与接收换能器并接的滤波电容C4的大小,以获得合适的接收灵敏度和抗干扰能力。

硬件电路制作完成并调整好后,便可将程序编译好下载到单片机试运行。根据实际情况,可以修改超声波子程序每次发送的脉冲个数和两次测量的间隔时间,以适应不同距离的测量需要。 6.2 性能分析

虽然结果和预想的有很大的差距,但总体来说已经基本上达到了要求,理想上超声波测距能达到5到7米左右,而我们所能实现的最大距离只有3米,造成这种原因我想有以下几点:

★ 由于我们采用的是11.0592MHZ的晶振,理论上是按照12MHZ的晶振计算的,所以对系统造成了一定的误差。

★ 由于温度传感器DS18B20距离单片机较近,所采集到的温度严重受到单片机的影响,造成系统误差

6.3 超声波测距注意问题及改善方法

★超声波在空气中传播经过多条相隔很近的路径多次来回影响,解决方法有两个:第一是超声波发射间隔时间增长;第二就是超声波发射模块做小,同时探头T与R平行于电路板,减小其来回反射路径。

★ 提高超声波发射功率,可以增加测量距离,可以采用变压器实现升压。 ★ 超声波发射头和接收头由于靠的很近,容易受到发射的干扰,应该尽量避免余波的干扰。 从图13中可以看到,当发射超声波脉冲时,几乎在同一时刻收到了。解决

方法:一个是增加T/R之间的安装距离,第二就是软件解决,在发射完后,延长一段时间再开启检测超声波发射的信号。这就是超声波存在最小测量距离的主要原因。

★ 避免手接触超声波电路板,容易产生干扰。 ★ 提高电源的稳定性。

★ 测量距离时,应尽量保证,传感器轴线与被测物表面垂直。

★ 实际测距范围与被测物表面材料有关,一般不要测量表面为毛料的物体表面。

图11 发射波和反射波示意图

7 总结

在本论文的制作过程中,我发现我在此只考虑了环境温度对超声波速度的影响,如果能将其它环境因素(如:气压、湿度等)考虑进去和采用更精密的温度传感器,在测量精度可以有很大的提高,误差可以越接近于“0”。由于超声波的发射功率有限,在最大测量范围指标上尚未达到要求,这可以通过加大发射功率得到解决。不过经设计后的超声波测距仪仍然具有使用方便、操作简单、读数直观、精度高、成本低、性价比高、具有系统诊断功能等特点。既可随身携带,又可远程控制,人机界面友好,应用范围广。如可用在精度需要比较高的场合:自动气象站中水气日蒸发量的测试,水位或液面测量。也可用于安防系统中,如:汽车“雷达”。还可配合PC或GSM无线模块应用于无线远距离环境测量系统,实现远距离的操控以及数据的远距离传输。

经过本论文的设计制作,我学会了很多东西,更加坚定了认真严谨的工作态度。虽然我遇到各种各样的困难,但我没有放弃,我查阅网上和图书馆资料,请教老师相关问题,最终凭着严谨认真的科研态度,创新求实的科学精神,克服了这种种困难。同时,多得各位老师和同学的耐心分析和指导,尤其是杨梅老师给予了我很大的帮助!为此,我们要向我的指导老师杨梅老师表示由衷的感谢,在她的耐心帮助下,我终于顺利地完成我们的这次设计制作!

附录一:超声波测距系统原理图

附录二:超声波测距PCB图

附录三:超声波测距主程序 #include

#define uchar unsigned char #define uint unsigned int sbit d8=P2^7; sbit d1=P2^0; sbit d2=P2^2; sbit d3=P2^4; sbit fang=P3^1;

sbit ds=P1^4; //define ds18b20 sbit lcden=P1^0; sbit lcdrs=P1^2;

uchar table[]="TMP:"; uchar table1[]="distance:";

uchar table2[]="0123456789.`CM"; double TT; float S6;

uint temp,temp1,time,V,S; uint S5[3],temp2[3];

uchar A1,A2,A3,S1,S2,S3,S4,timeh,timel,flag; /************延时**********/ void delay(uint z) {

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--); }

/*********初始化DSB18B20********/ void dsreset() {

uint i; ds=0; i=103;

while(i>0) i--; ds=1; i=4;

while(i>0) i--; }

/**********read a bit******/ bit tmpreadbit() {

uint i; bit dat; ds=0; i++; ds=1; i++;i++;

dat=ds;

i=8;

while(i>0) i--;

return(dat);

}

/*********read a byte********/

uchar tmpread()

{

uchar i,j,dat;

dat=0;

for(i=1;i

{

j=tmpreadbit();

dat=(j>1);

}

return(dat);

}

/********** write a byte *********/

void tmpwritebyte(uchar dat)

{

uint i;

uchar j;

bit testb;

for(j=1;j

{

testb=dat&0x01;

dat=dat>>1;

if(testb)

{

ds=0;

i++;i++;

ds=1;

i=8;

while(i>0) i--;

}

else

{

ds=0;

i=8;

while(i>0) i--;

ds=1;

i++; i++;

}

}

}

/********** temchange 温度转换命令******/

void tmpchange()

{

dsreset();

delay(1);

tmpwritebyte(0xcc);

tmpwritebyte(0x44);

}

/*******get tmp******/

uint gettmp()

{

float tt;

uchar a,b;

dsreset();

delay(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe);

a=tmpread();

b=tmpread();

temp=b;

temp

temp=temp|a;

tt=temp*0.0625;

temp=tt*10+0.5;

return temp;

}

/********** fen li******/

void display1(uint temp)

{

A1=temp/100;

A2=(temp%100)/10;

A3=temp%10;

}

void display2(uint S)

{

S1=S/1000;

S2=S%1000/100;

S3=S%100/10;

S4=S%10;

}

/**************write a data***********/

void write_data(uchar date)

{

lcdrs=1; //rs =1

P0=date;

delay(5);

lcden=1; //EN 一个高脉冲写入

delay(5);

lcden=0;

}

/**************write a command*******/

void write_com(uchar com) //液晶写指令

{

lcdrs=0; //RS =0

P0=com; //送指令

delay(5);

lcden=1; //EN 一个高脉冲写入

delay(5);

lcden=0;

}

/*********init lcd***********/

void init() //初始化液晶

{

uchar i;

lcden=0;i++;i++;

write_com(0x38);

i++; i--;

write_com(0x0e); //光标不闪烁指令

i++;i--;

write_com(0x06);

i++;i--;

write_com(0x01); //清除所有指令

i++;i--;

}

void xianshi()

{

uchar a;

init();

write_com(0x80+3);

delay(5);

for(a=0;a

{

write_data(table[a]);

delay(5);

}

write_com(0x80+11);

delay(5);

for(a=11;a

{

write_data(table2[a]);

delay(5);

}

write_com(0x80+9);

delay(5);

write_data(table2[10]);

delay(5);

write_com(0xc0);

delay(5);

for(a=0;a

{

write_data(table1[a]);

delay(5);

}

write_com(0xc0+11);

delay(5);

write_data(table2[10]);

delay(5);

write_com(0xc0+14);

delay(5);

write_data('M');

delay(5);

}

void xianshi1()

{

write_com(0x80+7);

delay(5);

write_data(table2[A1]);

delay(5);

write_data(table2[A2]);

delay(5);

write_com(0x80+10);

delay(5);

write_data(table2[A3]);

delay(5);

if(S1>0)

{

write_com(0xc0+9);

delay(5);

write_data(table2[S1]);

delay(5);

write_data(table2[S2]);

delay(5);

write_com(0xc0+12);

delay(5);

write_data(table2[S3]);

delay(5);

write_data(table2[S4]);

delay(5);

}

else

{

write_com(0xc0+10);

delay(5);

write_data(table2[S2]);

delay(5);

write_com(0xc0+12);

delay(5);

write_data(table2[S3]);

delay(5);

write_data(table2[S4]);

delay(5);

}

}

void send()

{

uchar i,j,k;

EX1=0;

TH0=0;

TL0=0x01;

for(i=15;i>0;i--)

{

fang=1;

j=5; while(j>0) j--;

fang=0;

j=4; while(j>0) j--;

}

TR0=1; //启动定时器0

j=250; while(j>0) j--;

IE1=0;

EX1=1; //开外部中断1

for(k=2;k>0;k--) //等待中断回波

for(i=255;i>0;i--)

for(j=255;j>0;j--);

}

void baojing()

{

if(S6>=1.0)

{

d1=1;

d2=0;

}

if(S6=0.5)

{

d1=1;

d2=1;

}

if(S6

{

d2=1;

d1=0;

}

}

void exter1(void) interrupt 2

{

EX1=0;

TR0=0;

timeh=TH0;

timel=TL0;

TH0=0;

TL0=0x01;

d8=0;

flag=1;

}

void main()

{

uchar i;

EA=1;//开总中断

TMOD=0x01;//设置T0为工作方式1

TH0=0;

TL0=0x01; // 赋初值

EX1=0; //开外部中断1

IT1=1; //设置为下降沿触发中断

IE1=0;

xianshi();

while(1)

{

for(i=0;i

{

ss:

send();

if(flag==0)

goto ss;

EX1=0;

flag=0;

time=timeh*256;

time=time+timel;

TT=(time*(0.0001));

tmpchange(); //发送温度转换命令

temp2[i]=gettmp(); //获得温度

V=(33240+(6*temp2[i]));

V=(V/200+0.5);

S5[i]=((V*TT)+(0.5));

V=0;

TT=0;

delay(200);

}

} } for(i=0;i

参考文献

[1] 张毅刚:基于超声波的实例应用,哈尔滨工业大学出版社,2000.6,P79-P86

[2] 楼然苗、李光飞:51系列单片机设计实例,北京航空航天大学出版社,2003.3,P23-P32

[3] 孔雅琼:基于单片机的超声波测距仪研究与开发,国防科技大学出版社,2008. 9,P37

[4] 陈萤:基于单片机的超声测距系统,华中科技大学出版社,2006. 7,P24-P33

[5] 王巧芝:51单片机开发应用从入门到精通,中国铁道出版社,2011.4,P106-P113

[6] 永学:串口通信技术实例,北京航空航天大学出版社2005.2,P5

[7] 白顺先:超声波测距系统的设计与实现[J],机械工业出版社,2000.3,P28-P32

[8] 何希才:传感器及其应用实例,机械工业出版社2004.2,P22

[9] 何小海、刘嘉勇:微型计算机原理与接口技术,四川大学出版社,2008.5,P253-P305

[10] 宋永东、周美丽、白宗文:高精度超声波测距系统设计,现代电子技术出版社,2008.6,P15-P32


相关内容

  • 基于单片机的超声波传感器测距系统
  • 河北科技师范学院欧美学院 科技技能训练--------综述 姓 名 胡连 学 号 9310080311 专 业 电气工程及自动化 院 系 机电科学与工程系 指导老师 王宽 王枫 欧美学院机电科学与工程系 2011年7 月 基于单片机的超声波传感器测距系统 摘要 如今,拥有汽车的人越来越多,随之带来的 ...

  • 超声波测距
  • 现代测控技术课程设计 超声测距系统设计 学 院: 班 级: 姓名学号: 学 号: 指导教师: 利用超声波作为定位技术是蝙蝠等生物作为防御和捕捉猎物生存的手段,也就是由生物体发射不能被人们听到的超声波20Hz 以上的机械波,借助空气或其它介质传播.通过被待捕捉的猎物或障碍物反射回来的时间间隔长短和反射 ...

  • 基于单片机的超声波测距论文
  • 郑州轻院轻工职业学院 专科毕业论文 题 目 超声波测距 学生姓名 黄凯鹏 专业班级 电气自动化 学 号 院 (系) 电子信息技术系 指导教师(职称) 贾老师 完成时间 2010年 5 月 10日 1 超声波测距 摘 要 如今,拥有汽车的人越来越多,随之带来的交通隐患也越来越大,本文所设计的超声波汽车 ...

  • 基于STM32的可遥控智能跟随小车设计
  • 基于STM32的可遥控智能跟随小车设计 刘 磊 孙晓菲 张 煜 )(西南交通大学电气工程学院 成都 611756 摘 要:针对物品搬运时人类双手仍无法完全解放的现状,设计并实现了一种基于S超声波测距以及比例控TM32.制算法的可遥控智能跟随小车.小车以S有智能跟随和红外遥控2个模式可选.跟随模式下用 ...

  • 单片机毕业设计题目
  • 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机控制的数字气压计的设计与实现 8. 基于MSC1211的温度智能温度传感器 9. 机器视觉系统 ...

  • 自动化毕业设计论文题目
  • 自 动 化 毕 业 设 计 论 文 题 目 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机控制的数字气压计的设计与实现 8. 基于MSC12 ...

  • 通信工程毕业设计题目精选
  • 不管怎样,生活还是要继续向前走去.有的时候伤害和失败不见得是一件坏事,它会让你变得更好,孤单和失落亦是如此.每件事到最后一定会变成一件好事,只要你能够走到最后. 通信工程毕业设计题目精选 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激 ...

  • 电气自动化设计论文题目大全
  • 机电一体化 毕 业 设 计 论 文 题 目 第1-100个电气自动化毕业设计论文题目 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机控制的数 ...

  • 电气自动化毕业设计论文题目
  • 电 气 自 动 化 毕 业 设 计 论 文 题 目 第1-100个电气自动化毕业设计论文题目 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机 ...