找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13718|回复: 2
收起左侧

基于单片机的汽车后侧防撞报警装置 倒车雷达设计论文下载

[复制链接]
ID:199050 发表于 2017-5-10 12:48 | 显示全部楼层 |阅读模式


随着我国经济的飞速发展,汽车的需求量急剧增加,现在家家户户拥有汽车已经成为现实。但是随着汽车数量的增加,其引发的事故也不断在增加。倒车引发的汽车事故也占不小的比重,而倒车时车尾存在的盲区是其主导因素,因此解决倒车盲区是安全驾驶必须要解决的问题。

本设计采用以 STC89C52 单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路和软件设计方法。整个电路采用模块化设计,由主程序、数据处理子程序、显示子程序等模块组成。各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。相关部分附有硬件电路图、程序流程图。

该设计通过模块的组合和软件的控制,实现了设计要求的功能。本设计在使用上面方便,成本较低。不但完成了这些功能,还达到了汽车倒车的安全指标。



  

随着我国经济的建设、社会的进步、人们生活水平的提高,汽车已经与老百姓的生活密不可分,而其作为重要的交通工具,在人们生活中的作用也越来越重要。但是伴随着汽车数量的增加,同时也由于驾驶者本身技术的不熟练,或是道路及停车条件的影响,导致了交通事故频发。在汽车事故中,由倒车引发的比重所占较大。因为在倒车时汽车后视镜有死角,驾驶员目测距离的误差、视线模糊等原因使汽车倒车存在极大的安全隐患,因此解决倒车盲区是关乎安全驾驶的首要问题。因此汽车产品家族中“倒车防撞系统”应需而生。通过调查,我们发现很多汽车驾驶员都希望自己的车具有发现汽车尾部障碍物的设备,并能为自己提供驾车提示,以此来减少事故的发生,保证行驶安全。倒车检测及报警系统的产生不仅满足了广大驾驶员的需求,从一定程度上帮助人们解决了这一问题


1   绪论
背景与意义 1.1.1 研究背景

随着社会的进步,工业经济的发展,汽车作为一项重要的代步工具,已然成为了人们生活中不可或缺的必需品之一。然而,汽车除了在生活中能为人们带来便利之外,也同时带来了巨大的问题[1]。一方面,随着人们经济实力的增强,汽车数量激增,不仅使道路交通承受巨大压力,也使得停车场等公共交通场所变得拥挤不堪,给人们开车、停车增加了难度;另一方面,随着汽车的普及,学习驾驶技术的人员也大幅增加,这就使得道路上增加了许多新手司机,因车辆碰撞而产生的纠纷变得越来越多。而在这其中,倒车问题就是一个典型的问题。

倒车在汽车驾驶过程中有着重要的作用,我们知道,在停车的时候需要用到倒车,在移位时也需要用到倒车,让行时或者掉头而宽度不足时,都需要用到倒车,如果倒车技术不过关,会给人们的开车生活带来困扰。一方面,倒车需要回转面积,如果技术不过关,需要的回转面积就会增大,这样一是会增加停车时所需面积,减少实际停车数量,同时会增加停车时间,造成停车场拥堵;另一方面,新司机通常不善于掌握停车时的方面角度,也不善于判断障碍物离车身距离,因此会在停车倒库时带来麻烦,不仅浪费时间,也容易发生车辆碰撞事件[2]。为了解决倒车难的问题,人们经过不懈的努力,研制出一些倒车辅助装置在人们倒车的时候提供帮助,例如:雷达警报系统、后视辅助倒车系统等。这些辅助装置虽然能够在一定程度上帮助驾驶人员完成倒车过程,但是也存在一些缺点,因此,能够研制出一个好的倒车防撞系统就显得十分重要了。

1.1.2 研究意义
  •         理论意义:倒车测距仪涉及到的是单片机控制领域和超声波测距相关领域。在完成该课题时,必须在单片机控制方面做大量的研究,包括了单片机的内部软件设计和单片机的外围电路设计。
  •         实际意义:能使倒车测距仪广泛投入生活使用。通过汽车倒车仪的距离提示和蜂鸣器产生不同频率的声音警示来提醒驾驶员进行安全倒车,为驾驶员提供倒车的安全性和降低驾驶员倒车的难度,从而减少汽车倒车事故的发生,保证广大驾驶员的生命财产安全和减少汽车安全事故带来的损失。
1.2 倒车防撞系统的发展

倒车测距仪也就是倒车雷达,在国际和国内上都有很多,超声波倒车测距系统是其中的一种比较简单实惠的倒车测距仪。 在短短的几年时间里,就从第一代发展到了第五代,并在不断的继续发展之中。但无论是如何发展,其结构通常包括几部分,分别是控制器、超声波传感器(俗称探头)和显示器(或蜂鸣器)等[3]。

第一代倒车雷达:倒车时通过喇叭提醒。在 90 年代的时候,人们经常能够听到“倒车请注意”这种声音,这就是第一代倒车辅助系统。在司机开始倒车的时候,蜂鸣器发出这种提醒语句,引起路人的注意。这代产品现在的使用范围很小,只有少部分的汽车还在使用。这代产品并不能够算作是真正的倒车辅助系统,它只是引起了周围人的注意,并没有真正帮助到驾驶员操作汽车。这种产品价格低廉、技术落后,基本属于淘汰了的产品。

第二代倒车雷达:蜂鸣器声音提示。从倒车辅助系统的意义上来讲,这才是真正的倒车辅助系统的开始。在倒车时,汽车在遇到障碍物时,蜂鸣器会发出声音,这种声音并不是一成不变的,越是急促的蜂鸣器声音代表障碍物与汽车之间的距离越短。这代倒车辅助系统虽然能够让驾驶员知道有障碍物的存在,但由于没有语音或者是数字的显示,驾驶员并不能知道障碍物与汽车之间的准确距离,在倒车时对驾驶员帮助的实际意义不大。

