找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

超声波测距系统的设计与实现

[复制链接]
admin 发表于 2012-9-2 04:26:34 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×

超声波测距系统的设计与实现

3.1.3超声波测距原理


最常用的超声测距的方法是回声探测法超声波发射器向某一方向发射超声波,在发射时刻的同时计数器开始计时,超声波在空气中传播,途中碰到障碍物面阻挡就立即反射回来,超声波接收器收到反射回的超声波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物面的距离s,即:s=340t/2。

由于超声波也是一种声波,其声速V与温度有关。

如图3-1所示:



超声波发射 障碍物
S
H
θ




超声波接收
图3-1 超声波的测距原理

(3-1)
(3-2)
式中:L---两探头之间中心距离的一半.
又知道超声波传播的距离为:
( 3-3)
式中:v—超声波在介质中的传播速度;
t—超声波从发射到接收所需要的时间.
将(3—2)、(3—3)代入(3-1)中得:
( 3-4)
其中,超声波的传播速度v在一定的温度下是一个常数(例如在温度T=30度时,V=349m/s);当需要测量的距离H远远大于L时,则(3—4)变为:
( 3-5)
所以,只要需要测量出超声波传播的时间t,就可以得出测量的距离H.

3.2.1 一般说明


AT89S52具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
AT89S52的数据存储包括256字节的内部RAM,特殊功能寄存器(SFR),2K字节的片内EEPROM和可扩展至64K的外部数据存储器。
此外,AT89S52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。

3.2.2 极限参数


表3-1 AT89S52极限参数[color=100%]
参数
额定值
单位
操作温度
0+70或-40+85
°C
储存温度范围
-65+150
°C
EA/Vpp脚相对于Vss的电压
0+13.0
V
其他任何脚相对于Vss的电压
-0.5+6.5
V
每个IO脚的最大IOL
15
mA

3.3 超声波传感器


3.3.1超声波的特性
声音是与人类生活紧密相关的一种自然现象。当声的频率高到超过人耳听觉的频率极限(根据大量实验数据统计,取整数为20000赫兹)时,人们就会觉察不出周围声的存在,因而称这种高频率的声为“超”声。人的听觉范围如图2-5所示。


图3-5 人的听觉范围

超声波的特性有:
(1)束射特性
由于超声波的波长短,超声波射线可以和光线一样,能够反射、折射,也能聚焦,而且遵守几何光学上的所有定律。即超声波射线从一种物质表面反射时,入射角等于反射角,当射线透过一种物质进入另一种密度不同的物质时就会产生折射现象,也就是要改变它的传播方向,两种物质的密度差别愈大,则折射率也愈大。
(2)吸收特性
声波在各种介质中传播时,随着传播距离的增加,其强度会逐渐减弱,这是因为介质要吸收掉它的部分能量。对于同一介质,声波的频率越高,介质吸收就越强。对于一个频率一定的声波,在气体中传播时吸收尤为历害,在液体中传播时吸收就比较弱,在固体中传播时吸收是最小的。
(3)超声波的能量传递特性
超声波之所以能在各个工业部门中得到广泛的应用,主要原因还在于比声波具有强大得多的功率。为什么有这么强大的功率呢?因为当声波进入某一介质中时,由于声波的作用使物质中的分子也随之振动,振动的频率和声波频率—样,分子振动的频率决定了分子振动的速度。频率愈高速度愈大。物资分子由于振动所获得的能量除了与分子本身的质量有关外,主要是由分子的振动速度的平方决定的,所以如果声波的频率愈高,也就是物质分子愈能得到更高的能量。超声波的频率比普通声波要高出很多,所以它可以使物质分子获得很大的能量;换句话来说,超声波本身就可以供给物质分子足够大的功率。
(4)超声波的声压特性
当声波进入某物体时,由于声波振动使物质分子相互之间产生压缩和稀疏的作用,将使物质所受的压力产生变化。由于声波振动引起附加压力现象叫声压作用。

3.3.2 超声波换能器


完成产生超声波和接收超声波这种功能的装置就是超声波传感器,习惯上称为超声换能器,或者超声波探头。超声波探头主要由压电晶片组成,既可以发射超声波,也可以接收超声波。小功率超声探头多用作探测方面。它有许多不同的结构,可分直探头(纵波)、斜探头(横波)、表面波探头(表面波)、兰姆波探头(兰姆波)、双探头(一个探头反射、一个探头接收)等。
  超声探头的核心是其塑料外套或者金属外套中的一块压电晶片。构成晶片的材料可以有许多种。由于晶片的大小,如直径和厚度也各不相同,因此每个探头的性能都是不同的,我们使用前必须预先了解清楚该探头的性能参数。
超声波传感器的主要性能指标包括:
(1)工作频率。工作频率就是压电晶片的共振频率。当加到它两端的交流电压的频率和晶片的共振频率相等时,输出的能量最大,灵敏度也最高。
  (2)工作温度。由于压电材料的居里点一般比较高,特别时诊断用超声波探头使用功率较小,所以工作温度比较低,可以长时间地工作而不失效。医疗用的超声探头的温度比较高,需要单独的制冷设备。
  (3)灵敏度。主要取决于制造晶片本身。机电耦合系数大,灵敏度高。

