超声波测距实验报告Word文档下载推荐.docx
《超声波测距实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《超声波测距实验报告Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
摘要
—
该系统是一个以单片机技术为核心,实现实时测量并显示距离的超声波测距系统。
系统主要由超声波收发模块、温度补偿电路、LED显示电路、CPU处理电路、蜂鸣器报警电路等5部分组成。
系统测量距离的原理是先通过单片机发出40KHz方波串,然后检测超声波接收端是否接收到遇到障碍物反射的回波,同时测温装置检测环境温度。
单片机利用收到回波所用的时间和温度补偿得到的声速计算出距离,显示当前距离与温度,按照不同阈值进行蜂鸣报警。
由于超声波检测具有迅速、方便、计算简单、易于做到实时控制的特点,并且在测量精度方面能达到工业实用的要求,因此在生产生活中得到广泛的应用,例如超声波探伤、液位测量、汽车倒车雷达等。
关键词:
超声波测距温度测量单片机LED数码管显示蜂鸣报警
第一章绪论
1.1设计要求
设计一个超声波测距仪,实现以下功能:
(1)$
(2)测量距离要求不低于2米;
(3)测量精度±
1cm;
(3)超限蜂鸣器或语音报警。
1.2理论基础
一、超声波传感器基础知识
超声波传感器是利用晶体的压电效应和电致伸缩效应,将机械能与电能相互转换,并利用波的特性,实现对各种参量的测量。
超声波的传播速度与介质的密度和弹性特性有关,与环境条件也有关:
在气体中,超声波的传播速度与气体种类、压力及温度有关,在空气中传播速度为C=+0C(m/s)式中,t为环境温度,单位为0C.
二、压电式超声波发生器原理
压电式超声波发生器实际上是利用压电晶体的谐振来工作的。
它有两个压电晶片和一个共振板。
当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。
反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。
三、超声波测距原理
由于超声波指向性强,能量消耗缓慢,在空气中传播的距离较远,因而超声波经常用于距离的测量。
利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求。
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
超声波在空气中的传播速度为C,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:
s=Ct/2
。
[
从上面超声波特性可以知道:
超声波在空气中的传播速度与温度有关:
C=+0C(m/s),如果温度变化不大,则可认为声速是基本不变的,典型的环境温度与超声波的传播速度的关系为:
温度(℃)
-30
-20
-10
10
20
30
100
声速(米/称)
313
319
325
323
》
338
344
349
386
1.3.
1.4系统概述
超声波测距仪主要由超声波收发装置、单片机、测温装置、报警装置、LCD显示等组成。
系统检测距离的原理是通过单片机发出40kHz的方波脉冲信号后,检测接收端是否能够接收到遇障碍物反射的回波,同时,测温装置检测环境温度。
单片机利用收到回波所用的时间和温度补偿得到的声速计算出距离,同时显示出当前距离与温度。
测量距离范围为2~250cm。
可测量温度范围为-30~150°
C。
有温度与距离显示,误差小,精度高。
蜂鸣器预警和距离采样频率动态变化,距离越远,采样越慢。
!
-
:
图一系统框图
第二章方案论证
系统控制模块
控制器主要用于控制超声波起振脉冲的产生、对回波信号的处理、温度测量模块、蜂鸣报警以及显示模块的控制。
采用STC89C52单片机作为系统控制器。
它的运算功能强,软件编程灵活,自由度大,可用软件编程实现各种算法和逻辑控制,并且功耗低,成本低,技术成熟。
其程序可以采用C语言编写,可读性强,烧写程序容易,这大大加快了系统的开发与调试。
而且STC89C52有2个独立的定时器,两个独立的外部中断,正好可以达到我们的要求;
IO足够,还可外拓功能(如进行报警器的接入)。
,
距离测量模块
采用超声波传感器测距。
由于超声波的波长短,超声波射线可以和光线一样,能够反射、折射、也能够聚焦,而且遵循几何光学上的定律,即超声波从一种物质表面反射时,反射角等于入射角。
超声波具有较好的指向性,频率越高,指向性越强,具有较高的分辨率,因而其测试精度也较其他方法高。
而且超声波传感器具有体积小,结构简单,信号处理可靠性高的特点,价格较便宜,成功案例较多,可行性很高。
这里选用HC-SR04超声波测距模块,该模块性能稳定,测度距离精确,超微型,只相当于两个发射、接收头的面积,无盲区,反应速度快(10ms的测量周期)。
温度测量模块
方案一:
采用热敏电阻。
热敏电阻体积小,使用方便,但是精度、重复性、可靠性较差,对于检测1摄氏度的信号是不适用的。
在温度测量系统中,采用单片温度传感器,比如AD590,LM35、TMP75等。
但这些芯片输出的都是模拟信号,必须经过A/D转换后才能送给计算机,这样就使得测温装置的结构较复杂。
方案二:
采用数字温度芯片DS18B20测量温度。
测温范围是-55——+125摄氏度,固有测温分辨率是摄氏度。
输出信号全数字化,便于单片机处理及控制,省去传统测温方法的很多外围电路。
且该芯片的物理化学性很稳定,线形较好,能很好地满足此次测温要求。
经过以上比较,决定采用方案二。
实时显示模块
使用液晶显示屏显示。
液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示及影像稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点。
但是由于只需要显示温度和距离,信息量较少而液晶显示占用的控制资源较多,切对外界环境要求高,不宜维护。
使用传统的数码管显示。
数码管的特点:
低能耗、低损耗、寿命长,对外界环境要求低,易于维护,同时其精度比较高,称量快,操作简单。
数码管是采用BCD编码显示数字,程序编译容易,资源占用较少。
根据以上的论述,采用方案二。
蜂鸣报警模块
采用语音芯片ISD1420,WT588D系列等。
音质好,播报清晰,有较高的灵敏度,但是增加了硬件电路的复杂度,使得设计和焊接的难度加大。
而且对单片机和语音芯片的要求都比较高。
采用蜂鸣器报警。
在单片机的外围接一个蜂鸣器实现报警,而控制部分完全由单片机软件编程实现,使得设计变得更加简单,成本也更加低了。
根据上面的论述,拟定采取方案二。
'
第三章硬件电路设计
硬件设计主要包括以下几个模块:
超声波收发电路,蜂鸣器报警电路,温度测量电路,显示电路等。
以下是各个模块具体内容。
超声波收发电路
HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;
模块包括超声波发射器、接收器与控制电路。
基本工作原理:
(1)采用IO口TRIG触发测距,给最少10us的高电平信呈;
(2)模块自动发送8个40KHZ的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2。
^
图二HC-SR04模块电气参数
本系统中超声波的收发用单片机的、口控制,如图:
温度测量电路
\
温度补偿电路采用DS18B20芯片,DS18B20是美国DALLAS半导体公司生产的可组网数字式温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。
全部传感元件及转换电路集成在形如一只三极管的集成电路内。
与其它温度传感器相比,DS1820具有以下特性:
(1)独特的单线接口方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯。
(2)DS1820支持多点组网功能,多个DS1820可以并联在唯一的三线上,实现多点测温。
(3)DS1820在使用中不需要任何外围元件。
(4)温范围-55℃~+125℃,固有测温分辨率℃。
;
(5)测量结果以9位数字量方式串行传送。
DS18B20内部结构框图如图三所示:
图三DS18B20内部结构框图
DS18B20测温原理如图四所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图四DS18B20测温原理
本系统中温度模块用单片机的口控制,如图:
显示电路
数码管是一类价格便宜使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示时间、日期、温度等所有可用数字表示的参数的器件。
数码管由7个发光二极管组成,行成一个日字形,通过解码电路得到的数码接通相应的发光二极管而形成相应的字,这就是它的工作原理。
数码管按各发光二极管电极的连接方式分为共阳数码管和共阴数码管两种。
数码管的显示方式可以分为静态显示与动态显示两类。
其中动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态显示是将所有数码管通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示。
将所有数码管的8个显示笔划"
a,b,c,d,e,f,g,dp"
的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态是一样的,但是可以节约大量的I/O端口,降低功耗。
本系统的显示电路采用简单实用的4位共阳数码管,段码输出端口为单片机的P0口,位码输出端口为单片机的,,,口。
显示电路如图:
蜂鸣器报警电路
蜂鸣器报警用S8550三极管驱动蜂鸣器报警,口控制蜂鸣器,电路如图:
第四章软件设计
超声波测距的软件设计主要由主程序、超声波收发模块控制程序及距离和温度显示子程序,报警子程序等组成。
整个程序运用C语言进行编写,大量使用子函数的调用和函数嵌套,使得程序清晰简洁,却可以实现较复杂的算法。
程序流程图如下:
:
.
主程序首先对系统环境初始化,置位总中断允许位EA并给显示端口清零,然后调用超声波发射子程序送出一个超声波脉冲,为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延时后才打开外中断0接收返回信号。
一旦检测到返回信号,立即进入中断程序,结束记时,并保存时间,进行计算、编码,与发送编码比较,若不符则重发;
若小于报警距离则发出警报。
若没有检测到返回信号,则判断接收限时是否已到,若接收限时未到,则继续巡回检测接收,否则返回发射状态重发。
第五章调试过程中遇到的问题及解决
`
画PCB及制作
由于我们组三个成员都没有画PCB及制作的经验,所以PCB的制作花费了较大的力气,相当于是从零做起。
首先我们安装了AltiumDesigner,然后在网上下载了相关的学习资料和教学视频,自己初步绘制了电路原理图。
在生成PCB的时候,遇到了较大的困难。
由于我们画的原理图只考虑了电路的逻辑正确性,而没有考虑布线的复杂度和可行性,以至于软件自动布线后生成的PCB线路混乱,手动调整难度相当大。
在和店家沟通后,我们对原理图的线路进行了改动,尽可能使其规整和清晰,生成PCB后果然有了很大的改观,手动调整布线的工程量也大大降低。
焊接问题及解决
焊接过程总体来说比较顺利,元件不是很多,也不存在高焊接难度的芯片。
但是遇到的一个最大的问题是三极管的型号问题:
在LED显示驱动电路中我们用的四个三极管是PNP型的,而在驱动蜂鸣器的时候我们需要的是NPN型的。
但是由于制作PCB板的时候,我们没有跟店家做特别的说明,导致板子上的三极管封装都做成了PNP型的。
经过仔细询问店家,确保无误后,我们采用了反接PNP三极管的办法,使其达到NPN的效果。
且经过实验测定,发现该办法可行,对实验结果不影响。
这样就避免了我们再次制板,节省了时间,降低了成本。
软件调试
软件的调试的过程相对硬件来说较为漫长和辛苦。
因为软件部分的主程序我们是参考老师给出的模板,所以调试过程中遇到了很多端口和子函数调用方面的问题。
最典型的是以下几个:
(1)在初次烧写程序后,我们发现数码管根本无法显示,报警功能也无法实现。
【解决办法】我们采用软硬件分开调试的办法。
用学习板在我们的单片机中重新载入了一个测试程序,装进模块后发现数码管可以正常显示,由此确定电路和焊接是正确的,问题肯定出在程序上。
于是我们仔细检查了程序,发现由于疏忽,我们把显示端口写错了。
经过修改,数码管得以正确显示。
(2)在电路可以显示距离后,经过多次实验,我们发现温度补偿后换算得到的距离误差较大。
【解决办法】我们将程序中进行温度补偿的程序段代码,直接修改为我们常用的声速340m/s,保留了温度转换的功能,但是并不真正根据实时的温度计算距离,改过以后测量的准确度大大提高。
(3)距离和温度显示时,最高位数码管的值出现乱码。
【解决办法】在设计电路时,我们用了七段四位数码管,并且把它的四个位全部接进了电路。
但是实际显示时,我们最多只需要三位,所以我们采用把温度和距离显示函数中的最高位给零的办法,避免了乱码的闪烁和跳动。
实验数据
…
11
实距(cm)
$
5
15
40
50
测距1
19
29
41
99
测距2
@
98
测距3
14
均值
误差
<
报警
—
¥
120
140
160
180
190
200
宿舍高
宿舍长
121
141
179
192
198
304
494
142
161
;
+
+
0
实验总结
本系统以AT85S52单片机为核心,利用传感器技术,单片机技术,显示技术等并配合一套独特的软件算法实现了测距、温度和距离的实时显示、报警等功能。
在系统设计过程中力求硬件电路简单,充分发挥软件编程方便灵活的特点,来满足系统设计要求。
这次项目完成过程中我们收获很大,由于我们组三个成员以前都没有接触过相关知识,包括AltiumDesigner软件的使用、单片机的原理和编程等,都是从零学起。
在软件调试的时候,遇到了很多问题,我们查阅了大量的书籍和资料,重新学习和复习C语言,反复检查程序并加以修正。
不仅增长了很多知识,更积累了制作和调试电路的经历。
在实验过程中,我们做到了严格的分工,有同学负责收集资料和原理学习及,有同学负责硬件电路设计和PCB绘制,还有文字功底比较强的同学负责实验报告的撰写,大家一起讨论完成了程序的编写和调试。
但是由于时间和水平有限,还存在很多缺陷。
比如我们并没有做到美观大方的液晶显示,只是采用数码管简单显示了温度和距离;
没有做到优质清晰的语音报警,仅仅实现了超限蜂鸣报警的功能。
这次实验警醒我们在以后的学习不仅要加强编程能力,而且要勤动手进行硬件方面的实践,否则在真正用到的时候就只能是心有余而力不足。
总之,这次实验是对我们学习能力和以前学习成果的一个非常好的检验。
我们学到了知识,也认识了不足,这将对我们以后的学习和工作起到很大的帮助和引导作用。
]
附件
元器件清单
芯片类:
STC89C52单片机
超声波收发模块
LED7段4位数码管
DS18B20温度芯片
蜂鸣器
器件类:
晶振:
12MHZ
电阻:
510Ω8只
Ω6只
10kΩ1只
瓷片电容:
20pF2只
电解电容:
μF1只
三极管:
8550(PNP)5只
按键:
1个
HC-SR04超声波测距模块说明书
电路原理图
PCB图
程序
#include<
>
}
voidw_1byte_ds18b20(unsignedcharvalue)//向DS18B20写一字节的数据
{
unsignedchari=0;
for(i=0;
i<
8;
i++)
{
wendu=1;
_nop_();
wendu=0;
wendu=value&
0x01;
//最低位移出
delay(6);
value>
=1;
}
}
unsignedcharr_1byte_ds18b20(void)//读一个字节
unsignedcharvalue=0;
for(i=0;
i++)
_nop_();
if(wendu==1)value|=0x80;
//相当于value=value|0x80;
returnvalue;
/
readtemp_ds18b20()//读取温度
unsignedcharn=0;
rest_ds18b20();
//复位
w_1byte_ds18b20(0xcc);
//跳过读序列号的操作
w_1byte_ds18b20(0x44);
//启动温度转换
w_1byte_ds18b20(0xbe);
//读取温度寄存器
templ=r_1byte_ds18b20();
//温度低8位
temph=r_1byte_ds18b20();
//温度高8位
if(temph>
127)
//当符号位为1时,先将补码变为原码,再计算十进制值
temph=256-temph;
templ=256-templ;
n=1;
number[4]=(((templ&
0xf0)>
4)|((temph&
0x0f)<
4));
//温度值为中间16位
speed=(number[4]*3/5+331+20)/100;
number[2]=number[4]/100;
number[4]=number[4]%100;
number[1]=number[4]/10;
number[0]=number[4]%10;
number[3]=0;
if(n){number[3]=0x0a;
}//如果温度测量为负值,则最高位为‘-’
wendu_display(void)//温度显示函数
{intj;
P0=0xff;
P1=0xff;
readtemp_ds18b20();
for(j=0;
j<
250;
j++)
chark;
for(k=0;
k<
4;
k++)
P0=shuma[number[3-k]];
P2=position[k];
delay(90);
P2=0xff;
voidBeep()//持续1s
unsignedchari;
1000;
{
BEEP=1;
delay(500);
BEEP=0;
/********************************************************/
voidCount(void)//计算距离
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*/200;
//算出来是CM
if(S<
=10)Beep();
if((S>
=700)||flag==1)//超出测量范围显示“-”,以7米为限
{
flag=0;
distance[0]=10;
//“-”
distance[1]=10;
distance[2]=1