第三代倒车雷达:距离显示在数码波段上。这代产品比起第二代产品的主要优点就是将具体的距离表示了出来。如果是物体,在 1.8 米开始显示;如果是人,在 0.9 米左右的距离开始显示。这一代产品主要有两种显示方式,一种是数码显示,这种显示值显示距离,另一种是波段显示,通过三种不同颜色表示不同距离,绿色代表安全距离,黄色代表警告距离,而红色则代表危险距离,此时应该停止倒车[4]。

第四代倒车雷达:液晶荧屏动态显示。这一代产品在屏幕显示时出现了动态显示系统,与之前的产品相比较有了一个质的飞跃。只要汽车挂在倒档上时,液晶屏幕上就会显示出汽车的图案,还会将周围的障碍物情况也形象的显示出来。这代产品显示的图案清晰漂亮,产品外观也很美观,安装时也很方便。这代产品的优点就是安装方便、精度较高,但是这代产品的抗干扰能力不强,有时会发生误报的情况。

第五代倒车雷达:智能轨迹倒车系统。这代产品能够弥补第四代产品的诸如抗干扰能力不强等缺陷和不足,在外观上也做到了更加的小巧精致,不仅帮助驾驶员更加方便的操作汽车,也对汽车起到了装饰的作用。


1.3  研究目的及可行性分析
1.3.1研究目的

本次设计的研究内容是根据超声波测距原理,设计出合适的电路,并由单片机协调控制整个系统的模块,来完成超声波脉冲测距的倒车雷达。在汽车以较低的速度进行倒车时,它可以识别出汽车后面的障碍物,测量出车尾与障碍物之间的距离进行实时显示,发出声音报警来提醒驾驶员倒车。本设计有望成为汽车驾驶员,尤其是公共汽车以及货车驾驶员的好帮手,可以有效的减少甚至避免那些视野不良的公共汽车、集装箱车、食品车、冷藏车等大型汽车的倒车交通事故,尤其适用于夜间辅助倒车、倒车入库和进入停车场停车到位。本设计对提高汽车行驶安全性具有较大的意义。

1.3.2可行性分析

倒车雷达一般都是近距离测量,而激光测距和红外测距主要用于远程,比如测月球到地球距离,或者远距离无障碍测距,且成本要比用超声波大,因为光速为

3×108m/s,而市场上的一般单片机的最高频率在十几至几十兆,假如测量的距离在十米左右,即使单片机别的都不做只用来计数,出射光大约在 0.033µs后返回,要求单片机 CLK 为 1/0.033MHz,也就是说时钟频率为 30M 的单片机刚刚发出出射激光的命令,反射光就已经在它的下个 CLK 脉冲来到了,更别提计数了,即使用频率很高的单片机或者其他器件如 FPGA 等都并不能满足实际所需要的精度。通常精度与收发间隔中得到的计数脉冲个数成正比,超声波的速度要比光速小的多,传播时间就比较容易检测,能够满足倒车雷达在精度上的要求,并且超声波强度容易控制,方向性好,容易实现定向发射虽然超声波在空气中传播时,能量会缓慢衰减,有个最远测距范围,但仍能满足倒车雷达等近距离测量。总之,基于超声波测距汽车倒车雷达用起来会更加方便,更加令人放心。


1.4  研究内容与文章结构

1.4.1研究的主要内容

设计一个拥有微控制系统的倒车测距仪,该测距仪在汽车尾部一定距离范围内能够对汽车尾部距离尾部障碍物的距离做出显示和提醒。本设计是使用数码管显示距离,蜂鸣器和二极管进行报警。因此研究的基本内容如下:

  • 选择合适的测距方法使该设备实现其功能;
  • 合理的选择传感器使设备达到其功能;
  • 控制系统单片机的合理选择,使该设备既达到功能又最简化和成本最低化;
  • 硬件电路设计;
  • 单片机系统编程的设计以及优化;
  • 对设计进行调试以及实际检验。

1.4.2需要解决的问题

为了达到课题的要求,在设计中需要解决的问题如下所列:

  •            测距方式的选择。满足近距离的小误差测量,需要采用何种测距方式来实现呢,这是首要的测距方法选取。
  •            单片机的选择。由于当今的单片机种类很多,每种不同类型的单片机均有不同的侧重点,因此需要根据所需来选择一种比较有优势的控制中心,使该测距仪更加完善。
  •            报警系统的设计。由于报警系统需要实时性的要求,因此在控制系统设计时必须保证报警系统的快速响应。
  •            传感器的硬件。一切都应该建立在传感器采集到信号的基础上,所以必须保证传感器在快速反应同时能达到信号的准确性。这些要求能通过硬件电路的设计来实现,因此这部分硬件关系到整个系统的优劣。

1.4.3文章结构

该论文的组织构造主要由以下部分组成:

第一章绪论。在这一章中讲述了该课题研究的背景、发展、意义、目的和可行性分析以及研究内容。第二章为系统方案设计。这一章中对整个倒车系统进行设计,其中包括单片机、超声波测距模块、声音报告模块、蜂鸣器报警模块等。

第三章为整个系统的硬件设计。这一章中介绍了本设计的整体电路,所选用的最小系统、显示模块、超声波收发模块等各个模块的电路以及各个模块在使用中需要注意的事项和选择要求。

第四章为整个系统的软件设计。这一章包括了软件系统的整体设计和介绍,同时也包括了各个模块的软件设计。

第五章为整个系统的调试部分。在这一章中介绍了各个模块的调试,在调试的时候应该注意的问题,比如调试的顺序,如何对调试结果进行分析总结最后再做出修改。

1.5  本章小结

本章是在查阅了相关文献资料后,对该课题研究的背景和意义、倒车雷达的发展、此次设计的目的和可行性作了分析,并详细叙述了研究的内容。为本次设计作了充分的前期准备工作,同时为设计的顺利进行打下了基础。

2  系统方案设计

本设计是由控制系统(STC89C52 单片机)作为数据的处理中心和整个系统的控制中心,再由显示报警系统(数码管以及扬声器和蜂鸣器报警模块)、测距系统(超声波收发模块)等来组成整个系统,最后达到设计的目的。单片机是整个系统的核心部件,协调各部分的工作。在这一章中将对整体系统的结构进行介绍,并且对各个部分进行详细的介绍。