人类能听到的声音频率范围为:20Hz~20kHz,即为可听声波,超出此频率范围的声音,即20Hz以下频率的声音称为低频声波,20kHz以上频率的声音称为超声波。超声波为直线传播方式,频率越高,绕射能力越弱,但反射能力越强。为此,利用超声波的这种性能就可制成超声波传感器。另外,超声波在空气中的传播速度较慢,为340m/s,这就使得超声波传感器使用变得非常简便。我们选用压电式超声波传感器。它的探头常用材料是压电晶体和压电陶瓷,是利用压电材料的压电效应来进行工作的。逆压电效应将高频电振动转换成高频机械振动,从而产生超声波,可作为发射探头;而利用正压电效应,将超声振动波转换成电信号,可作为接收探头。
为了研究和利用超声波,人们已经设计和制成了许多种超声波发生器。总体上讲,超声波发生器大体可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。它们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生器。


共振板gon





压电晶片


电极 电极




图3-6超声波传感器结构

压电式超声波发生器实际上是利用压电晶体的谐振来工作的。超声波发生器内部结构如图所示,它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。如图4-4所示。


3.4 CAD简介


CAD在早期是英文Computer Aided Drafting
 楼主| admin 发表于 2012-9-2 04:26:38 | 显示全部楼层
(计算机辅助绘图)的缩写,随着计算机软、硬件技术的发展,人们逐步的认识到单纯使用计算机绘图还不能称之为计算机辅助设计;真正的设计是整个产品的设计,它包括产品的构思、功能设计、结构分析、加工制造等。二维工程图设计只是产品设计中的一小部分;于是CAD的缩写也由Computer Aided Drafting 改为 Computer Aided Design(计算机辅助设计),CAD也不再仅仅是辅助绘图,而是整个产品的辅助设计。早在20世纪70年代军工部门就是利用计算机来完成飞机,火箭等航空,航天器的设计工作。电子线路CAD的基本含义是使用计算机来完成电子线路的设计过程,包含电路原理图的编辑,电路功能的仿真,工作环境的模拟,印制板的设计(自动布局,自动布线)与检测等等。电子线路CAD软件还能迅速形成各种各样的报表文件,如元件清单报表,为元器件的采购及工程欲算等提供了方便,便于新型电子器件和集成电路的应用。
随着电子技术的飞速用日趋广泛,电子电路也变得越来越复杂,这给电路的设计工作带来更的难度。因此通过计算机进行电子电路的辅助设计成为设计制作电路板的一个基本手段。Protel99SE是澳大利亚Protel Technology公司于2000年推出的一款基于Windows 95/98以上环境下的全32位EDA(Electronic Design Automation 电子设计自动化)道路设计自动化软件,是一个客户/服务器应用程序。而且Protel99SE包含众多的服务器程序,总体上可以分为5种,分别为:原理图设计、PCB设计(包含信号完整性分析)、自动布线器、原理图混合信号仿真、PLD设计。由于其性能优越,Protel99SE已经成为电路设计不可缺少的理想辅助设计工具。

4 硬件电路设计


介绍了本设计方案选择的情况,下面将着重按照前面所分析和采用的设计方案来完成具体的电路设计。

4.1 整体电路设计


整体电路的控制核心为单片机AT89S52。超声波发射和接收电路中都对相应信号进行整形及放大,以保证测量结果尽可能精确。超声波探头接OUT口实现超声波的发射和接收。另外还有温度测量电路测量当时的空气温度,等到把数据送到单片机后使用软件对超声波的传播速度进行调整,使测量精度能够达到要求。整体结构图包括超声波发射电路,超声波接收电路,单片机电路,显示电路与温度测量电路等几部分模块组成。而超声波发射与接收电路还要加入放大电路。在发射后把信号放大,接收前也要把还再次放大。
整体电路结构图如图4-1。


图4-1超声波测距原理图

单片机发出40kHZ的信号,经放大后通过超声波发射器输出;超声波接收器将接收到的超声波信号经放大器放大,用锁相环电路进行检波处理后,启动单片机中断程序,测得时间为t,再由软件进行判别、计算,得出距离数并送LED显示。


图4-2 超声波发送原理图

4.2超声波测距系统设计



4.2.1 超声波发射器的注意事项


超声波发射器向某一方向发射超声波,在发射超声波的同时开始计时,超声波在空气中传播,途中碰到障碍物反射后立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度约为340m/s,根据计时器记录的时间t,就可以计算出超声波发射点距障碍物的距离(s),即为:s=340t/2,这就是所谓的时

间差测距法。
存在4个因素限制了该系统的最大可测距离:超声波的幅度、反射的质地、反射回波和入射声波之间的夹角以及接收换能器的灵敏度。
测距误差主要来源于以下几个方面:

(1)超声波波束对探测目标的入射角 的影响;

(2)超声波回波声强与待测距离的远近有直接关系,所以实际测量时,不一定是第一个回波的过零点触发;

(3)超声波传播速度对测距的影响。稳定准确的超声波传播速度是保证测量精度的必要条件,波的传播速度取决于传播媒质的特性。传播媒质的温度、压力、密度对声速都将产生直接的影响,因此需对声速加以修正。

