广东机电职业技术学院
企业项目
(设计报告)
题目:基于51单片机的超声波测距仪的设计
院( 系 ) 信息工程学院
专业名称 控制0910
班级学号 07091034
学生姓名 王名远
指导教师 张永亮
二O一一 年 六 月
基于单片机的超声波测距仪的设计
摘要 自19世纪末到20世纪初,在物理学上发现了压电效应与反压电效应之后,人们解决了利用电子学技术产生超声波的办法,从此迅速揭开了发展与推广超声技术的历史篇章。随着科技的快速发展,超声波技术应用越来越广,很多产品在工业中广泛应用。
为了让超声波测距类产品智能,人性化,因此此次设计我们尝试利用STC89C52单片机研究制作超声波测距系统,超声波发射电路,以及超声波接收电路,键盘和显示部分,实现超声波测距功能。在这个系统中,我们先让超声波发射电路发射500us,大概20个脉冲信号,等到超声波接收电路接收到脉冲信号,计时结束,由程序上控制算法S=vt,测出距离S/2,送数码管显示,并满足一定精度要求,并在显示模块中显示出来,这类产品可以运用到工业产品中,例如:测试罐装饮料是否装满。结合了该芯片的价格、应用,我们设计的超声波测距系统具有速度快、适应性好,操作方便、有着广泛扩展应用的前景。
展望未来,超声波测距作为一种新型的非常重要有用的技术在各方面都将有很大的发展空间,它将朝着更加高定位、智能化的方向发展,以满足日益发展的社会需求。
关键字 超声波 STC89C52 模块电路
摘 要 ........................................... 错误!未定义书签。
目 录 ............................................................ 2
引 言 ............................................................ 3
第一章 超声波测距仪方案的设计 ................................... 4
1.1 系统整体方案的设计 ....................................... 4
1.2系统方案的论证 ............................................ 4
第二章 硬件电路的设计 ............................................ 5
2.1超声波发射电路的分析 ...................................... 5
2.2超声波接收电路的分析 ...................................... 6
2.3DS18B20的电路分析 ......................................... 6
2.4显示电路的分析 ........................... 错误!未定义书签。
第三章 系统程序的设计 ............................................ 9
3.1超声波测距器的算法设计 .................................... 9
3.2超声波测距器原理图 ........................................ 9
3.3主程序算法设计 ........................................... 10
3.4主程序的流程图 ........................................... 10
3.5超声波发生子程序和超声波接收中断程序 ..................... 11
第4章 电路与程序的调试......................................... 11
第5章 系统误差的分析............................................ 12
5.1声速引起的误差 ........................................... 12
5.2单片机时间分辨率的影响 ................................... 13 总结 ............................................................ 14 参考文献 ........................................................ 15
附录A .......................................................... 16
附录B .......................................................... 17
附录C .......................................................... 18
附录D .......................................................... 20
超声技术是一门以物理、电子、机械、及材料学为基础的通用技术之一。超声技术是通过超声波产生、传播及接收的物理过程而完成的。超声波具有聚束、定向及反射、透射等特性。 声检测技术是利用超声波在媒质中的传播特性(声速、衰减、反射、声阻抗等)来实现对非声学量(如密度、浓度、强度、弹性、硬度、粘度、温度、流速、流量、液位、厚度、缺陷等)的测定。它的基本原理是基于超声波在介质中传播时遇到不同的介面,将产生反射,折射,绕射,衰减等现象,从而使传播的声时,振幅,波形,频率等发生相应变化,测定这些规律的变化,便可得到材料的某些性质与内部构造情况。与传统超声技术完全不同,在不破坏媒质特性的情况下实现非接触性测量,适应能力强,可实现在线测量。
近二、三十年,特别是近十年来,由于电子技术及压电陶瓷材料的发展,使超声检测技术得到了迅速的发展。在无损探伤,测温,测距,流量测量,液体成分测量,岩体检测等方面,新的超声检测仪表不断出现,应用领域也不断扩大。本文正是基于这一应用背景。超声波由于其指向性强、能量消耗缓慢、传播距离较远等优点,而经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。超声波测距主要应用于倒车雷达、建筑施工工地以及一些工业现场,例如:液位、井深、管道长度等场合。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在测控系统的研制上也得到了广泛的应用。本文介绍一种以SPCE061A单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路设计方法。
超声波测距是一种传统而实用的非接触测量方法和激光,涡流和无线电测距方法相比,具有不受外界光及电磁场等因素的影响的优点,在比较恶劣的环境中也具有一定的适应能力,且结构简单,成本低,因此在工业控制,建筑测量,机器人定位等方面得到了广泛的应用但由于超声波传播声时难于精确捕捉,温度对声速的影响等原因,使得超声波测距的精度受到了很大的影响,限制了超声测距系统在测量精度要求更高的场合下的应用。
本文对超声波传感器测距的可能性进行了理论分析,利用模拟电子、数字电子、微机接口、超声波测试原理、DS18B20的原理、74ls164的传输原理等知识,设计出基于单片机STC89C52的超声波测距仪的硬件电路,编写好相应的软件程序,对硬件电路和软件程序作出相应的调试,确保超声波测距仪的可靠性。
第一章 超声波测距仪方案的设计
1.1系统整体方案的设计
由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。利用超声波检测距离,设计比较方便,计算处理也比较简单,并且在测量精度方面也能达到工业生产等自动化的使用要求。
超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、电动型等;机械方式有加尔统笛、气流旋笛等。他们所产生的超声波的频率、功率、和声波的特性各不相同,因而用途也各不相同。目前在近距离测量方面常用的是压电式超声波换能器。根据设计要求并综合各方面因素,本文采用STC89C52单片机作为控制器。用动态扫描法实现LED数字显示,超声波驱动信号是由单片机端口控制555时基发生器产生40KHz的脉冲信号。
1.2系统整体方案的论证
超声波测距的原理是利用超声波的发射与接收,根据超声波传播的时间来计算出传播距离。实用的测距方法有两种,一种是在被测距的两端,一端发射,另一端接受的直接波方式,适用于身高计;一种是发射波被物体发射回来后接收的反射波方式,适用与测距仪。此次设计采用反射波方式。
测距仪的分辨率取决于对超声波传感器的选择。超声波传感器是一种采用压电效应的传感器,采用的材料是压电陶瓷。由于超声波在空气中传播时会有相当的衰减,衰减的程度与频率的高低成正比;而频率高,分辨率也高,故短距离测量时应选择频率高的传感器,而长距离的测量时应用低频率的传感器。
第二章 硬件电路的设计
我们的超声波测距仪主要由:超声波发射电路、超声波接受电路、温度测量电路、显示电路、单片机最小系统组成。
2.1 超声波发射电路的分析
超声波发射电路的前置电路是由一个555无稳态电路组成的多谐振荡器,它是一种是间接反馈型,振荡电阻是连在电源VCC上的555电路,它是用来产生方波信号的。它的特点是: “RA-7-RB-6.2-C”RA与ACC相连,VD与RB并联。其计算公式为:
T1=0.693RA*C
T2=0.693RB*C
RA=RB时,T1=T2
F=0.722/(RA*C)
超声波发射电路的后半部分主要由非门组成的电路,其中作用是:
两组非门是倒相的,使负载上可以得到两种方向的电流,峰峰值为电源的两倍。
非门并联是为了提高输出电流驱动能力,也就是提高输出功率。
2.2 超声波接收电路的分析
发射头发射出去的超声波经障碍物反射后,反射到接收头,而接收到的波形幅度非常小,所以在回波处理电路中,把接收到的波形放大了10000倍,用的LM347搭成的两级交流放大电路。经放大后的波形送入检波电路 ,射随后经LM347比较器;经比较器调理后的波形成为方波,可送给STC89C52的EXT1外部中断。在模块电路的设计中一定要注意,超声波发射头和接收头之间的干扰;一般压电式的超声波换能器都会存在余波的干扰,发射头和接收头间要有20cm的距离;而在发射头发射超声波后的3ms内,接收头会一直接收到发射头传过来的非反射波,这是干扰波,在软件处理的时候一定要注意清除掉此类的干扰。
2.3 温度测量电路的分析
DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
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℃和0.0625℃,可实现高精度测温。
(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。
(8)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
2.4 显示电路的分析
在计算机控制中,显示装置是一个重要组成部分,主要用来显示生产过程的工艺状况与运行结果,以便于现场工作人员的正确操作。常用的显示器件有显示记录仪、发光二极管显示器LED、液晶显示器LCD、大屏幕显示器和图形显示器终端CRT。
此设计的显示电路为:
74LS164驱动LED动态显示电路。
其工作原理:
首先由I/O口(1)送出数字3的段选码4FH即数据01001111到4个LED共同的段选线上,接着由I/O口(2)送出位选码××××0111到位选线上,其中数据的高4位为无效的×,唯有送入左边第一个LED的COM端D3为低电平“0”,因此只有该LED的发光管因阳极接受到高电平“1”的g、d、c、b、a段有电流流过而被点亮,也就是显示出数字3,而其余3个LED因其COM端均为高电平“1”而无法点亮;显示一定时间后,再由I/O口(1)送出数字4的段选码66H即 01100110到段选线上,接着由I/O口(2)送出点亮左边第二个LED的位选码××××1011到位选线上,此时只有该LED的发光管因阳极接受到高电平“1”的g、f、c、b段有电流流过因而被点亮,也就是显示出数字4,而其余3位LED不亮;如此再依次送出第三个LED、第四个LED的段选与位选的扫描代码,就能一一分别点亮各个LED,使4个LED从左至右依次显示3、4、5、6。
第三章 系统程序的设计
超声波测距器的软件设计主要由主程序、超声波程序发生子程序、超声波接收中断程序及显示子程序组成。由于C语言程序有利于实现较复杂的算法,汇编语言程序则具有较高的效率并且容易精确计算程序运行的时间,而超声波测距器的程序既有较复杂的计算(计算距离时),又要求精确计算程序运行时间(超声波测距时),所以控制程序可采用C语言和汇编语言混合编程。下面对超声波测距器的算法。
3.1超声波测距器的算法设计
距离计算公式:d=s/2=(vt)/2
其中d是被测物与测距器的距离;s是超声波的来回路程,v是超声波在当前温度下的速度,t是发送和接收超声波所经历的时间。声波在其传播介质中被定义为纵波。当声波受到尺寸大于其波长的目标物体阻挡时就会发生反射;反射波称为回声。假如声波在介质中传播的速度是已知的,而且声波从声源到达目标然后返回声源的时间可以测量得到,从声波到目标的距离就可以精确地计算出来。这就是本系统的测量原理。
3.2超声波测距器原理图
障碍物
T=0 °C,超声波在空气中的传播速度C1=331.45m/s,
C=331.45+0.61T (m/s) 式中 T:°C
3.3主程序算法设计
主程序首先要对系统环境初始化,设置定时器工作模式为16位定时、计数器模式,置位总中断允许位EA并对显示端口P0和P2清0;然后调用超声波发生子程序送出一个超声波脉冲。为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延迟0.1ms后才打开外中断0,接收返回的超声波信号。 由于采用12MHZ晶振,计数器每记一个数就是1us,计算当20℃时的超声波传输速度v=344m/s,则
d=(vt)/2=344t/2=(172T0/106)m=(172T0 /10000)cm
其中T0为中断T0的计数值。
测出距离后,结果以十进制BCD码方式送往LED显示约0.5S,然后再发出超声波脉冲重复测量。
3.4主程序的流程图
3.5超声波发生子程序和超声波接收中断程序
超声波发生子程序的作用是通过P1.0端口发送两个左右的超声波脉冲信号(频率约40KHZ的方波),脉冲宽度为12us左右,同时把计数器T0打开进行计时。超声波发生子程序较简单,但要求程序运行时间准确,所以采用汇编语言程序编程。
超声波测距主程序利用外中断0检测返回超声波信号,一旦接收到返回的超声波信号(即INT0引脚出现低电平),立即进入超声波接收中断程序。进入该中断后,就立即关闭计时器T0,停止计时,并将测距成功标志字赋1。
如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2,表示本次测距不成功。
第四章 电路与程序的调试
通过多次实验,对电路各部分进行了测量、调试和分析。
首先测试发射电路对信号放大的倍数,先用信号源给发射电路输入端一个40kHz的方波信号,峰-峰值为3.8V。经过发射电路后,其信号峰-峰值放大到10V左右。
40kHz的方波驱动超声波发射头发射超声波,经反射后由超声波接收头接收到40kHz的正弦波,由于声波在空气中传播时衰减,所以接收到的波形幅值较低,经接收电路放大,整形,最后输出一负跳变,在单片机的外部中断源输入端产生一个中断请求信号。
该测距电路的40kHz方波由单片机编程产生,方波的周期为1/40ms,即25µs,半周期为12.5µs。每隔半周期时间,让方波输出脚的电平取反,便可产生40kHz方波。由于12M晶振的单片机的时间分辨率是1µs,所以只能产生半周期为12µs或13µs的方波信号,频率分别为41.67kHz和38.46kHz。本系统在编程时选用了后者,让单片机产生约38.46kHz的方波。
按照设计的原理,我们选用了LM324比较器接收到的信号进行放大,但是无
论如何调整电路,都无法将信号放大。然后我们查看了LM324的芯片手册,我们发现,当信号达到40KHz左右的时候,LM324基本放大不了信号,这是因为LM324的带宽不够大。我们在网上搜索资料,找到一款管脚、功能都与LM324相同的芯片——LM347。此款芯片为宽带比较器,可以放大40KHz的信号。使输出信号达到3.8V左右,使单片机工作。
当我们将电路完全调试成功之后,我们对超声波测距仪的显示数据进行测量,我们发现显示电路显示的数值与实际测出的数值有偏差,经过对电路的分析,我们诊断出超声波接收电路上存在着干扰,我们对电路加入103瓷片电容,进行对电路干扰的消除。
第五章 系统的误差分析
5.1声速引起的误差
声波是媒质中传播的质点的位置、压强和密度对相应静止值的扰动。高于20kHz 时的机械波称为超声波,媒质包括气体、液体和固体。流体中的声波常称为压缩波或压强波,对一般流体媒质而言,声波是一种纵波,传播速度为
Ec (5-1) 2
式(5-1)中E为媒质的弹性模量,单位kg/mm2;ρ为媒质的密度,单位kg/mm3;E 为复数,其虚数部分代表损耗; c也是复数,其实数部分代表传播速度,虚数部分则与衰减常数(每单位距离强度或幅度的衰减)有关,测量后者可求得媒质中的损耗。声波的传播与媒质的弹性模量密度、内耗以及形状大小(产生折射、反射、衍射等)有关。
从式(5-1)可知,声波传输速度与媒介的弹性模量和密度相关,因此,利用声速测量距离,就要考虑这些因素对声速影响。在气体中,压强、温度、湿度等因素会引起密度变化,气体中声速主要受密度影响,液体的深度、温度等因素会引起密度变化,固体中弹性模量对声速影响较密度影响更大,一般超声波在固体中传播速度最快,液体次之,在气体中的传播速度最慢。气体中声速受温度的影响最大。
声速受温度的影响为
cc01 (5-2) 2732
图5-1根据上式测量的温度-声速图。
图5-1 空气中温度-声速图
由式(5-2)和图5-1可见,当温度θ从0~40℃变化时,将会产生7%的声速变化,因此,为了提高测量准确度,计算时必须根据温度进行声速修正。工业测量中,一般用公式计算超声波在空气中的传播速度,即
c3310.6 (5-3)
5.2单片机时间分辨率的影响
不管是查询发射波与回波,还是由其触发单片机中断再通过软件启停定时器,都需要一定的时候,中断的方式误差相对要小一些。
相对而言,单片机的时间分辨率还是不太高,如晶振频率为12MHz时,时间分辨率为1µs。
随机误差
由于测量过程中的随机误差是按统计规律变化的,为了减少其影响,可 在同一位置处多次重复测量xi,然后取平均值x作为测量的真值[10]。
提高测距精度的方法
上节分析了超声波测距系统误差产生的一些原因,如何提高测量精度是超声测距的关键技术。其提高测距精度的措施如下:
1. 合理选择超声波工作频率、脉宽及脉冲发射周期。
据经验,超声测距的工作频率选择40kHz较为合适;发射脉宽一般应大于填充波周期的10 倍以上,考虑换能器通频带及抑制噪声的能力,选择发射脉宽
1ms;脉冲发射周期的选择主要考虑微机处理数据的速度,速度快,脉冲发射周期可选短些。
2. 在超声波接收回路中串入增益调节(AGC)及自动增益负反馈控制环节。 因超声接收波的幅值随传播距离的增大呈指数规律衰减,所以采用AGC电路使放大倍数随测距距离的增大呈指数规律增加的电路,使接收器波形的幅值不随测量距离的变化而大幅度的变化,采用电流负反馈环节能使接收波形更加稳定。
3. 提高计时精度,减少时间量化误差。
如采用芯片计时器,计时器的计数频率越高,则时间量化误差造成的测距误差就越小。例如:单片机内置计时器的计数频率只有晶振频率的十二分之一,当晶振频率6MHz时,计数频率为0.5MHz,此时在空气中的测距时间量化误差为0.68mm;当晶振频率为12MHz时,计数频率为1MHz,此时测距时间量化误差为0.34mm。若采用外部硬件计时电路,则计数频率可直接引用单片机的晶振频率,时间量化误差更小。
4. 补偿温度对传播声速的影响。超声波在介质中的传播速度与温度、压力等因数有关,其中温度的影响最大,因此需要对其进行补偿。
温度传感器LM92的温度测试分辨率为0.0625℃,-10℃至+85℃准确度为±1.0℃,I2C总线接口。用AT89C51的通用I/O端口能很容易的模拟I2C总线的读写时序,LM92高精度温度测量能很好的补偿超声波在不同温度的传播速度。
由LM92温度传感器和单片机组成的高精度超声波测距已应用在各种高精度测距的场合,如自动气象站中水气日蒸发量的测试、自动任意形状物体密度测试仪等,它具有测试速度快,能达到毫米级的测量精度等优点,在工程上的开发与应用前景广阔。
总结
本课题介绍了一种基于单片机的超声波测距系统的原理和设计。给出了硬件和软件的设计方案。
超声波传感器是本系统的核心器件,本论文详细地介绍了超声波传感器的原理、结构、检测方式以及它的一些特性。只有深入地了解超声波传感器的工作原理,才能更好的设计测距电路。单片机是本系统的控制部分,采用STC89C52 芯片驱动超声波传感器的40kHz的方波信号,由555多谢振荡器产生。本系
统的发射电路采用74HC04六反向器,通过它对单片机产生的方波信号进行放大,以驱动传感器工作。接收电路采用的是LM347,通过接收电路对接收到的信号进行放大和整形,最终再输出负脉冲给单片机响应中断程序。本系统的LED显示部分采用的是动态扫描方式,并用单片机软件译码。单片机内部采用C语言编程,方波信号的产生、时间差的读取、距离的计算以及显示输出的译码都由单片机编程完成。
本课题所设计的超声波测距系统具有测量精度较高、速度快、控制简单方便等优点。测距范围从20cm到200cm,测量精度在±10cm内。测距系统在许多工业现场和自动控制场合,都有很重要的作用。但由于经验不足,电路硬件、软件部分都有不够完善的地方,在今后的学习中会进一步改进。
总体来说,最重要的是在本课题的设计过程中我学到了很多知识,从中受益匪浅。了解了超声波传感器的原理,学会了各种放大电路的分析、设计,也掌握了单片机的开发过程和利用单片机设计电路的方法。对一块电路板的设计、焊板、调试、改进等整个过程,有了更深入的理解和掌握。这些对我今后的学习和工作都会有很大帮助的。
参考文献
1.刘凤然.基于单片机的超声波测距系统.传感器世界.2001,5:29-32
2.何希才,薛永毅.传感器及其应用实例.机械工业出版社,2004:138-152
3.胡汉才.单片机原理及其接口技术.清华大学出版社,2004:27-46
4.吴斌方,刘民,熊海斌.超声波测距传感器的研制.湖北工学院学报.2004,19(6):26-28
5.苏炜,龚壁建,潘笑.超声波测距误差分析.传感器技术.2004,23(6):8-11
6.罗忠辉,黄世庆.提高超声测距精度的方法. 机械设计与制造.2005,1:109
附录
附录A 实物图
超声波发射电路
超声波接收电路
显示电路
附录B PCB图
发射和接收电路
显示模块 附录
C
附录D
#include #include #include #define KeyData (P1|0xe0) #define KeyDown 1 //按键按下
#define KeyUp 0 //按键弹开
bit KeyFirst=1; //按键第一次按下
bit KeyState=KeyUp; //按键状态
uchar KeyValue; //键值 sbit CLK=P1^6; sbit DAT=P1^5;
sbit MeasureEn=P3^7; //超声波测距使能按键 uchar
TimeInitData[7]={5,5,10,14,4,5,1};
//时间芯片DS1302初始值
7}; uchar
code
DispCode[22]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x00};//0 1 ...9 0. 1. ... 9. - uchar NumCode[4]={0,0,0,0}; uchar
code
LedSelect[4]={0x01,0x02,0x04,0x08}; //数码管的为选通信号 int TimeData; int DispNum; int DispTemp;
uint Distance[3]={0,0,0}; 义三次测量结果数组 uchar T0Num;
uchar MeasureTime; 几次测量
bit FlagEndMeasure; 量完成一次的标志 bit Flag20ms=0; bit Flag50ms=0; bit Flag1s=0;
//测
//第//定
设定,秒,分,时,日,月,星期,年 //uchar
TimeBuff[7]={0,0,0,0,0,0,0}; extern bit FlagSgn;
//接收到的时间信息
//DS18B20正负温度标志
//启
uchar
TimeBuff[7]={11,22,33,44,55,66,7
void StartMeasured(); 动测距
void Measure3Times(); 动测距三次,并取中值
//启}
//--------------------------------------------------------- void Delayus(uint n) {
while(n--); //延时大约n*10us
//--------------------------------------------------------- void T0Init() {
TMOD=0x01;
TH0=(65536-5000)/256; //定时
}
//--------------------------------------------------------- void Send164(uchar Ch) //口线模拟时序,164送显示 {
uchar j; for(j=0;j
CLK=0; _nop_(); DAT=Ch&0x80; CLK=1; _nop_(); Ch
5ms,动态扫描 }
//--------------------------------------------------------- void T1Init() { 式 }
//--------------------------------------------------------- void Ex0Init() {
IT0=1; //外部中断0,边沿触发 EX0=0; EA=1; TH1=0; TL1=0; TR1=0;
TMOD|=0x10; //定时器1计数方TL0=(65536-5000)%256; TR0=1; ET0=1; EA=1;
}
//---------------------------------------------------------------------- void Disp4() 码管显示 {
static uchar j=0; Send164((DispCode[NumCode[j]]
//四个数
));//调出与显缓区数值相应的字型码 }
//------------------------------------------------------- void TempSendDisp() //送显温度 { }
//------------------------------------------------------- void DistanceSendDisp() //送显距离 {
if(FlagSgn==1) { } else { }
NumCode[1]=DispNum%1000/100; if(NumCode[1]==0) { }
NumCode[2]=DispNum%100/10+10; NumCode[3]=DispNum%10;
NumCode[1]=21; NumCode[0]=21; NumCode[0]=20;
P0=(P0&0xf0)|(LedSelect[j]); j++; j%=4;
0; }
NumCode[0]=DispNum/1000; if(NumCode[0]==0) { }
NumCode[1]=DispNum%1000/100+1
NumCode[0]=21;
NumCode[2]=DispNum%100/10; NumCode[3]=DispNum%10;
//------------------------------------------------------- void SendDisp() //送显数字 { }
//--------------------------------------------------------- void KeyScan(void) //键扫描 {
static uchar KeyBuff; NumCode[0]=DispNum/1000; NumCode[1]=DispNum%1000/100; NumCode[2]=DispNum%100/10; NumCode[3]=DispNum%10;
if(KeyData!=0xff) // 表示有键按下 {
if(KeyState!=KeyDown) {
if(KeyFirst==1) {
}
KeyBuff=KeyData; KeyFirst=0;
TempSendDisp(); break;
}
case 0x02://送显距离 { }
case 0x04://送显时分 {
DispNum=Distance[1]; DistanceSendDisp(); break;
else {
if(KeyData==KeyBuff)
{
KeyValue=~KeyData;
KeyState=KeyDown;
}
}
}
}
TimeData=TimeBuff[2]*100+Time
Buff[1];
TimeData=TimeBuff[4]*100+Time
}
case 0x08://送显月日 {
DispNum=TimeData; SendDisp(); break;
else
{ } }
//------------------------------------------------------- void KeyProcess() //键盘处理 {
switch (KeyValue) {
case 0x01: //送显温度 {
DispNum=DispTemp; KeyFirst=1; KeyState=KeyUp;
Buff[3];
}
case 0x10://送显年星期
DispNum=TimeData; SendDisp(); break;
{
TimeData=TimeBuff[6]*100+Time
Buff[5]; }
//--------------------------------------------------------- void StartMeasured() //启动超声波测距 {
MeasureEn=1;
Delayus(12); //延时120us,发 }
}
default: break;
DispNum=TimeData; SendDisp(); break;
//--------------------------------------------------------- void PaiXu() //三个测量结果排序 {
if((Distance[i])>=(Distance[iuint Temp; uchar i; for(i=0;i
+1]))
Distance[i]=Distance[i+1]; }
if((Distance[0])>=(Distance[1
}
Distance[i+1]=Temp; {
Temp=Distance[i];
射大约5个脉冲 }
//--------------------------------------------------------- void EndMeasured() //停止超声波测距 { }
TR1=0; EX0=0; MeasureEn=0; TH1=0; TL1=0; TR1=1;
Delayus(10); //延时100us EX0=1;
])) }
//--------------------------------------------------------- void Measure3Times() //启动三次测量,并取中值,送显示
{ }
Temp=Distance[0]; Distance[0]=Distance[1]; Distance[1]=Temp;
}
//--------------------------------------------------------- void main() {
//v_Set1302(WRITE_SECOND,&TimMeasureTime++; if(MeasureTime
MeasureTime=0; EndMeasured(); PaiXu(); StartMeasured();
}
if(Flag1s==1) {
Flag1s=0; Flag50ms=0; Measure3Times();
DispTemp=DS18B20_ReadTemp();
//v_Get1302(READ_SECOND,&Time
Buff[0],7); }
//--------------------------------------------------------- void T0Server() interrupt 1 {
if(Flag20ms==1) { }
if(Flag50ms==1)
Flag20ms=0; KeyScan();
TH0=(65536-5000)/256; TL0=(65536-5000)%256; Disp4(); T0Num++; if(T0Num%4==0) { }
if(T0Num%10==0) {
Flag50ms=1;
Flag20ms=1;
}
}
KeyProcess();
eInitData[0],7);
T0Init(); T1Init(); Ex0Init(); MeasureEn=0; while(1) {
if(T0Num>=200) { }
T0Num=0; Flag1s=1;
void EX0Server() interrupt 0 {
EndMeasured();
Distance[MeasureTime-1]=((TH1
//------------------------------
}
TH1=0; TL1=0;
广东机电职业技术学院
企业项目
(设计报告)
题目:基于51单片机的超声波测距仪的设计
院( 系 ) 信息工程学院
专业名称 控制0910
班级学号 07091034
学生姓名 王名远
指导教师 张永亮
二O一一 年 六 月
基于单片机的超声波测距仪的设计
摘要 自19世纪末到20世纪初,在物理学上发现了压电效应与反压电效应之后,人们解决了利用电子学技术产生超声波的办法,从此迅速揭开了发展与推广超声技术的历史篇章。随着科技的快速发展,超声波技术应用越来越广,很多产品在工业中广泛应用。
为了让超声波测距类产品智能,人性化,因此此次设计我们尝试利用STC89C52单片机研究制作超声波测距系统,超声波发射电路,以及超声波接收电路,键盘和显示部分,实现超声波测距功能。在这个系统中,我们先让超声波发射电路发射500us,大概20个脉冲信号,等到超声波接收电路接收到脉冲信号,计时结束,由程序上控制算法S=vt,测出距离S/2,送数码管显示,并满足一定精度要求,并在显示模块中显示出来,这类产品可以运用到工业产品中,例如:测试罐装饮料是否装满。结合了该芯片的价格、应用,我们设计的超声波测距系统具有速度快、适应性好,操作方便、有着广泛扩展应用的前景。
展望未来,超声波测距作为一种新型的非常重要有用的技术在各方面都将有很大的发展空间,它将朝着更加高定位、智能化的方向发展,以满足日益发展的社会需求。
关键字 超声波 STC89C52 模块电路
摘 要 ........................................... 错误!未定义书签。
目 录 ............................................................ 2
引 言 ............................................................ 3
第一章 超声波测距仪方案的设计 ................................... 4
1.1 系统整体方案的设计 ....................................... 4
1.2系统方案的论证 ............................................ 4
第二章 硬件电路的设计 ............................................ 5
2.1超声波发射电路的分析 ...................................... 5
2.2超声波接收电路的分析 ...................................... 6
2.3DS18B20的电路分析 ......................................... 6
2.4显示电路的分析 ........................... 错误!未定义书签。
第三章 系统程序的设计 ............................................ 9
3.1超声波测距器的算法设计 .................................... 9
3.2超声波测距器原理图 ........................................ 9
3.3主程序算法设计 ........................................... 10
3.4主程序的流程图 ........................................... 10
3.5超声波发生子程序和超声波接收中断程序 ..................... 11
第4章 电路与程序的调试......................................... 11
第5章 系统误差的分析............................................ 12
5.1声速引起的误差 ........................................... 12
5.2单片机时间分辨率的影响 ................................... 13 总结 ............................................................ 14 参考文献 ........................................................ 15
附录A .......................................................... 16
附录B .......................................................... 17
附录C .......................................................... 18
附录D .......................................................... 20
超声技术是一门以物理、电子、机械、及材料学为基础的通用技术之一。超声技术是通过超声波产生、传播及接收的物理过程而完成的。超声波具有聚束、定向及反射、透射等特性。 声检测技术是利用超声波在媒质中的传播特性(声速、衰减、反射、声阻抗等)来实现对非声学量(如密度、浓度、强度、弹性、硬度、粘度、温度、流速、流量、液位、厚度、缺陷等)的测定。它的基本原理是基于超声波在介质中传播时遇到不同的介面,将产生反射,折射,绕射,衰减等现象,从而使传播的声时,振幅,波形,频率等发生相应变化,测定这些规律的变化,便可得到材料的某些性质与内部构造情况。与传统超声技术完全不同,在不破坏媒质特性的情况下实现非接触性测量,适应能力强,可实现在线测量。
近二、三十年,特别是近十年来,由于电子技术及压电陶瓷材料的发展,使超声检测技术得到了迅速的发展。在无损探伤,测温,测距,流量测量,液体成分测量,岩体检测等方面,新的超声检测仪表不断出现,应用领域也不断扩大。本文正是基于这一应用背景。超声波由于其指向性强、能量消耗缓慢、传播距离较远等优点,而经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。超声波测距主要应用于倒车雷达、建筑施工工地以及一些工业现场,例如:液位、井深、管道长度等场合。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在测控系统的研制上也得到了广泛的应用。本文介绍一种以SPCE061A单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路设计方法。
超声波测距是一种传统而实用的非接触测量方法和激光,涡流和无线电测距方法相比,具有不受外界光及电磁场等因素的影响的优点,在比较恶劣的环境中也具有一定的适应能力,且结构简单,成本低,因此在工业控制,建筑测量,机器人定位等方面得到了广泛的应用但由于超声波传播声时难于精确捕捉,温度对声速的影响等原因,使得超声波测距的精度受到了很大的影响,限制了超声测距系统在测量精度要求更高的场合下的应用。
本文对超声波传感器测距的可能性进行了理论分析,利用模拟电子、数字电子、微机接口、超声波测试原理、DS18B20的原理、74ls164的传输原理等知识,设计出基于单片机STC89C52的超声波测距仪的硬件电路,编写好相应的软件程序,对硬件电路和软件程序作出相应的调试,确保超声波测距仪的可靠性。
第一章 超声波测距仪方案的设计
1.1系统整体方案的设计
由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。利用超声波检测距离,设计比较方便,计算处理也比较简单,并且在测量精度方面也能达到工业生产等自动化的使用要求。
超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、电动型等;机械方式有加尔统笛、气流旋笛等。他们所产生的超声波的频率、功率、和声波的特性各不相同,因而用途也各不相同。目前在近距离测量方面常用的是压电式超声波换能器。根据设计要求并综合各方面因素,本文采用STC89C52单片机作为控制器。用动态扫描法实现LED数字显示,超声波驱动信号是由单片机端口控制555时基发生器产生40KHz的脉冲信号。
1.2系统整体方案的论证
超声波测距的原理是利用超声波的发射与接收,根据超声波传播的时间来计算出传播距离。实用的测距方法有两种,一种是在被测距的两端,一端发射,另一端接受的直接波方式,适用于身高计;一种是发射波被物体发射回来后接收的反射波方式,适用与测距仪。此次设计采用反射波方式。
测距仪的分辨率取决于对超声波传感器的选择。超声波传感器是一种采用压电效应的传感器,采用的材料是压电陶瓷。由于超声波在空气中传播时会有相当的衰减,衰减的程度与频率的高低成正比;而频率高,分辨率也高,故短距离测量时应选择频率高的传感器,而长距离的测量时应用低频率的传感器。
第二章 硬件电路的设计
我们的超声波测距仪主要由:超声波发射电路、超声波接受电路、温度测量电路、显示电路、单片机最小系统组成。
2.1 超声波发射电路的分析
超声波发射电路的前置电路是由一个555无稳态电路组成的多谐振荡器,它是一种是间接反馈型,振荡电阻是连在电源VCC上的555电路,它是用来产生方波信号的。它的特点是: “RA-7-RB-6.2-C”RA与ACC相连,VD与RB并联。其计算公式为:
T1=0.693RA*C
T2=0.693RB*C
RA=RB时,T1=T2
F=0.722/(RA*C)
超声波发射电路的后半部分主要由非门组成的电路,其中作用是:
两组非门是倒相的,使负载上可以得到两种方向的电流,峰峰值为电源的两倍。
非门并联是为了提高输出电流驱动能力,也就是提高输出功率。
2.2 超声波接收电路的分析
发射头发射出去的超声波经障碍物反射后,反射到接收头,而接收到的波形幅度非常小,所以在回波处理电路中,把接收到的波形放大了10000倍,用的LM347搭成的两级交流放大电路。经放大后的波形送入检波电路 ,射随后经LM347比较器;经比较器调理后的波形成为方波,可送给STC89C52的EXT1外部中断。在模块电路的设计中一定要注意,超声波发射头和接收头之间的干扰;一般压电式的超声波换能器都会存在余波的干扰,发射头和接收头间要有20cm的距离;而在发射头发射超声波后的3ms内,接收头会一直接收到发射头传过来的非反射波,这是干扰波,在软件处理的时候一定要注意清除掉此类的干扰。
2.3 温度测量电路的分析
DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
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℃和0.0625℃,可实现高精度测温。
(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。
(8)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
2.4 显示电路的分析
在计算机控制中,显示装置是一个重要组成部分,主要用来显示生产过程的工艺状况与运行结果,以便于现场工作人员的正确操作。常用的显示器件有显示记录仪、发光二极管显示器LED、液晶显示器LCD、大屏幕显示器和图形显示器终端CRT。
此设计的显示电路为:
74LS164驱动LED动态显示电路。
其工作原理:
首先由I/O口(1)送出数字3的段选码4FH即数据01001111到4个LED共同的段选线上,接着由I/O口(2)送出位选码××××0111到位选线上,其中数据的高4位为无效的×,唯有送入左边第一个LED的COM端D3为低电平“0”,因此只有该LED的发光管因阳极接受到高电平“1”的g、d、c、b、a段有电流流过而被点亮,也就是显示出数字3,而其余3个LED因其COM端均为高电平“1”而无法点亮;显示一定时间后,再由I/O口(1)送出数字4的段选码66H即 01100110到段选线上,接着由I/O口(2)送出点亮左边第二个LED的位选码××××1011到位选线上,此时只有该LED的发光管因阳极接受到高电平“1”的g、f、c、b段有电流流过因而被点亮,也就是显示出数字4,而其余3位LED不亮;如此再依次送出第三个LED、第四个LED的段选与位选的扫描代码,就能一一分别点亮各个LED,使4个LED从左至右依次显示3、4、5、6。
第三章 系统程序的设计
超声波测距器的软件设计主要由主程序、超声波程序发生子程序、超声波接收中断程序及显示子程序组成。由于C语言程序有利于实现较复杂的算法,汇编语言程序则具有较高的效率并且容易精确计算程序运行的时间,而超声波测距器的程序既有较复杂的计算(计算距离时),又要求精确计算程序运行时间(超声波测距时),所以控制程序可采用C语言和汇编语言混合编程。下面对超声波测距器的算法。
3.1超声波测距器的算法设计
距离计算公式:d=s/2=(vt)/2
其中d是被测物与测距器的距离;s是超声波的来回路程,v是超声波在当前温度下的速度,t是发送和接收超声波所经历的时间。声波在其传播介质中被定义为纵波。当声波受到尺寸大于其波长的目标物体阻挡时就会发生反射;反射波称为回声。假如声波在介质中传播的速度是已知的,而且声波从声源到达目标然后返回声源的时间可以测量得到,从声波到目标的距离就可以精确地计算出来。这就是本系统的测量原理。
3.2超声波测距器原理图
障碍物
T=0 °C,超声波在空气中的传播速度C1=331.45m/s,
C=331.45+0.61T (m/s) 式中 T:°C
3.3主程序算法设计
主程序首先要对系统环境初始化,设置定时器工作模式为16位定时、计数器模式,置位总中断允许位EA并对显示端口P0和P2清0;然后调用超声波发生子程序送出一个超声波脉冲。为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延迟0.1ms后才打开外中断0,接收返回的超声波信号。 由于采用12MHZ晶振,计数器每记一个数就是1us,计算当20℃时的超声波传输速度v=344m/s,则
d=(vt)/2=344t/2=(172T0/106)m=(172T0 /10000)cm
其中T0为中断T0的计数值。
测出距离后,结果以十进制BCD码方式送往LED显示约0.5S,然后再发出超声波脉冲重复测量。
3.4主程序的流程图
3.5超声波发生子程序和超声波接收中断程序
超声波发生子程序的作用是通过P1.0端口发送两个左右的超声波脉冲信号(频率约40KHZ的方波),脉冲宽度为12us左右,同时把计数器T0打开进行计时。超声波发生子程序较简单,但要求程序运行时间准确,所以采用汇编语言程序编程。
超声波测距主程序利用外中断0检测返回超声波信号,一旦接收到返回的超声波信号(即INT0引脚出现低电平),立即进入超声波接收中断程序。进入该中断后,就立即关闭计时器T0,停止计时,并将测距成功标志字赋1。
如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2,表示本次测距不成功。
第四章 电路与程序的调试
通过多次实验,对电路各部分进行了测量、调试和分析。
首先测试发射电路对信号放大的倍数,先用信号源给发射电路输入端一个40kHz的方波信号,峰-峰值为3.8V。经过发射电路后,其信号峰-峰值放大到10V左右。
40kHz的方波驱动超声波发射头发射超声波,经反射后由超声波接收头接收到40kHz的正弦波,由于声波在空气中传播时衰减,所以接收到的波形幅值较低,经接收电路放大,整形,最后输出一负跳变,在单片机的外部中断源输入端产生一个中断请求信号。
该测距电路的40kHz方波由单片机编程产生,方波的周期为1/40ms,即25µs,半周期为12.5µs。每隔半周期时间,让方波输出脚的电平取反,便可产生40kHz方波。由于12M晶振的单片机的时间分辨率是1µs,所以只能产生半周期为12µs或13µs的方波信号,频率分别为41.67kHz和38.46kHz。本系统在编程时选用了后者,让单片机产生约38.46kHz的方波。
按照设计的原理,我们选用了LM324比较器接收到的信号进行放大,但是无
论如何调整电路,都无法将信号放大。然后我们查看了LM324的芯片手册,我们发现,当信号达到40KHz左右的时候,LM324基本放大不了信号,这是因为LM324的带宽不够大。我们在网上搜索资料,找到一款管脚、功能都与LM324相同的芯片——LM347。此款芯片为宽带比较器,可以放大40KHz的信号。使输出信号达到3.8V左右,使单片机工作。
当我们将电路完全调试成功之后,我们对超声波测距仪的显示数据进行测量,我们发现显示电路显示的数值与实际测出的数值有偏差,经过对电路的分析,我们诊断出超声波接收电路上存在着干扰,我们对电路加入103瓷片电容,进行对电路干扰的消除。
第五章 系统的误差分析
5.1声速引起的误差
声波是媒质中传播的质点的位置、压强和密度对相应静止值的扰动。高于20kHz 时的机械波称为超声波,媒质包括气体、液体和固体。流体中的声波常称为压缩波或压强波,对一般流体媒质而言,声波是一种纵波,传播速度为
Ec (5-1) 2
式(5-1)中E为媒质的弹性模量,单位kg/mm2;ρ为媒质的密度,单位kg/mm3;E 为复数,其虚数部分代表损耗; c也是复数,其实数部分代表传播速度,虚数部分则与衰减常数(每单位距离强度或幅度的衰减)有关,测量后者可求得媒质中的损耗。声波的传播与媒质的弹性模量密度、内耗以及形状大小(产生折射、反射、衍射等)有关。
从式(5-1)可知,声波传输速度与媒介的弹性模量和密度相关,因此,利用声速测量距离,就要考虑这些因素对声速影响。在气体中,压强、温度、湿度等因素会引起密度变化,气体中声速主要受密度影响,液体的深度、温度等因素会引起密度变化,固体中弹性模量对声速影响较密度影响更大,一般超声波在固体中传播速度最快,液体次之,在气体中的传播速度最慢。气体中声速受温度的影响最大。
声速受温度的影响为
cc01 (5-2) 2732
图5-1根据上式测量的温度-声速图。
图5-1 空气中温度-声速图
由式(5-2)和图5-1可见,当温度θ从0~40℃变化时,将会产生7%的声速变化,因此,为了提高测量准确度,计算时必须根据温度进行声速修正。工业测量中,一般用公式计算超声波在空气中的传播速度,即
c3310.6 (5-3)
5.2单片机时间分辨率的影响
不管是查询发射波与回波,还是由其触发单片机中断再通过软件启停定时器,都需要一定的时候,中断的方式误差相对要小一些。
相对而言,单片机的时间分辨率还是不太高,如晶振频率为12MHz时,时间分辨率为1µs。
随机误差
由于测量过程中的随机误差是按统计规律变化的,为了减少其影响,可 在同一位置处多次重复测量xi,然后取平均值x作为测量的真值[10]。
提高测距精度的方法
上节分析了超声波测距系统误差产生的一些原因,如何提高测量精度是超声测距的关键技术。其提高测距精度的措施如下:
1. 合理选择超声波工作频率、脉宽及脉冲发射周期。
据经验,超声测距的工作频率选择40kHz较为合适;发射脉宽一般应大于填充波周期的10 倍以上,考虑换能器通频带及抑制噪声的能力,选择发射脉宽
1ms;脉冲发射周期的选择主要考虑微机处理数据的速度,速度快,脉冲发射周期可选短些。
2. 在超声波接收回路中串入增益调节(AGC)及自动增益负反馈控制环节。 因超声接收波的幅值随传播距离的增大呈指数规律衰减,所以采用AGC电路使放大倍数随测距距离的增大呈指数规律增加的电路,使接收器波形的幅值不随测量距离的变化而大幅度的变化,采用电流负反馈环节能使接收波形更加稳定。
3. 提高计时精度,减少时间量化误差。
如采用芯片计时器,计时器的计数频率越高,则时间量化误差造成的测距误差就越小。例如:单片机内置计时器的计数频率只有晶振频率的十二分之一,当晶振频率6MHz时,计数频率为0.5MHz,此时在空气中的测距时间量化误差为0.68mm;当晶振频率为12MHz时,计数频率为1MHz,此时测距时间量化误差为0.34mm。若采用外部硬件计时电路,则计数频率可直接引用单片机的晶振频率,时间量化误差更小。
4. 补偿温度对传播声速的影响。超声波在介质中的传播速度与温度、压力等因数有关,其中温度的影响最大,因此需要对其进行补偿。
温度传感器LM92的温度测试分辨率为0.0625℃,-10℃至+85℃准确度为±1.0℃,I2C总线接口。用AT89C51的通用I/O端口能很容易的模拟I2C总线的读写时序,LM92高精度温度测量能很好的补偿超声波在不同温度的传播速度。
由LM92温度传感器和单片机组成的高精度超声波测距已应用在各种高精度测距的场合,如自动气象站中水气日蒸发量的测试、自动任意形状物体密度测试仪等,它具有测试速度快,能达到毫米级的测量精度等优点,在工程上的开发与应用前景广阔。
总结
本课题介绍了一种基于单片机的超声波测距系统的原理和设计。给出了硬件和软件的设计方案。
超声波传感器是本系统的核心器件,本论文详细地介绍了超声波传感器的原理、结构、检测方式以及它的一些特性。只有深入地了解超声波传感器的工作原理,才能更好的设计测距电路。单片机是本系统的控制部分,采用STC89C52 芯片驱动超声波传感器的40kHz的方波信号,由555多谢振荡器产生。本系
统的发射电路采用74HC04六反向器,通过它对单片机产生的方波信号进行放大,以驱动传感器工作。接收电路采用的是LM347,通过接收电路对接收到的信号进行放大和整形,最终再输出负脉冲给单片机响应中断程序。本系统的LED显示部分采用的是动态扫描方式,并用单片机软件译码。单片机内部采用C语言编程,方波信号的产生、时间差的读取、距离的计算以及显示输出的译码都由单片机编程完成。
本课题所设计的超声波测距系统具有测量精度较高、速度快、控制简单方便等优点。测距范围从20cm到200cm,测量精度在±10cm内。测距系统在许多工业现场和自动控制场合,都有很重要的作用。但由于经验不足,电路硬件、软件部分都有不够完善的地方,在今后的学习中会进一步改进。
总体来说,最重要的是在本课题的设计过程中我学到了很多知识,从中受益匪浅。了解了超声波传感器的原理,学会了各种放大电路的分析、设计,也掌握了单片机的开发过程和利用单片机设计电路的方法。对一块电路板的设计、焊板、调试、改进等整个过程,有了更深入的理解和掌握。这些对我今后的学习和工作都会有很大帮助的。
参考文献
1.刘凤然.基于单片机的超声波测距系统.传感器世界.2001,5:29-32
2.何希才,薛永毅.传感器及其应用实例.机械工业出版社,2004:138-152
3.胡汉才.单片机原理及其接口技术.清华大学出版社,2004:27-46
4.吴斌方,刘民,熊海斌.超声波测距传感器的研制.湖北工学院学报.2004,19(6):26-28
5.苏炜,龚壁建,潘笑.超声波测距误差分析.传感器技术.2004,23(6):8-11
6.罗忠辉,黄世庆.提高超声测距精度的方法. 机械设计与制造.2005,1:109
附录
附录A 实物图
超声波发射电路
超声波接收电路
显示电路
附录B PCB图
发射和接收电路
显示模块 附录
C
附录D
#include #include #include #define KeyData (P1|0xe0) #define KeyDown 1 //按键按下
#define KeyUp 0 //按键弹开
bit KeyFirst=1; //按键第一次按下
bit KeyState=KeyUp; //按键状态
uchar KeyValue; //键值 sbit CLK=P1^6; sbit DAT=P1^5;
sbit MeasureEn=P3^7; //超声波测距使能按键 uchar
TimeInitData[7]={5,5,10,14,4,5,1};
//时间芯片DS1302初始值
7}; uchar
code
DispCode[22]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x00};//0 1 ...9 0. 1. ... 9. - uchar NumCode[4]={0,0,0,0}; uchar
code
LedSelect[4]={0x01,0x02,0x04,0x08}; //数码管的为选通信号 int TimeData; int DispNum; int DispTemp;
uint Distance[3]={0,0,0}; 义三次测量结果数组 uchar T0Num;
uchar MeasureTime; 几次测量
bit FlagEndMeasure; 量完成一次的标志 bit Flag20ms=0; bit Flag50ms=0; bit Flag1s=0;
//测
//第//定
设定,秒,分,时,日,月,星期,年 //uchar
TimeBuff[7]={0,0,0,0,0,0,0}; extern bit FlagSgn;
//接收到的时间信息
//DS18B20正负温度标志
//启
uchar
TimeBuff[7]={11,22,33,44,55,66,7
void StartMeasured(); 动测距
void Measure3Times(); 动测距三次,并取中值
//启}
//--------------------------------------------------------- void Delayus(uint n) {
while(n--); //延时大约n*10us
//--------------------------------------------------------- void T0Init() {
TMOD=0x01;
TH0=(65536-5000)/256; //定时
}
//--------------------------------------------------------- void Send164(uchar Ch) //口线模拟时序,164送显示 {
uchar j; for(j=0;j
CLK=0; _nop_(); DAT=Ch&0x80; CLK=1; _nop_(); Ch
5ms,动态扫描 }
//--------------------------------------------------------- void T1Init() { 式 }
//--------------------------------------------------------- void Ex0Init() {
IT0=1; //外部中断0,边沿触发 EX0=0; EA=1; TH1=0; TL1=0; TR1=0;
TMOD|=0x10; //定时器1计数方TL0=(65536-5000)%256; TR0=1; ET0=1; EA=1;
}
//---------------------------------------------------------------------- void Disp4() 码管显示 {
static uchar j=0; Send164((DispCode[NumCode[j]]
//四个数
));//调出与显缓区数值相应的字型码 }
//------------------------------------------------------- void TempSendDisp() //送显温度 { }
//------------------------------------------------------- void DistanceSendDisp() //送显距离 {
if(FlagSgn==1) { } else { }
NumCode[1]=DispNum%1000/100; if(NumCode[1]==0) { }
NumCode[2]=DispNum%100/10+10; NumCode[3]=DispNum%10;
NumCode[1]=21; NumCode[0]=21; NumCode[0]=20;
P0=(P0&0xf0)|(LedSelect[j]); j++; j%=4;
0; }
NumCode[0]=DispNum/1000; if(NumCode[0]==0) { }
NumCode[1]=DispNum%1000/100+1
NumCode[0]=21;
NumCode[2]=DispNum%100/10; NumCode[3]=DispNum%10;
//------------------------------------------------------- void SendDisp() //送显数字 { }
//--------------------------------------------------------- void KeyScan(void) //键扫描 {
static uchar KeyBuff; NumCode[0]=DispNum/1000; NumCode[1]=DispNum%1000/100; NumCode[2]=DispNum%100/10; NumCode[3]=DispNum%10;
if(KeyData!=0xff) // 表示有键按下 {
if(KeyState!=KeyDown) {
if(KeyFirst==1) {
}
KeyBuff=KeyData; KeyFirst=0;
TempSendDisp(); break;
}
case 0x02://送显距离 { }
case 0x04://送显时分 {
DispNum=Distance[1]; DistanceSendDisp(); break;
else {
if(KeyData==KeyBuff)
{
KeyValue=~KeyData;
KeyState=KeyDown;
}
}
}
}
TimeData=TimeBuff[2]*100+Time
Buff[1];
TimeData=TimeBuff[4]*100+Time
}
case 0x08://送显月日 {
DispNum=TimeData; SendDisp(); break;
else
{ } }
//------------------------------------------------------- void KeyProcess() //键盘处理 {
switch (KeyValue) {
case 0x01: //送显温度 {
DispNum=DispTemp; KeyFirst=1; KeyState=KeyUp;
Buff[3];
}
case 0x10://送显年星期
DispNum=TimeData; SendDisp(); break;
{
TimeData=TimeBuff[6]*100+Time
Buff[5]; }
//--------------------------------------------------------- void StartMeasured() //启动超声波测距 {
MeasureEn=1;
Delayus(12); //延时120us,发 }
}
default: break;
DispNum=TimeData; SendDisp(); break;
//--------------------------------------------------------- void PaiXu() //三个测量结果排序 {
if((Distance[i])>=(Distance[iuint Temp; uchar i; for(i=0;i
+1]))
Distance[i]=Distance[i+1]; }
if((Distance[0])>=(Distance[1
}
Distance[i+1]=Temp; {
Temp=Distance[i];
射大约5个脉冲 }
//--------------------------------------------------------- void EndMeasured() //停止超声波测距 { }
TR1=0; EX0=0; MeasureEn=0; TH1=0; TL1=0; TR1=1;
Delayus(10); //延时100us EX0=1;
])) }
//--------------------------------------------------------- void Measure3Times() //启动三次测量,并取中值,送显示
{ }
Temp=Distance[0]; Distance[0]=Distance[1]; Distance[1]=Temp;
}
//--------------------------------------------------------- void main() {
//v_Set1302(WRITE_SECOND,&TimMeasureTime++; if(MeasureTime
MeasureTime=0; EndMeasured(); PaiXu(); StartMeasured();
}
if(Flag1s==1) {
Flag1s=0; Flag50ms=0; Measure3Times();
DispTemp=DS18B20_ReadTemp();
//v_Get1302(READ_SECOND,&Time
Buff[0],7); }
//--------------------------------------------------------- void T0Server() interrupt 1 {
if(Flag20ms==1) { }
if(Flag50ms==1)
Flag20ms=0; KeyScan();
TH0=(65536-5000)/256; TL0=(65536-5000)%256; Disp4(); T0Num++; if(T0Num%4==0) { }
if(T0Num%10==0) {
Flag50ms=1;
Flag20ms=1;
}
}
KeyProcess();
eInitData[0],7);
T0Init(); T1Init(); Ex0Init(); MeasureEn=0; while(1) {
if(T0Num>=200) { }
T0Num=0; Flag1s=1;
void EX0Server() interrupt 0 {
EndMeasured();
Distance[MeasureTime-1]=((TH1
//------------------------------
}
TH1=0; TL1=0;