2.1  系统整体方案

倒车检测及报警系统是由超声波发射端发射信号、超声波接收端接收信号,再通过端口送到控制中心及单片机内部进行数据的处理判断以及最后进行显示报警等。具体是由单片机控制超声波收发模块的 Trig 口产生时间大于 10us 的高频 TTL 信号来驱动超声波模块内部连续发出 8 个 40kHz 的周期脉冲,超声波收发模块的 Echo 脚检测回波信号的脉冲宽度。Echo 脚与单片机的 P11 口相连。当出现回波信号时,计数器便开始计数,在检测到回波脉冲结束的瞬间,计数器停止计数,得到从发射端到接收端的时间 t 后,利用测距公式 s=(t*340/2)(单位:米)可计算出距离量,同时由显示器显示。整个系统的方案框图如图 2.1 所示。

1_1.002.jpg

图 1 系统总体结构框图

从图 1 结构框图可以看出来整个系统的模块比较少,因此在使用起来比较方便、容易操作,比较有使用价值。



2.2 控制系统介绍

在这一节中将对单片机的发展历史和功能进行总体介绍,并对本设计使用的

STC89C52 单片的内部结构和功能进行了详细的介绍。

2.2.1 单片机概要

单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器、只读存储器、随机存储器、多种端口和中断系统、定时/计数器等功能一起集成到一块硅片上,从而构成一个小而完善的微型计算机系统,在工业控制领域应用广泛。

2.2.2 单片机发展历史

从 1971 年单片机的问世,发展至今经历了 SCM、MCU、SOC 三大阶段,在早期的单片机及 SCM 都是 4 位或者 8 位的。8051 是其中最成功的单片机之一。但随着工业的扩展,16 位单片机也开始出现,但早期因为价格昂贵使用较少。到了 90 年代的时候电子产品飞速发展,单片机技术迅速发展,32位的出现很快代替了 16 位。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的 Windows 和 Linux 操作系统。

2.2.3 STC89C52

STC89C52[5]是美国 ATMEL 公司生产的低功耗、高性能 CMOS8 位单片机,片内含 8k bytes 的可系统编程的 Flash 只读程序存储器。器件采用 ATMEL公司的高密度、非易失性存储技术生产,兼容标准 8051 指令系统及引脚。它集 Flash 程序存储器既可在线编程(ISP)也可用传统方法进行编程及通用 8位微处理器于单片芯片中, ATMEL 公司的功能强大,低价位 STC89C52 单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。STC89C52 单片机引脚定义图如下图 2所示。

主要管脚有:

XTAL1(19 脚)和 XTAL2(18 脚)为振荡器输入输出端口,外接 12MHz 晶振。

RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。

VCC(40 脚)和 VSS(20 脚)为供电端口,分别接+5V 电源的正负端。

P0~P3 为可编程通用 I/O 脚,其功能用途由软件定义。

1_1.003.jpg

图 2 STC89C52 单片机引脚图主要性能参数:

除此以外 STC89C52 还提供一个 5 向量两级中断结构,片内振荡器及时钟电路。同时,STC89C52 可降至 0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止 CPU 的工作,但允许 RAM、定时/计数器、串行通信口及中断系统继续工作。掉电方式保存 RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

2.3  测距系统介绍

目前汽车倒车雷达预警系统测距技术主要有激光、毫米波雷达、摄像系统、红外线、超声波等,不同的目标探测方式其工作过程和原理有不同之处,但它们的主要目的都是通过前方返回的探测信息判断前方车辆和本车间的相对距离,并根据两车间的危险性程度做出相应的预防措施。下面对五种不同的测距技术方案进行介绍和比较。

2.3.1不同方案介绍

激光测距

激光测距装置[6]是一种光子雷达系统。目前在汽车上应用较广的激光测距系统可分为非成象式激光雷达和成象式激光雷达。

非成象式激光雷达根据激光束传播时间确定距离。它的工作原理是:从高功率窄脉冲激光器发出的激光脉冲经发射物镜聚焦成一定形状的光束后,用扫描镜左右扫描,向空间发射,照射在前方车辆或其他目标上,其反射光经扫描镜、接收物镜及回输光纤,被导入到信号处理装置内光电二极管,利用计数器计数激光二极管启动脉冲与光电二极管的接收脉冲间的时间差,即可求得目标距离;成象式激光雷达又可分为扫描成象激光雷达和非扫描成象激光雷达。扫描成象激光雷达把激光雷达同二维光学扫描镜结合起来,利用扫描器控制激光的射出方向,通过对整个视场进行逐点扫描测量,即可获得视场内目标的三维信息。

毫米波雷达测距:

毫米波[7]是指波长介于 1~10mm 之间的电磁波,雷达是利用目标对电磁波的反射来发现目标并测定其位置的。

摄像系统测距:

CCD 摄像机是一种用来模拟人眼的光电探测器。利用面阵 CCD 可获得被测视野的二维图像,但无法确定与被测物体之间的距离,只使用一个 CCD 摄像机的系统称为单目摄像系统;为获得目标三维信息,模拟人的双目视觉原理,利用间隔固定的两台摄像机同时对同一景物成象,通过对这两幅图像进行计算机分析处理,即可确定视野中每个物体的三维坐标,这一系统称为双目摄像系统[8]。

红外线测距

红外线测距[9]和激光、超声波测距在原理上基本相同,均是根据发射波和反射波的时间间隔来判断目标距离的,车载仪器通过发射并接收前方物体反射回的红外线,依据信号的强弱及波长的不同,同时分析时间差,可分析出前方物体的性质及与汽车的距离。

超声波测距

超声波[10]简单的说就是音频超过了人类耳朵所能够听到的范围。在弹性媒质中,如果波源所激起的纵波的频率在 20Hz 到 20kHz 之间,就能引起人的听觉。在这一频率范围内的振动称为声振动,声振动所激起的纵波称为声波;频率高于 20kHz 的机械波称为超声波;频率低于 20Hz 的机械波称为次声波。与光波不同,超声波是一种弹性机械波,它可以在气体、液体和固体中传播。电磁波的传播速度为 3x108m/s,超声波在空气中的传播速度约为340m/s(常温下),其速度与电磁波相差 5 个等级,其速度相对电磁波是非常慢的。