(4)由于超声波利用接收发射波来进行距离的计算,因而不可避免地存在发射和反射之间的夹角,其大小为2 ,当 很小的时候,可直接按式 进行距离的计算;当夹角很大的时候,必须进行距离的修正,修正的公式为:
(4-1)
实际的调试过程中,要十分注意发射和接收探头在电路板上的安装位置,这是因为每一种超声波发射、接收头都有一个有效测量夹角,这里用到的发射、接收头有效测量夹角为45°。
接收换能器对超声波脉冲的直接接收能力将决定该系统最小的可测距离。为了增加所测量的覆盖范围、减小测量误差,可采用多个超声波换能器分别作为多路超声波发射/接收的设计方法。

4.2.2 超声波发射电路


超声波测距技术经过几年的研究和发展,已经有了很多比较成熟的技术和设计方案,使本次设计能有很多可借鉴的资料,从中学到了很多宝贵的知识。对自己设计电路有很大帮助。
超声波发射电路,要求功率尽量大些,发射距离大于1.5米,电路力求简单实用。我参考电路图如图4-3,4-4,4-5,4-6。吸取几个图的优点而避免他们的缺点,然后结合分析设计超声波的发射与接收电路。
40kHZ超声波发射电路之一,电路中晶体管VT1、VT2组成强反馈稳频振荡器,振荡频率等于超声波换能器T40-16的共振频率。T40-16是反馈耦合元件,对于电路来说又是输出换能器。T40-16两端的振荡波形近似于方波,电压振幅接近电源电压。S是电源开关,按一下S,便能驱动T40-16发射出一串40kHZ超声波信号。电路工作电压9V,工作电流约25mA。发射超声波信号大于8m。电路不需调试即可工作。这样电路很简单与实用。


图4-3 40khz超声波发射电路

40kHZ超声波发射电路之二,由VT1、VT2组成正反馈回授振荡器。电路的振荡频率决定于反馈元件的T40-16,其谐振频率为40kHZ±2kHZ。频率稳定性好,不需作任何调整,并由T40-16作为换能器发出40kHZ的超声波信号。电感L1与电容C2调谐在40kHZ起作谐振作用。本电路适应电压较宽(3~12V),且频率不变。电感采用固定式,电感量5.1mH。整机工作电流约25mA。发射超声波信号大于8m。

图4-4 40khz超声波发射电路

40kHZ超声波发射电路之三,它主要由四与非门电路完成振荡及驱动功能,通过超声换能器T40-16辐射出超声波去控制接收机。其中门YF1与门YF2组成可控振荡器,当S按下时,振荡器起振,调整RP改变振荡频率,应为40kHZ。振荡信号分别控制由YF4、YF3组成的差相驱动器工作,当YF3输出高电平时,YF4一定输出低电平;YF3输出低电平时,YF4输出高电平。此电平控制T40-16换能器发出40kHZ超声波。电路中YF1~YF4采用高速CMOS电路74HC00四与非门电路,该电路特点是输出驱动电流大(大于15mA),效率高等。电路工作电压9V,工作电流大于35mA,发射超声波信号大于10m。


图4-5 40khz超声波发射电路

40kHZ超声波发射电路之四,由LM555时基电路及外围元件构成40kHZ多谐振荡器电路,调节电阻器RP阻值,可以改变振荡频率。由LM555第3脚输出端驱动超声波换能器T40-16,使之发射出超声波信号。电路简单易制。电路工作电压9V,工作电流40~50mA。发射超声波信号大于8m。LM555可用NE555直接替代,效果一样。
经过认真仔细的考虑和分析,本人选择使用NE555加外围电路构成多谐振荡器来产生频率为40KHz的方波,再经过整形放大后来驱动超声波发射器发出超声波。
NE555是一种用途很广的时基单元集成电路,其工作电压范围较宽,可在4.5~18V范围内工作,其驱动电流可达200mA。NE555的内部中心电路是三极管Q15和Q17加正反馈组成的RS触发器。输入控制端有直接复位Reset端,通过比较器A1,复位控制端的TH、比较器A2置位控制的T。输出端为F,另外还有集电极开路的放电管DIS。它们控制的优先权是R、T、TH。利用NE555可以组成相当多的应用电路,甚至多达数百种应用电路,在各类书刊中均有介绍,例如家用电器控制装置、门铃、报警器、信号发生器、电路检测仪器、元器件测量仪、定时器、压频转换电路、电源应用电路、自动控制装置及其它应用电路都有着广泛的应用,这是因为NE555巧妙地将模拟电路和数字电路结合在一起的缘故。

图4-6 40khz超声波发射电路





图4-7 555内部结构与引脚
 楼主| admin 发表于 2012-9-2 04:26:41 | 显示全部楼层
[/color][/size][size=2][color=black]本次设计中NE555电路的工作原理是:单片机TXD口发出低电平,三极管Q5为PNP管所以导通,C极向外输出高电平。555芯片8脚接到高电平开始工作,4脚被拉高,多谐振荡电路不工作,当接到单片机的低电平信号后振荡器开始工作。 Vcc经外接电阻R1和R2向电容C充电,当C上的电压Vc上升到2Vcc/3时,反相比较器A1翻转输出低电平,RS触发器复位,即V=0,3脚输出为“0”,则三极管导通,C经三极管和P1放电,当Vc下降到Vcc/3时,同相比较器A2翻转输出低电平,即S=0,RS触发器置位,3脚输出变为“1”,三极管又截止,C又开始充电,如此周而复始,输出端便可获得周期性的矩形脉冲波,NE555的内部电路。由电路可知电容C的放电时间t1=R2Cln2,充电时间t2=(R1+R2)Cln2,即可得出输出脉冲的频率为:f=1/t1+t2。所以调节R1和R2即可改变脉冲频率使之等于40KHz。如图4-6所示。[/color][/size]
[color=black] [/color]

