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