2.3.2优缺点对比

超声波技术主要用于短距离探测,成本低,制作安装简便,适应恶劣环境;红外线技术一般用于夜间环境,对环境适应性差:微波雷达测距和激光测距相对于超声波测距来讲精度更高,定位更准确"摄像系统技术价格较贵;毫米波雷达技术和激光技术的成本很高,所以运用其原理进行测量的设备价格也是相当高的,因而现在只是在比较高级的轿车中才有所应用。综合以上考虑和实际应用条件,本系统的测距模块采用的是第五种方案——超声波测距,并在超声波测距技术方案的设计上进行了简化和改进。

2.4 超声波测距2.4.1 超声波测距原理

超声波测距的方法有多种,如相位检测法[11]、声波幅值检测法和渡越时间检测法

等。相位检测法通过测量接收波和发射波的相位差来判断距离的,其测量精度高,但检测范围有限,只适合短距离测量;声波幅值检测法是根据反射波的幅值大小 来判断距离的,优点是电路简单且成本低,缺点是测量精度不高,抗干扰能力差;渡越时间检测法是通过接收从超声波发射到接收到超声波之间的时间差,来判断距离的,此检测法介于两者之间,电路也比较简单,且有较远的测量距离和较高的测量精度,所以得到了较为广泛的应用。考虑到倒车雷达对测量距离和测量精度的要求,本论文采用渡越时间检测法来检测车尾要和障碍物之间的距离,其测距原理如图 3 所示。

测距时由安装在相同位置的超声波发射器和超声波接收器完成超声波的发射和接收,由定时器计时。定时器记录下超声波往返传播经历的时间t(s)。常温下,超声波在传播速度约为 340m/s,所以发射点距障碍物之间的距离为:

L =3 4 0t/2

公式(1)

L 为车尾与障碍物的距离,单位为米;t 为计时器记录的时间,单位为秒。


1_1.004.jpg

图3 超声波测距原理图

单片机内部定时器的计时,实际上是机器周期 T 的计数,设时钟频率 Fosc 取

12MHz,而定时器 TIMB 的计数频率为系统时钟频率的 1 个机器周期,设计数值为 N,则

1_1.005.jpg 1_1.006.jpg

1_1.007.jpg

或                            1_1.008.jpg                   

公式(2)

2.4.2超声波模块——HY-SRF05 超声波模块

HY-SRF05 超声波测距模块可提供 2cm 到 450cm 的非接触式距离感测功能,测距精度可高达 2mm。模块包括:超声波发射器、接收器和控制电路。