[color=black] [/color]

[color=black] [/color]

[color=black] [/color]

[color=black] [/color]

[color=black] [/color]

[color=black] [/color]


[color=black]图4-8 方波产生电路[/color][color=black][/color]

[size=2][color=black] [/color][/size][size=2][color=black]为了使40KHz的方波信号更为可靠,要对其进行整形及放大。信号由NE555的3脚向外输出,经过二极管D2整形,滤去低于低电平的部分,只保留零电平以上部分。整形后的信号经由三极管Q1、Q2放大,此时的信号已经很可靠,可以满足本次设计的需要。信号由OUT口输出,送入超声波探头中。此外在超声波发射电路中还加入了消除余振部分以保证电路可以更好的为超声波发射器提供信号,也使测量结果更为精确。因为超声波探头是一个感性元件,在一定程度上会表现出电感的性质。所以当发射电路停止向其输入脉冲信号后,如果没有合适的能量释放回路,则在其感性的作用下,超声波探头内部振荡仍会持续一段时间,仍然发射超声波,会对测量结果产生影响。加入这个电路就是为了在停止发送超声波的时候将发射器内部的能量释放到地,使其立即停止工作。单片机控制发送超声波的TXD口和消除余振的INT0口都是P3口的低四位,只需要由程序控制两个管脚输出相同的电平。在TXD口为高电平时停止发射超声波,此时INT0口也为高电平,使得三极管Q3导通,即打开消除余振功能,将剩余的能量接地。两个动作几乎是同时的,可以提高此后计时的准确性。电路如图4-9所示。[/color][/size]
[color=black][/color]

[color=black]图4-9方波消除余波电路[/color][b][size=2][color=black][/color][/size][/b]

[b][size=2][color=black] [/color][/size][/b]

[color=black][/color][b][size=2][color=black][/color][/size][/b]

[b][size=2][color=black] [/color][/size][/b][color=black]图4-10 发射电路模块[/color][b][size=2][color=black][/color][/size][/b]
[b]4.2.3 [size=2]超声波接收电路[/size][/b]
[size=2][color=black]在本次设计中选择了前置放大电路+带通滤波电路+后级放大电路的类似电路。通过波形整形,积分器,检波器,带通滤波,限幅放大和前置放大等实现接收超声波的功能。如图4-11所示:[/color][/size]
[size=2][color=black] [/color][/size][size=2][color=black]由于在距离较远的情况下,超声波的回波很弱,因而转换为电信号的幅值也较小,为此要求将信号放大60万倍左右。如图4-11所示电路有三级放大:前两级种放大100倍,采用高速精密放大器LM318,[/color][/size][size=2][color=black] [/color][/size][size=2][color=black]其带宽为15MHz,放大倍数为100倍时,能充分满足要求;第三级采用LF353运算放大器,带宽为4MHz,对于62倍的放大倍数,能充分满足条件。放大后的交流信号经光电隔离送入比较器,比较器的作用是将交流信号整形输出一个方波信号,此方波信号上升沿使D触发器触发,向CPU发中断申请。在中断服务程序中,读取时间计数器的计数值,并结合温度换算出的速度算出发射到接收的距离如图4-12所示:[/color][/size]

[size=2][color=black][/color][/size]
[color=black]图4-11 40KHz超声波接收电路[/color]

[color=black] [/color]

[size=2][color=black] [/color][/size]

[size=2][color=black][/color][/size][color=black][/color]

[color=black]图4-12 40KHz超声波接收电路[/color][color=black][/color]

[size=2][color=black]图4-12所示电路为双稳态超声波接收机电路,由VT5、VT6及相关辅助元件构成双稳态电路,当VT4每导通一次(发射机工作一次),触发信号经C7、C8向双稳电路送进一个触发脉冲,VT5、VT6状态翻转一次,当VT6从截止状态转变成导通状态时,VD5截止,VT7截止,继电器K释放; 当再来一个触发信号时,VT6由导通转变为截止状态,VD5导通,VT7导通,继电器K吸合......由于增加了双稳电路,使之用于电灯、电扇、电视等电器遥控成为现实。调试时,在a点与+16V(电源)之间用导线快速短路一下后松开,继电器应吸合(或释放),再短路一下松开,继电器应释放(或吸合),如果继电器无反应,请检查双稳电路元件焊接质量和元件参数。再加上设计中所选用的超声波探头里已经集成了上述超声波接收电路,一般情况下一次即可成功。[/color][/size]
[size=2][color=black]为了测量结果的准确性,对于超声波探头接收到的信号同样需要进行处理。探头收到的回波信号经OUT口回到电路中,经过电容C10耦合,只保留测距需要的交流信号。电路中加入二极管D1同样是因为上面提到的探头的感性。由于感性的存在,在停止发送超声波的那一刻,OUT口会出现一个反向电动势,即电位低于地电位。这样,如果没有二极管保护,这个反向电动势将会全部加在三极管Q4的b-e结上,如果探头的感性比较强,其反向电动势足以将b-e结击穿。二极管D1提供了一个电流的泻放电路,也可以说是将反向电动势降到最小(0.7V左右),保护三极管及其他电路。电容C9对经过三极管的信号进一步整形,去掉信号波形中的毛刺,使波形更好。电阻R5起一个上拉电阻的作用,因为回波信号经过滤波后很可能会衰减的很严重,所以利用R5将其幅度上拉到5V,以便单片机更好的检测回波信号。[/color][/size]
[size=2][color=black]CX20106[/color][/size][size=2][color=black]是一款应用广泛的红外线检波接收的专用芯片,其具有功能强、性能优越、外围接口简单、成本低等优点,由于红外遥控常用的载波频率38 kHz与测距的超声波频率40 kHz比较接近,而且CX20106内部设置的滤波器中心频率f0五可由其5脚外接电阻调节,阻值越大中心频率越低,范围为30~60 kHz。故本次设计用它来做接收电路。CX20106内部由前置放大器、限幅放大器、带通滤波器、检波器、积分器及整形电路构成。[/color][/size]
[size=2][color=black][/color][/size]

