资源描述
济南职业学院
毕业设计(论文)
题 目: 超声波测距倒车雷达设计
系 部: 电子工程系
专 业: 电气自动化
学 号: 201208022116
学生姓名: 陈泰
指导教师: 郭振慧
职 称: 讲师
二O一五年四月二日
济南职业学院
毕业论文(设计)任务书
课题名称:__ 超声波测距倒车雷达设计
系 部: 电子工程系
专 业: 电气自动化
姓 名: 陈泰
学 号:___ 201208022116
指导教师: 郭振慧
二O一五年四月二日
超声波倒车雷达设计
摘要
本次设计采用单片机STC89C52来控制整个超声波系统。由单片机控制产生超声波并且控制定时器开始计时,当接收电路接收到回波时,定时器产生中断,停止计时。信号发出到接收到回波信号所用的时间是由单片机计算完成,从而得到实测的距离。距离显示在LED数码管上,并控制报警电路。
整个硬件电路由电源电路、按键电路、显示电路、报警电路以及超声波模块构成。按键电路用来控制报警距离的增加或者减少,方便且实用。本次设计具有容易控制和工作稳定等优点。
关键词:STC89C52 超声波 测距
目录
第1章 前言 1
1.1 课题研究的目的及意义 1
1.2 超声波测距系统的国内外现状 1
1.3 设计的要求 1
第2章 系统总体方案的选择 2
2.1超声波的简介 2
2.2 超声波测距系统原理 2
2.3 方案选择 2
第3章 整体硬件电路设计 4
3.1单片机系统电路 4
3.1.1复位电路 4
3.1.2 时钟电路 5
3.2 蜂鸣器报警电路 6
3.3 按键电路 6
3.4 超声波发射电路 7
3.5 超声波接收电路 7
3.6 超声波模块 8
3.7 显示电路 8
3.8 电源电路 9
3.9 系统的整体电路 10
第4章 软件部分 11
4.1 主程序设计 11
4.2 中断处理程序 12
4.3 距离的计算及显示电路的设计 13
4.4 报警电路的设计 14
4.5 按键电路的设计 14
第5章 硬件的组装及调试 15
结论 17
致谢 18
参考文献 19
附录 20
第1章 前言
1.1 课题研究的目的及意义
经济的发展带来社会的进步,超声波测距被频繁的用在人们的日常工作之中。超声波拥有测量稳定、穿透能力强、易接收等特点,同时超声波测距不用接触到物体,适用于了情况比较复杂的环境。还因为超声波测距易于控制,并且达到了所要求测量的工业指标,所以超声波测距被用于获取距障碍物的位置信息、移动机器人、汽车倒车雷达等方面的研究。
1.2 超声波测距系统的国内外现状
国内超声波测距主要针对固体和液体的研究,在测距的稳定性和精确性上有了很大程度的提高。并且随着科学技术的不断提高,超声波技术在工业的自动控制、汽车倒车系统等方面也有深入的研究。此外在医学、生物科学等领域也有突出的地位。
国外也做了大量的研究是关于提高超声波测距。Figneroa J.F.,Lamancusa J.S.在计算时间方法上又有了新的突破,传播时间的获得是通过相加峰值时延和相位时延。
1.3 设计的要求
设计一个超声波测距系统,距离设定一个限定值,当超声波探头与被测物体的距离小于设定值时,两者的距离显示在四位七段数码管上并开始报警。
设计主要需求如下:
(1) 电路测量的距离为≤6m。并且误差率不得超过0.03%。
(2) 与被测物体的距离用数码管显示,并有报警功能。
(3)设置按键电路,能对设置的最小报警距离进行改变。
第2章 系统总体方案的选择
2.1超声波的简介
我们知道,声音的发出是产生了振动。我们知道赫兹定义为声音的振动频率,20~20000赫兹的振动频率是人的耳朵可以接收到的,高于20000赫兹的,我们定义为超声波。超声波具有穿透性好、容易获取等特点,在医学、工业、军事、农业等方面有着巨大的研究价值。
2.2 超声波测距系统原理
在超声波测距的过程中,超声波的发射端接收到的脉冲为一系列的方波。时间间隔大小为方波的宽度,距离越远,脉冲的宽度越大。脉冲的个数也随着测距的远近而变化。超声波测距的方法是:测量出输出脉冲的宽度即发出超声波到接收超声波的时间间隔t,利用公式S=1/2vt,算出被测距离。
超声波的算法设计:X1是超声波发出的时间,X2是超声波接收的时间。我们知道声波的传播速度为340m/s,所以被测距离L如图2-1。
图2-1测距原理
2.3 方案选择
单片机
控制器
本方案选择STC89C52单片机来控制整个电路,测得的距离显示在四位数码管上,并根据所设置的报警距离开始报警。超声波的发射信号由单片机发出并送到发射电路上,发出超声波。接收电路由CX20106A芯片和接收探头构成。报警电路中,电阻R15为限流电阻、晶体三级管为驱动蜂鸣器。本设计将发射探头和接收探头分离,这样可以避免信号发生混叠干扰,从而使的测量数据更加的精确。根据以上设计如图2-2。
单片机
控制器
数码管显示
超声波的接收
蜂鸣器报警
超声波的发射
图2-2 系统框图
结合实际需求,在网上查找了相关的资料,决定选用HC-SR04超声波集成模块。此模块发出的超声波能够测量的范围在5m到2cm之间,能够准确到3mm,它的发射角不大于15°,有利于准确的测量。并且工作频率在39 kHz~41 kHz左右,完全符合本次设计的40kHz的工作频率。
由于超声波的发射探头和接收探头是放在同一水平直线上的,而且超声波信号在传播的过程中会发生衰减,所以两个探头不能距离太远。又因为如果两个探头离的太近会产生信号的干扰,测量出来的结果会产生误差。 第3章 整体硬件电路设计
3.1单片机系统电路
本次设计采用了高速、功耗低的STC89C52单片机。这款STC89C52单片机在功能上和以前51单片机的一样,并且还扩展了功能,使得用起来更加的方便。
图3-1 STC89C52引脚图
3.1.1复位电路
在单片机规格书中,有这样一段描述:如果当RST端口持续两个周期以上的高电平,系统就会复位。电路如下:
图3-2 复位电路
在VCC供电时,RST的电压和VCC一样。随着从 C3电容的充电,RST电位开始下降,并形成一个正向的脉冲,只要脉冲宽度足够就可以实现复位。
关于RC的计算:
(3-1)
机械周期=震荡周期*12 (3-2)
关于复位时间t的计算:
(3-3)
查看相关资料知道,当REST上的电压高于0.7Vcc时,就可以被看为高电平。本次用的系统电压为5V,所以REST上超过3.5V就可以看成高电平,并且高电平的时间超过2us,单片机就可以复位。最后计算RST的电位,复位电路为一阶RC电路,所以电压与电流有一下关系:
(3-4)
因为;;所以。
设Reset pin 电压为,那么: 所以,,
当的时,。当且仅当 时,系统实现复位,并且电阻和电容RC满足条件。所以用R=10KΩ、C=10μF符合要求。
3.1.2 时钟电路
时钟电路的两个引脚分别接入XTAL1端口和XTAL2端口。在两个引脚之间接入一个12M的晶振,两个22PF的电容和晶振并联后接地。电容的可以使电路更加的稳定,电路如下:
图3-3 时钟电路
3.2 蜂鸣器报警电路
报警电路由蜂鸣器、三极管、电阻构成。蜂鸣器由三极管驱动。R15为1k的电阻,作用是保护蜂鸣器。单片机P36端口和电阻R15连接,当单片机P36口发送一个低电平到报警电路时,NPN型三极管开始驱动蜂鸣器进行报警,报警电路如图3-4。
图3-4报警电路
3.3 按键电路
按键电路由三个切换开关,一个LED设置指示灯和一个限流电阻构成。电路图3-5如下:
图3-5按键电路
按键电路的功能是:当按下k1键位时,指示灯亮起,开始设置报警距离。K2按下,报警距离从原来的距离开始增大,当按下K3键位报警距离开始减小。
限流电阻R14的计算:
R=(U2-U1)/I (3-5)
式中U2为提供的5V电压,U1和I分别为发光二极管两端的电压、电流。此次设置指示灯用的是绿色发光二极管,正向压降UF为2v,工作电流IF为20毫安。所以R14=(5-2)/0.02=150Ω。
3.4 超声波发射电路
发射电路主要由5个非门组成74LS04芯片电路组成。单片机发出的40 kHz的脉冲不能直接由发射电路发出,要经过足够倍数的放大后,才能由发射探头发出。所以74LS04反相器其实就是一个放大电路。超声波发射电路如图3-6所示。
图3-6 发射电路
R16和R17为1K的电阻,能够74LS04芯片放大的输出能力。Vcc为整个电路提供电源。
电路工作时,单片机产生的40 kHz由P0.1端口发送到发射电路,信号由74LS04芯片放大并由超发出。
3.5 超声波接收电路
由于超声波在传播的过程中是有衰减的,所以在中长距离的测量中,反射回来的信号被衰减了,所以有必要进行信号的放大,放大的倍数还比较大。查看相关资料,此次设计采用的是CX20106A芯片,此芯片具有信号放大、峰值检波、比较等功能。芯片CX20106A电路构成了主要的接收电路,比较完信号后会产生一个低电平发送到单片机进行中断,中断以后,开始进行数据的处理。如图3-7所示。
图3-7接收电路
3.6 超声波模块
HR-SR04超声波模块包含了接收探头、发射探头、74LS04芯片放大电路和CX20106A芯片电路。超声波模块如图3-8所示。
图3-8超声波集成模块
HR-SR04有四个连接口,分别为VCC、GND、TRIG、ECHO四个接口。
VCC:提供5V的电源
GND:地线
TRIG:信号的输入端口
ECHO:信号的输出端口
工作原理:此模块能够发出8个40 kHz的方波脉冲,并且可以自动检测有没有信号的返回。
3.7 显示电路
本次设计的显示电路由四位七段数码管、三极管和三个电阻组成。数码管由三级管来驱动,限流电阻R11、R12和R13是保护整个显示电路,如图3-9。
图3-9 显示电路
LED是发光二极管的简称,八只发光二极管构成了数码管,国际上记作:a、b、c、d、e、f、g、dp。dp为小数点。
数码管要能够正常的显示就必须要有驱动电路来驱动,本次设计采用了动态的方式。动态驱动的优点有:节省了大量的I/O口,并且消耗低,所以本次设计采用动态的驱动方式,四位数码管的接线方式为共阳极的接法。
3.8 电源电路
电路由一个5V电源、一个发光二极管和限流电阻组成。发光二极管采用的是红色,作为电源指示灯,电路如图3-10所示。
图3-10 电源电路
关于发光二极管限流电阻R2的计算:
能加到发光二极管两边的电压为5V,使用时要串联一个限流电阻用以保护发光二极管。电阻R2的计算为:
R2=(E-UF)/IF (3-6)
式中的E为电源电压,UF为发光二极管的两端电压,IF为发光二极管的两端电流。
发光二极管根据用途不同,颜色也不同。红色发光二极管的工作电压是2V。发光二极管的电流大概为20mA,本次设计采用的是红色发光二极管。采用的电源电压为5V,电源电压减红色二极管的两端电压就是电阻R2的电压,再用R2两端的电压除以红色二极管两端电流就能计算出R2。所以R2=(5-2)/0.02=150Ω。
3.9 系统的整体电路
图3-11 系统电路图
整个系统由电源电路提供5V电源,数据由超声模块传到单片机进行处理,最后显示在数码管上并开始报警。 第4章 软件部分
本次设计采用的思想是分块进行设计及编写程序代码。程序主要分为主程序和中断程序。主程序包括初始化单片机STC89C53、超声波的发出和接收、距离的计算、按键电路的设置、距离的显示和蜂鸣器的报警等。
4.1 主程序设计
主程序是初始化单片机STC89C52,然后置1回波接收位。同时通过端口P3.0发送一个低电平来启动超声波的发射电路,并且开启定时器T0开始计时。这时调动计算子程序根据记录的T0时间计算距离,计算完成后,调用子程序显示距离。与此同时,调用声音处理程序进行蜂鸣器的报警。主程序根据反射回来的信号继续工作,如果回波标志位为0则说明成功接收到了回波信号,这时开始置位并且发送一个低电平到发射电路,就这样不停的循环,实现测距功能。根据以上描述主程序的流程图如图4-1所示。
开始
系统初始化
超声波模块复位
发射超声波并启动T0开中断
接收到回波的同时中断停止
计算测量距离
显示距离同时蜂鸣器报警
报警
延时
图4-1 主程序流程图
4.2 中断处理程序
负责计算距离的程序是中断处理程序。根据前面的分析,当接收电路接收到回波信号以后,同样会产生一个低电平送至单片机的P3.1端口。这时转入中断处理程序,定时器T0以及外部中断0就立刻关闭。读取时间值,并给接收回波的标志位清零。本设计的中断处理程序的程序流程图如图4-2所示。
计时停止
指定的报警声开启
中断关闭
返回
距离计算处理
显示距离并根据距离判断是否报警
Y
N
图4-2 中断处理程序流程图
在中断处理程序中,对于距离的计算是比较关键的。先从定时器T0那里读取时间值,再根据公式计算出距离,最后在实现各模块的功能。
4.3 距离的计算及显示电路的设计
根据公式S=17×N/1000=0.017×N(cm),可以看出来求出距离的关键是N值,也就是定时器T0计数的次数。当接收探头接收到回波信号时,电路会产生一个低电平送至单片机的P3.1端口,这时,定时器停止工作,并且提取定时器计数的次数N,计算出距离。
本次设计采用的扫描方式为简单实用的动态扫描,用四位共阳极的连接方式连接数码管显示距离。单片机的P2口和数码管进行段的动态扫描,因为距离的显示是在变化不固定的,所以数码管的显示过程是在外部中断后进行的。
4.4 报警电路的设计
主程序根据计算公式算出与被测物体的距离,通过数码管显示,并且调用报警子程序控制蜂鸣器进行报警。
4.5 按键电路的设计
当按下k1键位,进入设置模式,默认的报警距离在数码管上进行显示,每按k2一次显示距离增加十厘米,每按下k3一次显示距离减少十厘米,设置好新的报警距离后再次按下k1键位时,单片机自动计算显示距离是否小于新设置的报警距离,如果小于蜂鸣器开始报警。按键电路程序流程如图4-3所示。
按下菜单键重新设置报警距离
距离增加
距离减少
再次按下菜单键设置完成
计算距离
显示距离是否报警
图 4-3 按键电路程序流程图 第5章 硬件的组装及调试
本次超声波测距的设计以HR-SR04超声波模块为主体,中心频率为40 kH。硬件的连接及焊接如下:单片机的P2口(P20~P27)对应焊接到数码管的a、b、c、d、e、f、g、dp,进行段动态扫描。P1口(P11~P13)控制数码管的片选段。P30和P31分别接到超声波模块的Echo、Trig 端口。报警电路引脚接到单片机P36端口。
测量到一本书的距离,实际距离为38cm,测得距离为37cm,误差的范围在1cm~2cm,比较稳定,实际测距情况如图5-1所示。
图5-1 测量情况显示
按下菜单键位,重新设置报警距离,报警距离为80cm。实际距离为95cm,测得的距离为94cm,蜂鸣器开始报警,如图5-2所示。
图5-2 测量情况
在现实测距中,测量值与真实值误差产生的原因分析:
可能与被测物体的横截面积大小有关。被测物体横截面太小,超声波信号不能被完全的反射回来。
可能与被测物体的光滑程度有光。表面不平滑的物体容易使信号散射开来,接收探头接收到的信号变弱。
结论
从开学的选题到现在做毕业设计完成的几个月时间里,此次课题的选着从开始的不了解到现在实物焊接成功以及论文的完成,我学习到了很多知识,让我了解从理论到实践过程的艰辛。在设计的这段时间里,从刚开始思考到课题的完成,每一步都在努力的做到最好。对大学四年的学习做了一次比较全面的检练。
根据任务书的要求与实际结合,本次设计以单片机STC89C52为主,采用HR-SR04超声波集成模块对超声波的发射和接收,利用四位数码管和和蜂鸣器进行显示和报警。并且设置了按键电路方便的对报警距离进行修改。做出来的实物基本满足任务要求,但在调试过程中发现了一下几个问题:
环境的温度对距离的测量有影响,当我在阳光下和在阴凉处对同一距离测出来的数值不一样。查看有关资料,对于温度的影响,在设计中可以考虑加上温度补偿模块。
被测物体表面的材质不同也影响距离的测定,几次结果表明:表面粗糙的物体比表面光滑的物体引起的误差更大。可能粗糙的表面信号散射开,这样接收到的回波信号弱,因此产生误差。
通过上网了解,影响误差的还有可能是余波信号的影响。在测距时,有一部分声波没通过反射直接传到接收探头那里。这种余波的印象对测距的影响还是挺大的。单这种干扰可以通过软件算法的方法去除。
致谢
本次毕业设计论文在郭振慧老师的耐心指导下,总算完成老师的治学敬业态度让我很感动,很感谢老师的辛苦付出,让我的大学四年画上了一个完美的句号。在本次设计中,老师不断的对我的设计提出很多疑问,让我能在这方面更加深入的思考,并且在我不知所措时,认真仔细的指导我解决问题,这才使得设计的课题能够顺利完成。
同时还要感谢教过我指导我的所有老师,你们在我大学的四年里扮演了重要的角色。你们给予我的不仅是知识,还有以后出入社会的优秀品质。谢谢你们的建议与忠告,让我对即将踏入的社会有了自信和目标。谢谢身边的朋友,大学里的每一步都有你们的印记。
参考文献
[1] Y. S. Huang M. S. Young.An Accurate Ultrasonic Distance Measurement System with Self Temperature Compensation[J].Instrumentation science & technology.2009,37(01):22-29.
[2] 姚永平.STC89C51RC/RD+系列单片机指南[DB/OL].www.MCU-M, 2005-6-25.
[3] 王安敏,张凯.基于AT89C52单片机的超声波测距系统[J].仪表技术与传感器.2006(06):44-49
[4] 戴曰章,吴志勇.基于AT89C51单片机的超声波测距系统设计[J].计量与测试技术.2005(02):17-18
[5] 吴超,戴亚文.基于AT89S52单片机的超声波测距系统的设计[J].中原工学院学报.2008(10):65-68
[6] 张春光.基于单片机的超声波测距系统的设计[J].可编程控制器与工厂自动化.2008(09):16-19
[7] 苏炜,龚壁建,潘笑.超声波测距误差分析[J].传感器技术.2004(06):8-11
[8] 李光飞,楼然苗,胡加文.单片机课程设计实例指导[M].北京:航空航天大学出版社.2004:86-91
[9] 李建法.超声波测距的电路设计与单片机编程[J].安阳师范学院学报.2003(05):47-48
[10] Sv. Noykov Ch. Roumenin.Calibration and interface of a polaroid ultrasonic sensor for mobile robots[J].Sensors and Actuators.2007,135(01):55-58
[11]rtori S:ZHANG G X. Geometric Error Measurement and Compensation of Machines.Annals of the CIRP. 1995:599-609
[12]olton W.Instrumentation&process measurement.Longman Scientific Technical. 1991
[13]张 芬:基于C8051F320单片机的超声波测距仪,中国地质大学(武汉)机械与电子信息学院,仪表技术与传感器,2009(09):56-62
[14]李为民:基于stc89单片机的超声波测距仪, 陕西师范大学学报,2005(10):35-48
[15] Fox, J.D., Khuri-Yakub, B.T. and Kino, G.S., "High Frequency Acoustic Wave Measurement in Air", in Proceedings of IEEE 1983 Ultrasonic Symposium, October 31-2 November, 1983, Atlanta, GA, pp. 581-4.
[16]Martin Abreu, J.M., Ceres, R. and Freire, T., "Ultrasonic Ranging: Envelope Analysis Gives Improved Accuracy", Sensor Review, Vol. 12 No. 1, 1992, pp. 17-21.
[17]Martin, J.M., Ceres, R., Calderon, L and Freire, T., "Ultrasonic Ranging Gets Thermal Correction", Sensor Review, Vol. 9 No. 3, 198
附录
总程序:
#include <reg52.h> //头文件
#include <intrins.h> // 延时 _crol_函数 的文件
#define uint unsigned int
#define uchar unsigned char
uint Slong=30; // 报警距离值 如果需要修改报警距离,则改此处数值就可。
void delay(uint); //声明延时子函数
int m; //定义变量m
uchar a=0; //定义变量a。 初始值为0;
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
unsigned char const discode[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/}; //共阳数码管段选
unsigned char const positon[3]={ 0xfd,0xfb,0xf7}; //数码管位选
unsigned char disbuff[3] ={0,0,0,};
sbit RX=P3^0; // 就是超声波Echo口线
sbit TX=P3^1; // 就是超声波Trig口线
bit flag =0;
sbit speak=P3^6; //蜂咛器报警的口线定义
sbit shezhideng=P3^5; //设置指示灯的 口线定义
sbit k1=P3^2; // 按键的口线定义
sbit k2=P3^3;
sbit k3=P3^4;
void Display() //扫描数码管 以下为扫描数码管的相应程序。 会进行多次赋值。
{
if(posit==0)
{P2=(discode[disbuff[posit]])&0xff;}
else
{P2=discode[disbuff[posit]];}
P1=positon[posit];
if(++posit>=3)
posit=0;
}
void delay(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--);
for(j=110;j>0;j--);
}
void m_main() //程序一直在 m_main() 函数面循环。
{
if(!k1) //按下K1键 功能:每按下K1键,a就加1. 使程序在下面的相应程序里跑。。。
{
delay(7); //延时去抖
if(!k1)
{
a++; //变量a加1
} while(!k1); //等待按键弹起
}
/******************当a=0时************************************/
if(a==0) //当a=0时,系统为正常进行,会自动计算距离,会检测是否报警。
{
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
m=S; //将计算出的值 赋给 变量m ; m值会在数码管上显示。
warn(); //报警函数
Conut(); //计算
shezhideng=1; //关闭设置指示灯
}
/*****************当a=1时*************************************/
if(a==1) //当a等于1时
{
m=Slong; //将Slong的值 赋给m ,使数码管显示报警值,然后好进行修改。
Conut(); //计算
shezhideng=0; //设置指示灯点亮
speak=1; //关闭报警
if(!k2) //按下按键
{
delay(10); //延时去抖
if(!k2)
{
Slong+=10; //没按下一次,数值加10
}
while(!k2); //等待按键 弹起
}
else if(!k3)
{
delay(10);
if(!k3)
{
Slong-=10;
} while(!k3);
}
}
/******************当a=2时************************************/
if(a==2) //当a等于2时 。 目的是 当再次按K1键时,使a=0. 达到循环的作用。
{
a=0; // 使a等于0, 让程序进入 相应的运行。 请看上面的a=0时系统为正常进行,会自动计算距离,会检测是否报警。
}
}
warn() //报警函数
{
if(S<=Slong ) //当距离小于等于设定的报警值时
{
speak=0; //蜂咛器报警
}
if(S>Slong) //当距离大于设定的报警值时
{
speak=1; // 蜂咛器不报警。
}
}
Conut(void) //计算 所测距离的值。
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
}
else
{
disbuff[0]=m%1000/100;
disbuff[1]=m%1000%100/10;
disbuff[2]=m%1000%10 %10;
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/*****************************
展开阅读全文