基本工作原理:

  •         采用 IO TRIG 触发测距,给一个至少 10us 的高电平信号;
  •         模块自动发送 8 40kHz 的方波,自动检测是否有信号返回;
  •         有信号返回,通过 IO ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测量距离=(高电平时间*声速(340m/s/2

实物图

实物图如图 4 所示,VCC 接 5V 电源,GND 为地线,TRIG 触发控制信号输入,

ECHO 回响信号输出。

1_1.009.jpg

图 4 实物图

超声波时序图

超声波时序图反映了整个超声波测距模块的测距是如何进行的,当然也显示了测距的原理。超声波时序图如下图 5 所示。

1_1.010.jpg

1_1.012.jpg

图 5 超声波时序图

对图 2.5 的解说:当 Trig 脚发出持续时间为 10us 以上的 TTL 触发信号,模块内部便连续发出 8 个 40kHz 的周期电平并检测回波,一旦检测到回波信号就通过 Echo 输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。


2.5 显示报警系统

在这一节中,将介绍该倒车测距仪的提示方式与报警模式。用数码管显示距离障碍物的具体距离的同时加入语言报告来警示驾驶人员,同时由蜂鸣器响叫频率的不同以此来提醒驾驶人员使其在心里有一定的判断。

1_1.013.jpg

图6 显示模块图

语音播报芯片相关说明:

   1_1.014.jpg 1_1.015.jpg

图7芯片引脚图

1_1.016.jpg

图8   语音播报模块原理图

2.6  本章小结

在这一章中对整个系统的设计方案和所用器件类型分别进行了介绍。其中超声波测距模块是关键模块之一,它关系到测距方法的确定以及最终测距误差等的产生原因提供了分析切入点。最终确定使用超声波测距模块进行距离测量,使用数码管作为显示模块,使用蜂鸣器进行提示报警。

3  系统硬件设计

倒车测距仪由超声波传感器(俗称探头)、控制器、显示器等组成,采用超声波测距方法,在控制器的控制下由传感器发射超声波信号,当遇到障碍时,产生回波信号,传感器接收到回波信号后,经控制器进行数据处理,判断出障碍物的位置,由显

示器显示距离并根据距离发出警报信号,从而达到安全倒车的目的。

3.1   系统总电路图

根据系统的方案设计,设计出系统的电路框图如 3.1 所示。以及各个模块器件的接口性质,运用 protel 软件[14]画出系统电路图如图 3.2 所示。

               1_1.017.jpg             

3.1.1 系统工作原理

当电池安装好且位于 PCB 板子上的电源开关已经被按下,系统供电。整个系统的运作为:超声波在标准空气中的传播速度为 331.45 米/秒,约为340 米/秒。单片机通过 P10 口控制超声波收发模块的 Trig 脚发出超声波,模块内部发射脉冲信号并检测回波,当接收端一检测到回波信号计数器就开始计数,回波信号结束则计数完成。数据被送入 STC89C52 中进行处理计算,并将计算结果显示到数码管上,同时控制蜂鸣器的鸣叫。

3.1.2 最小系统电路

单片机最小系统包括了单片机、晶振电路、复位电路以及电源电路。下面将会介绍部分电路的设计。

晶振电路:

STC89C52 内部有一个用于构成振荡器的高增益反相放大器,引脚 X1 和 X2 分别是此放大器的输入端和输出端。时钟可以由内部方式产生或外部方式产生。内部方式的时钟电路所示,在 X1 和 X2 引脚上外接定时元件,内部振荡器就产生自激振荡。

定时元件通常采用石英晶体和电容组成的并联谐振回路。电容值 30pF,电容值的大

小可对频率起微调的作用,晶体振荡频率为 11.0592MHz。晶振电路如图 10所示。

1_1.018.jpg


                               图 10 晶振电路图

复位电路

复位是单片机的初始化操作。其主要功能是把 PC 初始化为 0000H,使单片机从 0000H 单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。RESET 引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。整个复位电路包括芯片内、外两部分。外部电路产生的复位信号(RESET)送至施密特触发器,再由片内复位电路在每个机器周期的 S5P2 时刻对施密特触发器的输出进行采样,然后才得到内部复位操作所需要的信号。复位电路的电路图也如上图 10所示。


3.2 超声波测距模块设计

由 STC89C52 的 P10、P11、P12 接口出来,分别接超声波收发模块 HY-SRF05 的 Trig、Echo、Out 脚,以此来达到脉冲触发以及数据传输处理的目的。图 11 是超声波模块与单片机连接的电路图。

1_1.019.jpg

图 11 超声波收发模块电路图

3.3 蜂鸣器的硬件设计

在这一节中,介绍的是整个系统中的另外一个具有提示功能的器件——有源蜂鸣器。蜂鸣器的具体电路图如 3.7 所示。由于此次设计使用的是有源蜂鸣器,我们可以知道蜂鸣器需要一个驱动电路,这里用三极管进行驱动。同时在电阻左侧接一个上拉电阻到单片机电源端。

1_1.020.jpg

图 12 蜂鸣器电路图  

3.4  本章小结

在这一章中我们介绍了 STC89C52 单片机最小系统及其周围电路的电路设计,其中包括了复位电路、晶振电路、电源电路、显示器电路和蜂鸣器电路。通过本章节的详细介绍不仅对硬件设计有了直观的了解,还对设计中需要注意的地方都一一考虑到了,做到了硬件功能的实现。


4  系统软件设计

本次设计的软件设计部分采用 C51 语言进行编程,运用模块化的程序设计思想,对具有不同功能的模块程序进行分别编程,其他模块程序包括:数据处理的程序、显示程序和蜂鸣器报警程序等,以便移植或调用。这样使软件层次结构清晰,有利于软件的调试和修改,在完全正确之后再进行组装、调试和烧录。

4.1  主程序设计
4.1.1 系统软件实现原理

整个设计的关键即是对距离的测量,再通过单片机处理测量得到的数据,就能精确的实现测距。在测距中,各种信号对声速的影响都将干扰到测距的准确性,其中超声波的余波信号对整个设计中测距的干扰的影响比较大。超声波接收回路中的超声波信号一共有两种:第一种波信号为余波信号,就是当发射探头发射出信号之后,超声波接收探头马上就接收到的超声波信号,实际就是超声波的发射信号;另一种波信号就是有效信号,即经过障碍物表面反射回来的超声波回波信号,也是所需要测量的距离数值。

在进行超声波测距时,由于使用的是超声波测距模块 HY-SRF05,按照本系统的

测距需要,需要得到超声波的传输时间 T,进行运算以得到车子与障碍物的距离 S。

如何得到超声波的传输时间 T 呢?

采用单片机的 P10 口与 Trig 连接,控制发射端产生 10us 以上的 TTL 触发电平;模块内部自动产生 8 个 40kHz 的脉冲串并检测回波; P11 口与Echo 口连接,当接收端检测到回波单片机内部的计数器 T0 就开始计数,回波的宽度就决定了计数值大小,由此便得出超声波的的传输时间 T。

4.1.2系统程序构建

系统设计框图

超声波测距系统软件部分采用模块化设计思想,将系统分为主程序、初始化处理模块、中断检测模块、延时处理模块、数据处理模块和显示模块,其软件程序系统结构图如下图13 所示。

1_1.021.jpg

图 13系统软件设计框图

主程序流程图:

整个系统的组成在进入主函数后将进行初始化,打开显示刷新中断利用中断进行刷新。再进入测距函数后,每一次测距都是单片机进行扫描实现,同时定时器也在这里开启。在处理接收到的数据信号后就关闭发射中断处理完后再开启中断,最后记录下来计数器的时间再由处理数据程序进行计算。最后由操作程序进行相应的操作。根据该软件系统结构框图,得到系统的主程序实现流程图。整个程序的编程环境是在 keil 环境下用 c 语言进行编程。而用 c语言作为编程的主要原因是其编程比较简单,对编程者要求不是很高;c 语言编出来的程序可读性很高;编出的程序可以广泛的进行移植和借用等。图 14为系统的主程序流程图。

1_1.022.jpg

图14主程序流程图

系统主程序

系统的主程序首先是显示屏初始化,设置定时器 T0 的工作模式为 MODE1,并且 STC89C52 的定时器计数器为 16 位。延迟一段时间之后,开启中断,开启定时器,位总中断 EA 置到允许位。在超声波接收端一接收到回波信号时,计数器就开始计数,直到回波高电平结束。回波信号的宽度与计数值成正比。然后利用计数器得到的值计算超声波发射和接收之间所用的时间,并调用测距公式对距离进行计算。经过单片机的处理得到的距离 S,送至显示器,并将距离显示出来;同时判断 S 的大小,看蜂鸣器是否鸣叫。之后进行下一次的测距工作。

程序如下:

void main(void)

{

              TMOD=0x11;                               //设T0为方式1,GATE=1;

              TH0=0;

              TL0=0;         

              TH1=0xf8;                               //2MS定时

              TL1=0x30;

              ET0=1;                                                        //允许T0中断

              ET1=1;                                             //允许T1中断

              TR1=1;                                             //开启定时器

              EA=1;                                                                      //开启总中断            

              while(1)

              {

                            while(!RX);                            //当RX为零时等待

                            TR0=1;                                          //开启计数

                            while(RX);                            //当RX为1计数并等待

                            {

                            TR0=0;                                          //关闭计数

                            flag_bofang=1;

                            }

                            Conut();                                          //计算

                            if(Mode==0)

                            {

                            if(abs(S-current_S)>=2)

                            {

                            current_S=S;

                            bofang(Feng,disbuff);

                            }

                            }

              }

}

            

4.2   测距模块的设计

4.2.1 测距模块的设计思想

根据回波信号的脉冲宽度得知计时器的数据以及距离公式:距离=(340*时间/2)

(m),可以计算得到小车距离障碍物的距离。

4.2.2测距模块的程序

void Conut(void)

{

              time=TH0*256+TL0;                //读出T0的计时数值

              TH0=0;

              TL0=0;                                                          //清空计时器

              S=(time*1.7)/100;     //算出来是CM

              if(Mode==0)                                            //非设置状态时

              {

                            if((S>=700)||flag==1) //超出测量范围显示“-”

                            {            

                                          Feng=0;                                //蜂鸣器报警

                                          flag=0;

                                          disbuff[0]=10;                 //“-”

                                          disbuff[1]=10;                 //“-”

                                          disbuff[2]=10;                 //“-”

                            }

                            else

                            {

                                          //距离小于报警距

                                          if(S<=BJS)

                                          {

                                                        Feng=0;              //报警

                                          }

                                          else  //大于

                                          {

                                                        Feng=1;                            //关闭报警            

                                          }

                                          disbuff[0]=S%1000/100;                            //将距离数据拆成单个位赋值

                                          disbuff[1]=S%1000%100/10;

                                          disbuff[2]=S%1000%10 %10;

                            }

              }

              else

              {

                                          Feng=1;

                                          disbuff_BJ[0]=BJS%1000/100;

                                          disbuff_BJ[1]=BJS%1000%100/10;

                                          disbuff_BJ[2]=BJS%1000%10 %10;

              }

}



4.3  蜂鸣器报警程序
4.3.1报警模块思想

主程序得到的结果是通过显示屏显示,并且还要控制蜂鸣器通过不同频率的鸣叫来提醒,以及 LED 灯的闪烁。在该设计中,利用的是单片机 I/O 端口引脚来控制。并且通过计数的方式来控制两个引脚进行高低互换产生控制信号。蜂鸣器报警程序的程序流程图如图15 所示。

1_1.023.jpg

图 15蜂鸣器程序流程图

4.3.2 蜂鸣器程序

if(S<50)

{buzz=1;

DelayMs(S*50);   buzz=0;

DelayMs(S*5);

}  if(S>50) buzz=1;}

判断蜂鸣器报警距离是否小于 50cm,若超过 50cm 则蜂鸣器不报警,若小于 50cm 则报警。

4.4 本章小结

本章在上一章硬件电路设计的基础上进行了系统软件的设计。首先进行的是整个系统的设计,在设计之前需要明确要达到什么样的功能怎样实现这些功能,才能分模块分别进行设计。因此本章里面包括了系统的总体逻辑关系及软件控制流程图;其次,就是需要对各子程序进行设计,设计依据便是硬件电路。因此整个系统的软件程序划分为中断处理程序、测距程序、蜂鸣器程序、等。

5  系统调试及误差分析

在调试的过程中分硬件调试和软件调试。其中第一阶段为硬件的调试,一般会遇到的情形有:逻辑错误、原器件损坏、可靠性差、电源故障等。本设计中使用的是万用表进行硬件检测;第二阶段为软件的调试,最初的软件调试为错误检测,比如编程的错误,第二步为进行逻辑错误检查,最后进行整个程序各个部分运行时间的调试。第三节为误差分析,针对本次设计中出现的误差分析可能产生的原因,提出改进的方法。

5.1   硬件的调试

硬件调试是一项细心的工作,一定要有耐心。硬件调试工具需要示波器、万用表等,同时需要主芯片调试开发软件及相应的仿真器。硬件调试首先要熟悉原理图原理

和PCB布局,然后根据功能模块进行相关调试。

5.1.1硬件调试流程

其中硬件调试部分为:

  •            逻辑错误:它是由设计错误或加工过程中的工艺性错误所造成的。这类错误包括错线、开路、短路等。
  •            元器件失效:一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、集成电路安装方向错误等。
  •            可靠性差:因其可靠性差的原因很多,如金属化孔、接插件接触不良会造成系统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。
  •            电源故障:若样机由电源故障,则加电后很容易造成器件损坏。电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。
  •            调试方法:包括多级调试和联机调试。在调试过程中要针对可能出现的故障认真分析,直至检查出原因并排除。

5.2   软件的调试5.2.1 软件调试的方法

将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试。软件调试一般分为以下四个阶段:编写程序并查错;在C语言的编译系统中编译源程序;对程序进行编译连接,并及时发现程序中存在的错误;改正错误。

在软件中调试程序时出现的问题有:

  • 在程序中有的函数名未定义;
  • 在抄录程序时,少录入一些字符,如:“{”“-”等符号而出现错误;
  • 有一些函数名录入时少写一个字母或顺序颠倒;
  • 没有注意函数名的调用及定义;
  • 芯片引脚定义出错而导致没有实验现象。

在软件调试过程中,对出现的错误进行了认真的分析和修改,多次调试成功后,能够很好的达到预定的设计效果。  



5.2.2  软件调试后的结果

编好的程序进行细心的检查后,再通过 keil 软件把程序烧进单片机,进行实物演示。把电池安装好,打开电源开关,同时按下板子上的电源按钮,显示屏幕点亮,在系统前方移动障碍物,可以明显听见蜂鸣器的鸣叫的频率发生了变化。但需要注意的是蜂鸣器由于程序设定的限制,只能在 50cm 内的距离进行响叫。屏幕实时显示了距离障碍物的距离。可以看到:结果达到了预期,较为满意。如图 5.2 所示。

5.3  误差分析

5.3.1性能分析

虽然结果和预想的有很大的差距,但总体来说已经基本上达到了要求,理想上超声波测距能达到5米左右,而我们所能实现的最大距离只有3米,造成这种原因我想有:我采用的是11.0592MHZ的晶振,理论上是按照12MHZ的晶振计算的,所以对系统造成了一定的误差;没有考虑环境因素对本次设计的影响,造成测量结果有不小的误差。

5.3.2 超声波测距注意问题
  • 超声波传播受多次路径影响。
  • 超声波发射功率。
  • 余波干扰。
  • 注意干扰。
  • 电源稳定性较差。
  • 测量时出现误差。
  • 实际测距范围与被测物表面材料有关。

5.3.3  超声波测距改善方法
  •         避免路径影响。第一是超声波发射间隔时间增长;第二就是超声波发射模块做小,同时探头 T R 平行于电路板,减小其来回反射路径。
  •         提高发射功率。可以增加测量距离,可以采用变压器实现升压。
  •         尽量避免余波的干扰。增加 T/R 之间的安装距离;软件解决。在发射完后,延长一段时间再开启检测超声波发射的信号。这就是超声波存在最小测量距离的主要原因。
  •         避免产生干扰。避免手接触超声波电路板。
  •         提高电源的稳定性。
  •         测量距离时,应尽量保证,传感器轴线与被测物表面垂直。
  •         一般不要测量表面为毛料的物体表面。


5.4  本章小结

在这一章中,对整个设计的硬件和软件出现的错误和问题进行了分析和解决,并对设计出的实物出现误差的可能原因进行了分析总结,且提出了可能的解决方法。先是对硬件方面的检验,随后是对软件程序的编写和调试。其中显示模块的调试程序、测距的调试程序、蜂鸣器的调试程序以及对整个程序进行调试。最后完成对整个倒车系统的软件部分进行调节,调试也是十分重要的一个环节,调试通过才能实现最后的功能。

  

本设计主要介绍了基于 STC89C52 单片机而设计出的一款倒车检测及报警系统。                    

整个设计中超声波测距是实现功能的关键,把来自超声波测距模块的信号传输到单片机端口并由单片机内部 CPU 执行相应的处理程序。设计中采用数码管模块进行显示和用蜂鸣器进行报警,其特点是根据距离障碍物的远近不同,蜂鸣器的变频鸣叫。整个设计的编程是用 keil 编程软件来完成的,程序语言采用的是 C 语言,程序内容包括主程序、中断程序控制触发高电平的产生、检测回波并计数、计算距离、蜂鸣器报警、数码管模块显示。本设计完成的汽车倒车检测及防撞系统操作方便,测距的范围可以在 2cm-700cm 之间,基本能够达到设计要求。

另一方面本设计虽然实现了功能,但是还存在一些缺点,如测量精度不高,测量过程会遭受多种因素的影响。因为实际使用的倒车测距仪工作环境多变,尤其是温度变化对测距的影响,如果将温度补偿加到设计中,系统将更加完善。本系统在程序上比较繁琐,测距移动的过程中可能反应时间不够快,因此需要优化其灵敏度。

  

通过本次毕业设计的完成,检验了自己大学所学的知识和自己的综合实践能力,同时也对自己也有不少提高。更重要的是将自己独立解决事情的能力提高了,为自己以后的工作积累下了又一笔不菲的宝贵财富。

在这次设计中,首先应该感谢的是我本次设计的导师李向明老师。感谢他给予我的大力帮助和对我毕业设计的精心指导。在整个设计阶段,从开始的题目分析到硬件的设计以及后面软件的设计,李老师都给予了我很大的帮助;在硬件的搭建和调试过程中李老师也帮我进行了问题的分析,并给我提了很多宝贵的意见和建议。在这里我十分感谢我的导师,感谢他对我们尽职尽责。

其次我要感谢实验室的老师们,感谢他们为我提供了一些硬件和实验器材的使用。衷心的谢谢你们!当然我更得感谢我父母对我的辛勤付出,是他们让我有这个机会进入武汉华夏理工学院这所学习氛围浓厚的理工科大学,使我能用四年的时间安心学习,学习知识,学习做人,学习如何学习。

最后要感谢的是我伟大的母校——武汉华夏理工学院,它为我提供了一个良好的学习环境和优良的教学资源。更要感谢这四年来所有传授我知识的老师们,感谢他们的无私奉献,将他们所知道的无私地教导了我们。同时也感谢我身边的所有朋友在生活和学习上给我的帮助。


原理图:





程序:
  1. #include //器件配置文件

  2. #include

  3. #include

  4. #include               

  5. //传感器接口

  6. sbit RX  = P2^3;

  7. sbit TX  = P2^2;

  8. //按键声明

  9. sbit S1  = P3^1;

  10. sbit S2  = P3^2;

  11. sbit S3  = P3^6;



  12. sbit DIAN=P0^5;

  13. //蜂鸣器

  14. sbit Feng= P2^0;



  15. //变量声明

  16. unsigned int  time=0;

  17. unsigned int  timer=0;

  18. unsigned char posit=0;

  19. unsigned long S=0;

  20. unsigned long BJS=50;//报警距离80CM



  21. unsigned long current_S=0;

  22. char num=0;

  23. //模式 0正常模式 1调整

  24. char Mode=0;

  25. bit  flag=0;



  26. unsigned char const discode[] ={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0x80};              //数码管显示码0123456789-和不显示



  27. unsigned char disbuff[4]                 ={0,0,0,0};                            //数组用于存放距离信息

  28. unsigned char disbuff_BJ[4]              ={0,0,0,0};//报警信息

  29. sbit W0=P2^4;

  30. sbit W1=P2^5;

  31. sbit W2=P2^6;

  32. sbit W3=P2^7;

  33. //延时100ms(不精确)

  34. void delay(void)

  35. {

  36.     unsigned char a,b,c;

  37.     for(c=10;c>0;c--)

  38.         for(b=38;b>0;b--)

  39.             for(a=130;a>0;a--);

  40. }



  41. //按键扫描

  42. void Key_()

  43. {

  44.               //+

  45.               if(S1==0)

  46.               {

  47.                             delay();                 //延时去抖

  48.                             delay();                 //延时去抖

  49.                             flag_bofang=0;

  50.                             while(S1==0)

  51.                             {

  52.                                           P1=P1|0x0f;

  53.                             }

  54.                                           BJS++;              //报警值加

  55.                             if(BJS>=151) //最大151

  56.                             {

  57.                                           BJS=0;

  58.                             }

  59.               }

  60.               //-

  61.               else if(S2==0)

  62.               {

  63.                             delay();

  64.                             delay();                 //延时去抖

  65.                             flag_bofang=0;

  66.                             while(S2==0)

  67.                             {

  68.                                           P1=P1|0x0f;

  69.                             }

  70.                                           BJS--;              //报警值减

  71.                             if(BJS<=1)              //最小1

  72.                             {

  73.                                           BJS=150;

  74.                             }

  75.               }

  76.               //功能

  77.               else if(S3==0)                            //设置键

  78.               {

  79.                             delay();

  80.                             delay();                 //延时去抖

  81.                             flag_bofang=0;

  82.                             while(S3==0)

  83.                             {

  84.                                           P1=P1|0x0f;

  85.                             }

  86.                                           Mode++;                            //模式加

  87.                                           num=0;

  88.                             if(Mode>=2)                            //加到2时清零

  89.                             {

  90.                                           Mode=0;

  91.                             }            

  92.               }

  93. }

  94. /**********************************************************************************************************/

  95. //扫描数码管

  96. void Display(void)                                                      

  97. {

  98.               //正常显示

  99.               if(Mode==0)

  100.               {

  101.                             num++;

  102.                             if(num==1)

  103.                             {

  104.                                           W3=1;

  105.                                           W0=1;

  106.                                           P0=~discode[disbuff[0]];

  107.                                           DIAN=0;

  108.                                           W1=0;            

  109.                             }

  110.                             else if(num==2)

  111.                             {

  112.                                           W1=1;

  113.                                           P0=~discode[disbuff[1]];

  114.                                           W2=0;

  115.                             }

  116.                             else if(num>=3)

  117.                             {

  118.                                           W2=1;

  119.                                           P0=~discode[disbuff[2]];

  120.                                           W3=0;

  121.                                           num=0;

  122.                             }

  123.               }

  124.               //报警显示

  125.               else

  126.               {

  127.                             num++;

  128.                             if(num==1)

  129.                             {

  130.                                           W3=1;

  131.                                           P0=~0xCE;                              //11001110

  132.                                           W0=0;

  133.                             }

  134.                             else if(num==2)

  135.                             {

  136.                                           W0=1;

  137.                                           P0=~discode[disbuff_BJ[0]];

  138.                                           DIAN=0;

  139.                                           W1=0;            

  140.                             }

  141.                             else if(num==3)

  142.                             {

  143.                                           W1=1;

  144.                                           P0=~discode[disbuff_BJ[1]];

  145.                                           W2=0;

  146.                             }

  147.                             else if(num>=4)

  148.                             {

  149.                                           W2=1;

  150.                                           P0=~discode[disbuff_BJ[2]];

  151.                                           W3=0;

  152.                                           num=0;

  153.                             }

  154.               }

  155. }

  156. /**********************************************************************************************************/

  157. //计算

  158. void Conut(void)

  159. {

  160.               time=TH0*256+TL0;                //读出T0的计时数值

  161.               TH0=0;

  162.               TL0=0;                                                          //清空计时器

  163.               S=(time*1.7)/100;     //算出来是CM



  164.               if(Mode==0)                                            //非设置状态时

  165.               {

  166.                             if((S>=700)||flag==1) //超出测量范围显示“-”

  167.                             {            

  168.                                           Feng=0;                                //蜂鸣器报警

  169.                                           flag=0;

  170.                                           disbuff[0]=10;                 //“-”

  171.                                           disbuff[1]=10;                 //“-”

  172.                                           disbuff[2]=10;                 //“-”

  173.                             }

  174.                             else

  175.                             {

  176.                                           //距离小于报警距

  177.                                           if(S<=BJS)

  178.                                           {

  179.                                                         Feng=0;              //报警

  180.                                           }

  181.                                           else  //大于

  182.                                           {

  183.                                                         Feng=1;                            //关闭报警            

  184.                                           }

  185.                                           disbuff[0]=S%1000/100;                            //将距离数据拆成单个位赋值

  186.                                           disbuff[1]=S%1000%100/10;

  187.                                           disbuff[2]=S%1000%10 %10;

  188.                             }

  189.               }

  190.               else

  191.               {

  192.                                           Feng=1;

  193.                                           disbuff_BJ[0]=BJS%1000/100;

  194.                                           disbuff_BJ[1]=BJS%1000%100/10;

  195.                                           disbuff_BJ[2]=BJS%1000%10 %10;

  196.               }

  197. }

  198. /**********************************************************************************************************/

  199. //定时器0

  200. void zd0() interrupt 1                             //T0中断用来计数器溢出,超过测距范围

  201. {

  202.               flag=1;                                                                                    //中断溢出标志

  203. }

  204. /**********************************************************************************************************/

  205. //定时器1

  206. void zd3() interrupt 3                             //T1中断用来扫描数码管和计800MS启动模块

  207. {

  208.               TH1=0xf8;

  209.               TL1=0x30;                                                        //定时2ms

  210.               Key_();                                                                      //扫描按键

  211.               Display();                                                        //扫描显示

  212.               timer++;                                                        //变量加

  213.               if(timer>=400)                                          //400次就是800ms

  214.               {

  215.                             timer=0;

  216.                             TX=1;                                                    //800MS  启动一次模块

  217.                             _nop_();


  218. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整论文下载(word格式,可编辑,带完整程序):
基于单片机的倒车检测及报警系统设计.docx (924.96 KB, 下载次数: 91)
回复

使用道具 举报

ID:199050 发表于 2017-5-10 12:52 | 显示全部楼层
谢谢

回复

使用道具 举报

ID:484435 发表于 2020-6-9 19:32 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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