图4-13超声波回波信号整形电路



图4-14 [color=black]40KHz[/color][color=black]超声波接收电路[/color]

[size=2][color=black]4.3 [/color][/size][size=2]显示电路设计[/size][size=2][color=black][/color][/size]
[size=2][color=#010101]在单片机应用系统中,[/color][/size][size=2][color=#010101]LED[/color][/size][size=2][color=#010101]数码管的显示常用两种方法:静态显示和动态扫描显示。所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的[/color][/size][size=2][color=#010101]I[/color][/size][size=2][color=#010101]/[/color][/size][size=2][color=#010101]O[/color][/size][size=2][color=#010101]接口用于笔划段字形代码。这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时[/color][/size][size=2][color=#010101],[/color][/size][size=2][color=#010101]再发送新的字形码,因此,使用这种方法较为简单与便利[/color][/size][color=#010101]。[/color][size=2][color=#010101]可以提供单独锁存的[/color][/size][size=2][color=#010101]I[/color][/size][size=2][color=#010101]/[/color][/size][size=2][color=#010101]O[/color][/size][size=2][color=#010101]接口电路很多,常用的就是通过串口外接串并转换器[/color][/size][size=2][color=#010101]74LS164[/color][/size][size=2][color=#010101],扩展并行的[/color][/size][size=2][color=#010101]I[/color][/size][size=2][color=#010101]/[/color][/size][size=2][color=#010101]O[/color][/size][size=2][color=#010101]口。需要几个数码管就扩展几个并行接口,数码管直接接在[/color][/size][size=2][color=#010101]74LS164[/color][/size][size=2][color=#010101]的输出脚上,单片机通过串口将要显示数据的字形码逐一的串行移出至[/color][/size][size=2][color=#010101]74LS164[/color][/size][size=2][color=#010101]的输出脚上数码管就可以显示相应的数字。[/color][/size][size=2][color=black][/color][/size]
[size=2][color=black]在显示电路的设计上,利用单片机的P0~P2口来控制数码管显示,这种接法虽然比较浪费管脚资源,但是对单片机的理论知识要求相对比较低,而且超声波发射和接收电路并不需要很多的管脚来支持,所以我选择这种方案。数码管的选择上,为了使数码管亮度大,本人选择了共阳极的数码管,数码管管脚接到低电平发亮。显示及其驱动电路的原理图见图4-15。[/color][/size]
[size=2][color=black] [/color][/size]
[size=2][color=black][/color][/size]

[color=black]图4-15 数码管显示电路[/color][size=2][color=black][/color][/size]

[size=2][color=black]4.4 [/color][/size][size=2]稳压电源设计[/size][size=2][color=black][/color][/size]
 楼主| admin 发表于 2012-9-2 04:26:44 | 显示全部楼层
因为本次设计的元器件都可以使用+12V或是+5V的电源来驱动,所以我制作了一个稳压电源,它使用三端集成稳压器CW7812和CW7805来设计。通过变压器的直流电通过由二极管组成的桥式整流电路进入三端稳压元件,CW7812和CW7805分别为电路提供稳定的12V和5V直流电源。极性电容起滤波电容的作用,非极性电容则可以改善负载的瞬态影响,使电路稳定工作。如图4-16所示:

图4-16稳压电源


图4-17 单片机电路

4.5硬件电路设计优化

4.5.1 提高测距的范围
由于空气对超声波的吸收与超声波频率成正比,因此用来测距的超声波的频率不能很高。另一方面,频率越低,波长越长,测量的绝对误差就越大。所以,40Kz的超声波单频测距的范围只有5~6米,无法满足我们的要求。为了解决测量范围和测量精度之间的矛盾,我们采用双频测距的方法。其测距原理是:控制器现发出一串频率为fH的超声波,串长度可以有10~16个完整的波形,接着送出4~8fL低频率的超声波。这种在时域上连续的两种频率的超声波被前方的目标反射后,形成回波,回波经由接收器形成回波脉冲EchoH和EchoL。由于高频声波先发出,对于同一个目标,其回波EchoH先到达CPU,因此,对于较近的目标,首先用高频超声波探测。当目标较远时,高频超声波被空气吸收而大幅衰减,接收器接收到的回波中只有低频超声波EchoL。由于该装置在距离较远时对精度要求不是很高,所以可以用EchoL探测。如图4-17所示:



图4-17 双频超声波测距工作时序图

t0、t1分别为高、低超声波发射的开始时间,t2、t3为高、低超声波回波到达的时间,所测得的距离分别为:
D1=c(t2-t0)/2 (4-1)
D2=c(t3-t1)/2 (4-2)
经试验可知,用双频超声波发射,量程可达到25m。
4.5.2 发射探头和接收探头间的影响
超声波从发射到接收的时间间隔是由控制器内部的定时器来完成的。由于发射器探头与接收器探头的距离不大,有部分波未经被测物就直接绕射到接收器上,造成发送部分与接受部分的直接串扰问题。这一干扰问题可通过软件编程,使控制器不读取接收器在从发射开始到"虚假反射波"结束的时间段里的信号。这样,就有效的避免了干扰,但另一方面也形成了20cm左右的“盲区”。


4.5.5 温度对超声波测距的影响


精度要求较高的情况下,需要考虑温度对超声波传播速度的影响,对超声波传播速度加以修正,以减小误差。下面公式是超声波传播速度与空气温度的关系。
V = 331.4 + 0.607T

  式中,T为实际温度单位为℃,v为超声波在介质中的传播速度单位为m/s。

表 4-1 超声波波速与温度的关系表
[color=100%]
温度(℃)
-30
-20
-10
0
10
20
30
100
声速(ms
313
319
325
323
338
344
349
386

由于声音的速度在不同的温度下有所不同,为提高系统的精度,采用了温度补偿功能。这里采用的主要元器件是是美国Dallas半导体公司生产的单总线数字温度传感器DS18B20,其具有精度高、智能化、体积小、线路简单等特点。将DS18B20数据线与单片机的P1.1口相连,就可以实现温度测量,如图5-3


图4-19 温度测量芯片

5 软件设计


本设计的软件设计部分十分的重要,距离的换算与显示,就连部分硬件电路不能完成的滤波也要靠程序来完成。而且程序的设计也是本设计的难点。


5.1 程序完成的功能


本次设计的程序需要完成的功能有:
(1)超声波的发射和接受控制
(2)消除余振
(3)对回波信号的检测
(4)测距时间到距离的换算
(5)距离的显示
(6)对距离进行判断

5.3 主要部分程序流程图



5.4 实现重要功能的程序的分析



5.4.1实现温度读取功能


uint Read_Temperature(void) //读取温度,返回整数值
{
uint c;

reset(); //复位18b20芯片
tu=0; //先置位温度正负标示为正
if(r)
{
write(0xCC); // 跳过多传感器识别skio rom
write(0xBE); //发读内部9字节内容指令

c=read(); //读两个字

reset(); //读完两个字节后复位
write(0xCC); // 跳过多传感器识别skio rom
write(0x44); // 发启动温度变换指令


























图5-1 程序流程框图
if(c>0x1000){c=c+1;tu=1;} //若温度小于0,tu=1
c>>=4; //去掉低四位即为整数温度值,无需*0.0625
return c;
}
else{return r; } //返回0XFF表示未检测到18B20芯片
}

5.4.2实现根据温度转化声速


int C_speed(void) //根据温度查算声速值
{
uchar y;
y=Read_Temperature(); //采温度
if(r){ //若温度有变化则按温度值取声速
{
T_C=y; //温度值=变化后的温度值
if(tu==0)speed=332+T_C*0.607; //温度为正则+声速
else speed=332-T_C*0.607; //温度为负则-声速
}
}else speed=346.5; //若1820不存在即无法读取温度,声
速=346.5M/S(取25度)
return speed;
}

5.4.3实现距离计算


float Dis_count() //距离计算函数
{
float
 楼主| admin 发表于 2012-9-2 04:26:46 | 显示全部楼层
cm;
cm=TH1*256+TL1;
cm-=7610; //减去限制10M的初值+可调误差值
cm*=speed; //计算距离uS*34650m
cm/=20000; //转换为s 单程
return cm;
}

5.4.4 主函数的结构与内容


void main(void) //主函数
{
uchar w;
Read_Temperature(); //先采一次温度

for(w=11;w<255;w--) //启动显示9~0,H~A,-
{
LED_Data=LED0[w];
led_1H=0;led_2H=0;led_3H=0;
time(400);
bell=0;
LED_Data=0xff;
time(20);
bell=1;
OFF=0xff; //关闭P3口
}//--------------------------------------------

key();
T_show: //标号

EA=0; //关总中断
TR1=0; //停止计数

do{
LED_T_C(Read_Temperature());//采温度并转换为LED显示值
show(25); //显168次后采一次温度
key();
show(25);
key();
show(25);
key();
show(25);
key();
show(25);
key();
show(25);
key();
show(25);
key();
}while(show_temperature==1); //如WD为0只显示温度
//------------------测距部分开始
TMOD=0X11; //设定时器T0、T1工作于16位定时/计数 模式
EA=1; //开总中断
IT1=1; //外部中断下降沿触发方式
w=0;
while(1)
{
TT1(); //装T1初值
TR1=1; //启动定时器T1
Send_40K(); //发送测量方波
time_11uS(6); //延时66uS,限制最小测量

ET1=1; //允许T1中断
EX0=1; //允许外部中断0中断

do{ led_display();}
while(flag==0&&TO==0); //判断是否有收到回波 如有则计算 判断 是否超出测量范围
if(flag==1)
{
if(w>27){C_speed();w=0;} //测Wu次距后取一次温度声速
w++;

dis=Dis_count(); //转换距离
flag=0;

if(dis<=8||dis>=996){temp[0]=0xF7;temp[1]=0xF7;temp[2]=0xF7;}//溢出处理
else{
bell=0;
LED_temp(dis);
bell=1;
show(10); //测量数据显示
}

}

TO=0;

show(10);

key();
if(show_temperature==1)goto T_show; //如果WD为0则只显示温度

}
}
附录二:程序代码
//超声波测距系统 12M晶振
//#include "REG2051.H"
#include <REGx51.H>
#include <intrins.h>
//#include "math.h"

#define uint unsigned int
#define uchar unsigned char

#define LED_Data P0 //定义LED显示数据为P1口
#define OFF P3

sbit led_1H=P2^7; //定义数码管百位 片选
sbit led_2H=P2^6; //定义数码管十位 片选
sbit led_3H=P2^5; //定义数码管个位 片选

sbit DQ=P3^4; //18b20定义端口


sbit bell=P2^2; //定义蜂鸣器,为1则不响,为0时响
sbit Sout=P3^7; //定义超声波输出引脚

sbit k1=P1^0; //定义按键
sbit k2=P1^1;
sbit k3=P1^2;

bit r=0; //18b20存在标志位 0为不存在,1为存在
bit flag=0; //定义外部中断1标志位
bit TO=0; //定义T1中断1标志位
bit tu=0; //定义温度正、负标示位0为正1为负
bit show_temperature=0; //定义显示温度标志位

uchar T_C; //存温度值
uint i;
uint dis; //定义实形距离变量
float speed=346.50; // 346.5m/s(25度)

uchar temp[3]={0xF7,0xF7,0xF7};//*- - -*/ 定义显示暂存区
//显示段代码表
uchar code LED0[]={ 0x28,0xEE,0x32,0xA2,0xE4,0xA1,0x21,0xEA,0x20,0xA0,0xF7,};//0~9 -
//第一位数码管显示段码
uchar code LED1[]={0x08,0xCE,0x12,0x82,0xC4,0x81,0x01,0xCA,0x00,0x80,}; //0.~9.带小数点

//--------------------------------------------温度部分涵数声明
void time_11uS(uint x); //延时11US
void LED_T_C(uint x); //温度显示转换
uint Read_Temperature(void); //读温度
void write(char wr); //写1820
uint read(void); //读1820
uchar reset(void); //复位1820
//--------------------------------------------测距部分涵数声明
void led_display(void); //LED显示函数
void time(uint x); //延时1mS
void Send_40K(void); //输出20个40k方波函数
void LED_temp(uint x); //显示转换
void TT1(void); //装入初值
uint C_speed(void); //根据温度查表取声速值
float Dis_count(); //距离计算函数
//--------------------------------------------

//--------------------------------------------
//延时11us
void time_11uS(uint x)
{
for(;x>0;x--);
}
//--------------------------------------------

uchar reset(void) //复位1820
{
r=0;
DQ = 1;
_nop_();_nop_();
DQ = 0; //置低电平
time_11uS(50); // 等待500us
DQ = 1; // 置高电平
time_11uS(6); // 等待66US
while(DQ==0){r=1;} // 读响应
_nop_();

return(r); // 返回响应值 1=存在, 0 不存在
}

//--------------------------------------------
void write(char wr) //向总线上写一个字节
{
uchar i;
for (i=8; i>0; i--) // 写8位, 一位一位地写
{
DQ = 0; // 设为低电平,写开始
_nop_();_nop_();_nop_();_nop_();
DQ = wr&0x01; //最低位移出
time_11uS(6); // 延时66US确保数据送出
DQ = 1;
 楼主| admin 发表于 2012-9-2 04:26:49 | 显示全部楼层
//停止
wr=wr/2; //算法,相当于右移1位
}
time_11uS(1);
}
//--------------------------------------------

uint read(void) //从总线上读取2个字节
{
uchar i;
uint v = 0;
for (i=16;i>0;i--)
{
DQ = 0; // 开始信号
_nop_();_nop_();
v>>=1;
DQ = 1; // 恢复
_nop_();_nop_();_nop_();_nop_(); // 延时
if(DQ)v|=0x8000; //数据拼装
time_11uS(6); // 延时
}
DQ = 1;
return(v);
}

//--------------------------------------------

uint Read_Temperature(void) //读取温度,返回整数值
{

uint c;

reset(); //复位18b20
tu=0; //先置位温度正负标示为正
if(r)
{
write(0xCC); // 跳过多传感器识别skio rom
write(0xBE); //发读内部9字节内容指令

c=read(); //读两个字

reset(); //读完两个字节后复位
write(0xCC); // 跳过多传感器识别skio rom
write(0x44); // 发启动温度变换指令

if(c>0x1000){c=c+1;tu=1;} //若温度小于0,tu=1
c>>=4; //去掉低四位即为整数温度值,无需*0.0625

return c;
}
else{return r; } //返回0XFF表示未检测到18B20

}

//--------------------------------------------
void LED_T_C(uint x) //温度显示转换
{

if(tu==1){temp[2]=0x26;} //-2
else{temp[2]=0x37;} //显示温度符号,正则显示'C

if(r){temp[1]=LED0[x%10];} //-1
else{temp[1]=0xF7;/*-*/}

if(r){temp[0]=LED0[x/10];} //个位
else{temp[0]=0xF7;/*-*/}
}
//--------------------------------------------------------------------


//---------------------------------------------------------------------
void time(uint x) //普通延时函数
{uint j;

for(j=0;j<x;j++)
{
for(i=0;i<122;i++);//延时1mS
}
}
//--------------------------------------------

void Send_40K(void) //输出15个40k方波函数
{
for(i=30;i>0;i--)
{
_nop_();
_nop_();
_nop_();
Sout=!Sout;
}
}
//--------------------------------------------

float Dis_count() //距离计算函数
{
float cm;
cm=TH1*256+TL1;
cm-=7610; //减去限制10M的初值+可调误差值
cm*=speed; //计算距离uS*34650m
cm/=20000; //转换为s 单程
return cm;
}
//--------------------------------------------
void led_display(void) //LED显示函数
{

LED_Data=temp[2];led_3H=0; //显示个位,带小数点
time(5);led_3H=1;

LED_Data=temp[1];led_2H=0; //显示-1位,无小数点
time(5);led_2H=1;

LED_Data=temp[0];led_1H=0; //显示-2位,无小数点
time(5);led_1H=1;

LED_Data=0xFF; //关闭数据输出显示
}
//--------------------------------------------
void LED_temp(uint x) //显示转换
{
// x=(unsigned int)x;
temp[2]=LED0[x%10]; //-2
x/=10;
temp[1]=LED0[x%10]; //-1
x/=10;
temp[0]=LED1[x]; //个位
}

//---------------------------//装入初值
void TT1(void)
{
TH1=(65535-58000)/256; //初值装入定时器T1,用于发射超声波后计数,
TL1=(65535-58000)%256; //初值限定测量范围<10M
}
//--------------------------------------------

uint C_speed(void) //根据温度查算声速值
{
uchar y;
y=Read_Temperature(); //采温度
if(r){ //若1820存在则处理
if(T_C!=y) //若温度有变化则按温度值取声速
{
T_C=y; //温度值=变化后的温度值
if(tu==0)speed=332+T_C*0.607; //温度为正则+声速
else speed=332-T_C*0.607; //温度为负则-声速
}
}else speed=346.5; //若1820不存在即无法读取温度,则声速=346.5M/S(取25度)
return speed;
}
//--------------------------------------------
void show(uint x){for(;x>0;x--){led_display();}}//多次显示函数
//--------------------------------------------

void key(void) //键盘扫描
{
if(k1==0||k2==0||k3==0)
{
show(5);
if(k1==0){bell=0;show_temperature=~show_temperature;while(k1==0);bell=1;}
if(k2==0){bell=0;while(k2==0);bell=1;}
if(k3==0){bell=0;while(k3==0);bell=1;}
}
}
//--------------------------------------------



void main(void)//=================主函数===================
{
uchar w;

Read_Temperature(); //先采一次温度

for(w=11;w<255;w--) //启动显示9~0,H~A,-
{
LED_Data=LED0[w];
led_1H=0;led_2H=0;led_3H=0;
time(400);
bell=0;
LED_Data=0xff;
time(20);
bell=1;
OFF=0xff; //关闭P3口
}//--------------------------------------------

key();
T_show: //标号

EA=0; //关总中断
TR1=0; //停止计数

do{
LED_T_C(Read_Temperature()); //采温度并转换为LED显示值
show(25); //显168次后采一次温度
key();
show(25);
key();
show(25);
key();
show(25);
 楼主| admin 发表于 2012-9-2 04:26:52 | 显示全部楼层
key();
show(25);
key();
show(25);
key();
show(25);
key();
}while(show_temperature==1); //如WD为0只显示温度

//------------------测距部分开始
TMOD=0X11; //设定时器T0、T1工作于16位定时/计数模式
EA=1; //开总中断
IT1=1; //外部中断下降沿触发方式
w=0;
while(1)
{
TT1();//装T1初值
TR1=1; //启动定时器T1
Send_40K(); //发送测量方波
time_11uS(6); //延时66uS,限制最小测量

ET1=1; //允许T1中断
EX0=1; //允许外部中断0中断

do{ led_display();}
while(flag==0&&TO==0); //判断是否有收到回波 如有则计算 判断是否超出测量范围


if(flag==1)
{
if(w>27){C_speed();w=0;} //测Wu次距后取一次温度声速
w++;

dis=Dis_count(); //转换距离
flag=0;

if(dis<=8||dis>=996){temp[0]=0xF7;temp[1]=0xF7;temp[2]=0xF7;}//溢出处理
else{
bell=0;
LED_temp(dis);
bell=1;
show(10); //测量数据显示
}

}

TO=0;

show(10);

key();
if(show_temperature==1)goto T_show; //如果WD为0则只显示温度

}
}



//--------------------------------------------
void int1(void) interrupt 0 //外部中断0服务
{
TR1=0; //停止计数
EX1=0; //关外部中断1
flag=1;
}

//--------------------------------------------
void timer1(void) interrupt 3 //T1定时器中断服务
{

// ET1=0; //关中断
EX1=0; //关外部中断1
TR1=0; //关定时
TO=1;
temp[0]=0xF7; //未收到回波则显示 ---
temp[1]=0xF7;
temp[2]=0xF7;


*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 20:47 , Processed in 0.054760 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表