找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17426|回复: 2
打印 上一主题 下一主题
收起左侧

基于51单片机的超声波测距汽车防撞系统设计论文

[复制链接]
跳转到指定楼层
楼主
ID:369377 发表于 2018-7-11 12:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学生姓名
[姓名]
学    号
[学号]
专业班级
[专业班级]
  分院(系)
[分院(系)]
指导教师(职称)
[指导教师(职称)]

基于51的超声波测距汽车防撞系统

【摘要】
基于51的超声波测距汽车防撞系统,介绍了超声波测距的基本原理和系统框图,给出了超声波发射和接收电路,通过盲区的消除,提高了测距的精确度。利用超声波传输中距离与时间的关系,采用51单片机进行控制及数据处理,设计出了能精确测量两点间距离的超声波液位检测系统。系统主要由超声波发射器电路、超声波接收器电路、单片机控制电路、按键电路及显示电路构成。利用所设计出的超声波测距汽车防撞系统,对行驶中的车距进行了测试,采集当时两车距离过近系统会发出声光警报提示司机作出相应反应动作。此系统具有易控制、工作可靠、测量精度高的优点,可实时车距检测。

目 录

1 绪 论

1.1研究的背景

1.2研究的主要内容

1.3应解决的关键问题

2 电路方案论证

2.1方案比较

2.1.1 激光测距

2.1.2 超声波测距

2.2电路总体方案

3单片机概述

3.1 STC89C51主要性能

3.2 STC89C51外部结构及特性

3.3 STC89C51内部组成

4 超声波测距模块

4.1 超声波传感器介绍

4.2 HC-SR04超声波测距模块的性能特点

4.3 HC-SR04的管脚排列和电气参数

4.3.1 管脚简介

4.3.2 HC-SR04的电气参数

4.4超声波时序图

5系统硬件电路设计

5.1单片机最小系统

5.1.1 STC89C51芯片            

5.1.2 复位电路

5.1.3 晶振电路

5.2 驱动显示电路及报警电路

5.2.1  LED数码管显示电路

5.2.2 蜂鸣器和LED报警

5.3 HC-RS04超声波测距原理

5.4 按键设置电路

6系统程序的设计

6.1主程序

6.2显示数据子程序

6.3报警子程序

6.4按键子程序

结 论

参考文献

附 录(A)

附 录(B)

致 谢



1 绪 论1.1研究的背景

汽车业与电子业是世界工业的两大金字塔,随着汽车工业与电子工业的不断发展,在现代汽车上,电子技术的应用越来越来广泛,汽车电子化的程度越来越高。汽车电子技术是汽车技术与电子技术想结合的产物。汽车上的电器与电子控制系统在汽车技术进入机电一体化阶段的今天,地位极为重要,正在汽车技术领域发展成为一门独立的分支学科,其性能的优劣直接影响到汽车的动力性、经济性、可靠性、安全性、排放干净、及舒适性等。电子控制技术在汽车上,首先应用于发动机燃油消耗控制与排放进化与排放控制,接着被应用于底盘部分的控制,以提高行驶的稳定性、安全性、与舒适性等。随着交通运输向高密度发展,电子控制技术又进一步应用于汽车的乘坐安全性和导航等方面。

电子技术在汽车安全控制系统的应用主要是为了增强汽车的安全、舒适和方便。应用的电子技术主要有:电子控制安全气囊,智能记录仪,雷达式距离报警器,中央控制门锁,自动空调,自动车窗、车门、座椅、刮水器,车灯控制,电源控制以及充电器等。近年来汽车的自动调速系统,主动式汽车防撞系统,汽车监测和自诊断系统以及汽车导航系统也得到了广泛的应用。

在过去20~30年中,人们主要把精力集中于汽车的被动安全性方面,例如,在汽车的前部或后部安装保险杠、在汽车外壳四周安装某种弹性材料、在车内相关部位安装各种形式的安全带及安全气囊等等,以减轻汽车碰撞带来的危害。安装防撞保险杠固然能在某种程度上减轻碰撞给本车造成损坏,却无法消除对被撞物体的伤害;此外,车上安装的安全气囊系统,在发生车祸时不一定能有效地保护车内乘务员的安全。所有这些被动安全措施都不能从根本上解决汽车在行驶中发生碰撞造成的问题。如果从预防撞车事故的发生的角度着眼,在提高汽车主动安全性方面下功夫,则可在汽车安全性领域有较大的突破。

汽车发生碰撞的主要原因是由于汽车距其前方物体(如汽车、行人或其他障碍物)的距离与汽车本身的车速不相称造成的,即距离近而相对速度又太高。为了防止汽车与前方物体发生碰撞,汽车的车速就要根据与前方物体的距离变化由执行机构进行控制,使汽车始终在安全车速下行驶。这样就会大大提高汽车行驶的安全性,减少车祸的发生。

发展汽车防撞技术,对提高汽车智能化水平有重要意义。据统计,危险境况时,如果能给驾驶员半秒钟的预处理时间,则可分别减少追尾事故的30%,路面相关事故的50%,迎面撞车事故的 60%; 1秒钟的预警时间可防止90%的追尾碰撞和60%的迎头碰撞。

汽车要避撞就必须凭借一定的装备测量前方障碍物的距离,并迅速反馈给汽车,以在危急的情况下,通过报警或自动进行某项预设定操作如紧急制动等,来避免由于驾驶员疲劳、疏忽、错误判断所造成的交通事故。目前,大家都将防撞技术的关键点着眼于车辆测距技术。

1.2研究的主要内容

课题《基于51的超声波测距汽车防撞系统》由51单片机最小系统、超声波测距模块、驱动显示电路、报警电路和按键电路等组成。利用超声波测距模块HC-SR04测量距离,并对数据进行分析处理,传给51单片机,再通过LED数码管显示出来,可以通过按键调整报警距离,同时电源部分采用5V稳压直流电源。

1.3应解决的关键问题

1、对主要硬件电路设计、制作实物时拟解决的关键问题是:声音的发射和接受时间的计算。

2、超声波测距采用软件编程实现。

3、超声波测距的死区解决。

4、按键对报警值的设置。


2 电路方案论证
2.1方案比较2.1.1 激光测距

激光测距一般采用两种方式来测量距离:脉冲法和相位法。脉冲法测距的过程:测距仪发射出的激光经被测量物体的反射后又被测距仪接收,测距仪同时记录激光往返的时间,光速和往返时间的乘积的一半,就是测距仪和被测量物体之间的距离。相位法测距的过程:用无线电波段的频率,对激光束进行幅度调制并测定调制光往返测线一次所产生的相位延迟,再根据调制光的波长,换算此相位延迟所代表的距离,即用间接方法测定出光经过往返测线所需的时间。

2.1.2 超声波测距

汽车防撞系统的基本超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射电到障碍物的实际距离,可见这与雷达测距原理相似。超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。

从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。

2.2电路总体方案

图2.1是电路总体框图,包括51单片机最小系统,HC-SR04超声波测距模块,LED数码管显示电路,蜂鸣器报警电路和按键电路。

图2.1 电路基本框图

                                            
3单片机概述3.1 STC89C51主要性能

STC89C51 是STC公司推出的一款超强抗干扰,加密性强,在线可编程,高速,低功耗CMOS 8位单片机。片内含 4k bytes 的可反复擦写Flash只读程序存储器和256 bytes 的随机数据存储器(RAM),器件采用STC公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容, 片内置通用8位中央处理器 (CPU)和Flash存储单元, 功能强大的STC89C51单片机适合于许多较为复杂控制应用场合。

3.2 STC89C51外部结构及特性

其外形封装有两种方式:双列直插式40脚封装(DIP)和方形44脚封装 (PLCC),直插式40 脚封装(DIP)和外部总线结构如图2和图3所示:

图3.1 STC89C51引脚排列                                                                      图3.2 外部总线

STC89C51的 4 个 8 位I/O口的功能说明如下:

(1)P0口:P0 口是一个 8 位漏极开路的双向 I/O 口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。 当访问外部程序和数据存储器时,P0口也被作为低 8 位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash 编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。

(2)P1口:P1口是一个具有内部上拉电阻的8位双向 I/O口,p1输出缓冲器能驱动4个TTL 逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0 和 P1.2分别作定时器/计数器 2 的外部计数输入(P1.0/T2)和定时器/计数器 2 的触发输入(P1.1/T2EX)。在 flash 编程和校验时,P1口接收低8位地址字节。

(3)P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动 4 个 TTL 逻辑电平。对 P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用 16 位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8 位地址(如 MOVX @RI)访问外部数据存储器时,P2 口输出 P2 锁存器的内容。在 flash 编程和校验时,P2 口也接收高 8 位地址字节和一些控制信号。

(4)P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,p2 输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在 flash 编程和校验时,P3 口也接收一些控制信号。P3 口亦作为AT89C52特殊功能(第二功能)使用,如下所示:

  P3.0  RXD(串行输入口)               

  P3.1  TXD(串行输出口)

  P3.2  INTO(外部中断0 输入口)         

  P3.3  INT1(外部中断 1 输入口)

  P3.4  TO(定时器 0 外部输入)            

  P3.5  TI(定时器 1 外部输入)

  P3.6  WR(外部数据存储器写选通信号)

  P3.7(外部数据存储器读选通信号)

3.3 STC89C51内部组成

STC89C51单片机在一块芯片中集成了 CPU、RAM、ROM、定时器/计数器、看门狗和多种功能的 I/O 口设备的等,相当于一台计算机所需要的基本功能部件。

STC89C51单片机内包含的具体部分如下:

一个8 位 CPU。

一个片内振荡器及时钟电路。

4KB Flash 程序存储器。

128 B RAM 数据存储器。

三个16 位定时器/计数器。

可寻址 64KB 的外部数据存储器和 64KB 的外部程序存储器空间的控制电路。 32 条可编程的 I/O线(4组8 位并行 I/O端口)。

一个可编程全双工串口通信。

8 个中断源、两个优先级嵌套中断结构。

STC89C52单片机的框图如图3.3所示,各功能部件由内部总线连接在一起。

图3.3 STC89C51单片机框图

                                                   
4 超声波测距模块4.1 超声波传感器介绍

超声波是一种频率比较高的声音,由于其指向性强、能量消耗缓慢、传播距离较远等优点,而经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。超声波测距主要应用于倒车雷达、建筑施工工地以及一些工业现场,例如液位、井深、管道长度等场合。超声波测距的利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在测控系统的研制上得到了广泛应用。

超声传感器是一种将其他形式的能转变为所需频率的超声能或是把超声能转变为同频率的其他形式的能的器件。目前常用的超声传感器有两大类,即电声型与流体动力型。电声型主要有:1 压电传感器;2 磁致伸缩传感器;3 静电传感器。流体动力型中包括有气体与液体两种类型的哨笛。由于工作频率与应用目的不同,超声传感器的结构形式是多种多样的,并且名称也有不同,例如在超声检测和诊断中习惯上都把超声传感器称作探头,而工业中采用的流体动力型传感器称为“哨”或“笛”。

压电传感器属于超声传感器中电声型的一种。探头由压电晶片、楔块、接头等组成,是超声检测中最常用的实现电能和声能相互转换的一种传感器件,是超声波检测装置的重要组成部分。压电材料分为晶体和压电陶瓷两类。属于晶体的如石英,铌酸锂等,属于压电陶瓷的有锆钛酸铅,钛酸钡等。其具有下列的特性:把这种材料置于电场之中,它就产生一定的应变;相反,对这种材料施以外力,则由于产生了应变就会在其内部产生一定方向的电场。所以,只要对这种材料加以交变电场,它就会产生交变的应变,从而产生超声振动。因此,用这种材料可以制成超声传感器。

传感器的主要组成部分是压电晶片。当压电晶片受发射电脉冲激励后产生振动,即可发射声脉冲,是逆压电效应。当超声波作用于晶片时,晶片受迫振动引起的形变可转换成相应的电信号,是正压电效应。前者用于超声波的发射,后者即为超声波的接收。超声波传感器一般采用双压电陶瓷晶片制成。这种超声传感器需要的压电材料较少,价格低廉,且非常适用于气体和液体介质中。在压电陶瓷上加有大小和方向不断变化的交流电压时,根据压电效应,就会使压电陶瓷晶片产生机械变形,这种机械变形的大小和方向在一定范围内是与外加电压的大小和方向成正比的。也就是说,在压电陶瓷晶片上加有频率为 f0交流电压,它就会产生同频率的机械振动,这种机械振动推动空气等媒介,便会发出超声波。如果在压电陶瓷晶片上有超声机械波作用,这将会使其产生机械变形,这种机械变形是与超声机械波一致的,机械变形使压电陶瓷晶片产生频率与超声机械波相同的电信号。

图4.1压电式超声波传感器结构图

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

压电陶瓷晶片有一个固定的谐振频率,即中心频率 f0。发射超声波时,加在其上面的交变电压的频率要与它的固有谐振频率一致。这样,超声传感器才有较高的灵敏度。当所用压电材料不变时,改变压电陶瓷晶片的几何尺寸,就可非常方便的改变其固有谐振频率。利用这一特性可制成各种频率的超声传感器。

超声波传感器的内部结构由压电陶瓷晶片、锥形辐射喇叭、底座、引线、金属壳及金属网构成,其中,压电陶瓷晶片是传感器的核心,锥形辐射喇叭使发射和接收超声波能量集中,并使传感器有一定的指向角,金属壳可防止外界力量对压电陶瓷晶片及锥形辐射喇叭的损坏。金属网也是起保护作用的,但不影响发射与接收超声波。

4.2 HC-SR04超声波测距模块的性能特点

HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm,模块包括超声波发射器、接收器与控制电路。其基本工作原理:

(1)采用IO口TRIG触发测距,给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回,通过IO口ECH0输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速/340M/S)/2;

(4)当TRIG从0->1时,主控制板启动,当超时10ms时ECH0仍然没有出现150us的0信号,表示没有障碍。

本模块性能稳定,测度距离精确,其主要特点:

(1)超微型,只相当于两个发射,接收头的面积已经没法再小了;

(2)无盲区(10mm内成三角形误差较大,简单可以当做0处理);

(3)反应速度快,10ms的测量周期,不容易丢失高速目标;

(4)发射头,接收头紧靠,和被测目标基本成直线关系;

(5)模块上有LED指示,方便观察和测试。

4.3 HC-SR04的管脚排列和电气参数4.3.1 管脚简介

              HC-SR04的外形及管脚排列如图4.2所示。

(1)VCC为5V电源;

(2)GND为地线;

(3)TRIG触发控制信号输入;

(4)ECH0回响信号输出。

图4.2外形及管脚排列图

4.3.2 HC-SR04的电气参数

    电气参数如表4.1所示:

表4.1 电气参数表

电气参数

HC-SR04超声波模块

工作电压

DC 5V

工作电流

15mA

工作频率

40Hz

最远射程

4m

最近射程

2cm

测量角度

15度

输入触发信号

10us的TTL脉冲

输出回响信号

输出TTL电平信号,与射程成比例

规格尺寸

45*20*15mm


4.4超声波时序图

图4.3超声波时序图

              此时序图表明只需提供一个10us一上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到右回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为60ms一上,以防止发射信号对回响信号的影响。

                                                      
5系统硬件电路设计5.1单片机最小系统5.1.1 STC89C51芯片

本次设计我们所采用的是STC89C51单片机,是一种带4k字节闪烁可编程可擦除只读存储器的低电压、高性能COMOS8的微处理器,该器件有40引脚,速度较快,价格便宜,烧录方便,通过串口即可下载,还可以实现在线编程,采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

5.1.2 复位电路

    为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延迟才撤销复位,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。当单片机的复位引脚出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。所以复位引脚的电容大一点没多大关系,顶多是复位时间长一点;但如果电容太小,高电平持续时间太短,则单片机无法正常复位,就不能工作,电容通常取10UF或22UF,铝电解电容即可。

单片机的复位电路在刚接通电时,刚开始电容是没有电的,电容内的电阻很低,通电后,5V的电源通过电阻给电解电容进行充电,电容两端的电会由0V慢慢的升到4V左右(此时间很短一般小于0.3秒),正因为这样,复位脚由低电位升到高电位,引起了内部电路的复位工作;当按下复位键时,电容两端放电,电容又回到0V了,于是又进行了一次复位工作。电路图如图5.1。

图5.1 复位电路

5.1.3 晶振电路

它是单片机系统正常工作的保证,如果振荡器不起振,系统将会不能工作。假如振荡器运行不规律,系统执行程序的时候就会出现时间上的误差,这在通信中会体现的很明显:电路将无法通信。它是由一个晶振和两个瓷片电容组成的,晶振和瓷片电容是没有正负的,两个瓷片电容相连的那端一定要接地,如图5.2所示。

图5.2 晶振电路

一般单片机的晶振工作于并联谐振状态,也可以理解为谐振电容的一部分。它是根据晶振厂家提供的晶振要求负载电容选值的,换句话说,晶振的频率就是在它提供的负载电容下测得的,能最大限度的保证频率值的误差,也能保证温漂等误差。

机器周期:通常从内存中读取一个指令字的最短时间来规定CPU周期,(也就是计算机通过内部或外部总线进行一次信息传输从而完成一个或几个微操作所需要的时间),它一般由12个时钟周期组成。而时钟周期=1秒/晶振频率,因此单片机的机器周期=12秒/晶振频率 ,补充其他几个周期:

指令周期(Instruction Cycle):取出并执行一条指令的时间。

总线周期(BUS Cycle):也就是一个访存储器或I/O端口操作所用的时间。

时钟周期(Clock Cycle):又称节拍周期,是处理操作的最基本单位。(晶振频率的倒数,也称T状态)

指令周期、总线周期和时钟周期之间的关系:一个指令周期由若干个总线周期组成,而一个总线周期时间又包含有若干个时钟周期。

一般处理器的一个机器周期由12个时钟周期所组成。所以单片机用12M晶振,运行速度为1M。

负载电容=[(Cd*Cg)/(Cd+Cg)]+Cic+△C[6 ],跟晶振特性、单片机内部时钟电路等效电容有关。

两个电容的取值都是相同的,或者说相差不大,如果相差太大,容易造成谐振的不平衡,容易造成停振或者干脆不起振。其起到一个并联协振的作用,这样可以让它的脉冲更平稳与协调。

5.2 驱动显示电路及报警电路

显示电路采用LED数码管显示,当超过已设定的距离时,蜂鸣器和LED可实现报警功能并可通过按键实现有限距离的调整。

5.2.1 LED数码管显示电路

本电路的显示模块主要由一个4位一体的7段LED数码管构成,用于显示测量到的电压值。它是一个共阳极的数码管,每一位数码管的a,b,c,d,e,f,g和dp端都各自连接在一起,用于接收单片机的P1口产生的显示段码。S1,S2,S3,S4引脚端为其位选端,用于接收单片机的P2口产生的位选码。本系统采用动态扫描方式。扫描方式是用其接口电路把所有数码管的8个比划段a~g和dp同名端连在一起,而每一个数码管的公共极COM各自独立地受I/O线控制。CUP从字段输出口送出字型码时,所有数码管接收到相同的字型码,但究竟是哪个数码管亮,则取决于COM端。COM端与单片机的I/O接口相连接,由单片机输出位位选码到I/O接口,控制何时哪一位数码管被点亮。在轮流点亮数码管的位扫描过程中,每位数码管的点亮时间极为短暂。但由于人的视觉暂留现象,给人的印象就是一组稳定显示的数码。动态方式的优点是十分明显的,即耗电省,在动态扫描过程中,任何时刻只有一个数码管是处于工作状态的。具体原理图如图5.3

图5.3 显示电路

5.2.2 蜂鸣器和LED报警

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,暑促1.5~2.5kHz的音频信号,阻抗匹配器推动压电蜂鸣片发声。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,是电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。本设计采用电磁式蜂鸣器,当距离超出预设值时,蜂鸣器就会发出报警生硬。

电磁式蜂鸣器的发声原理是电流通过电磁线圈,是电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路,即通过一个PNP型三极管8550来放大驱动蜂鸣器。原理图见图5.3。

而LED电路是由一个发光二极管和电阻组成,因为LED一般工作在5ma到20ma,所以选择1K电阻进行限流。如图5.4所示。

图5.4 蜂鸣器驱动电路

5.3 HC-RS04超声波测距原理

超声波测距是借助于超声脉冲回波渡越时间法来实现的,设超声波脉冲由传感器发出到接收所经历的时间为t,超声波在空气中的传播速度为c,则从传感器到目标物体的距离D可用下式求出:D=ct/2。其系统框图如图5.5所示。

图5.5 系统框图

基本原理:经发射器发射出长约6mm,频率为40khz的超声波信号。此信号被物体反射回来由接收头接收,接收头实质上是一种压电效应的换能器。它接收到信号后产生mV级的微弱电压信号。

5.4 按键设置电路

单片机键盘有独立键盘和矩阵式键盘两种:独立键盘每一个I/O口上只接一个按键,按键的另一端接电源或接地(一般接地),这种接法程序比较简单且系统更加稳定;而矩阵式键盘式接法程序比较复杂,但是占用的I/O少。根据本设计的需要这里选用了独立式键盘接法。独立式键盘的实现方法是利用单片机I/O口读取口的电平高低来判断是否有键按下。将常开按键的一端接地,另一端接一个I/O口,程序开始时将此I/O口置于高电平,平时无键按下时I/O口保护高电平。当有键按下时,此I/O口与地短路迫使I/O口为低电平。按键释放后,单片机内部的上拉电阻使I/O口仍然保持高电平。我们所要做的就是在程序中查寻此I/O口的电平状态就可以了解我们是否有按键动作了。在用单片机对键盘处理的时候涉及到了一个重要的过程,那就是键盘的去抖动。这里说的抖动是机械的抖动,是当键盘在未按到按下的临界区产生的电平不稳定正常现象,并不是我们在按键时通过注意可以避免的。这种抖动一般10~200毫秒之间,这种不稳定电平的抖动时间对于人来说太快了,而对于时钟是微秒的单片机而言则是慢长的。硬件去抖动就是用部分电路对抖动部分加之处理,软件去抖动不是去掉抖动,而是避抖动部分的时间,等键盘稳定了再对其处理。所以这里选择了软件去抖动,实现法是先查寻按键当有低电平出现时立即延时10~200毫秒以避开抖动(经典值为20毫秒),延时结束后再读一次I/O口的值,这一次的值如果为1表示低电平的时间不到10~200毫秒,视为干扰信号。当读出的值是0时则表示有按键按下,调用相应的处理程序。硬件电路如图5.6所示:

图5.6 按键电路图


6系统程序的设计

              系统程序主要包括主程序、显示数据子程序、报警子程序和按键子程序等。

6.1主程序

              主程序的主要功能是负责距离的显示、读出并处理HC-RS04的测量距离值,按键控制有效距离限制,当测量的值超过预设值时,蜂鸣器发声报警。

              主程序流程图如图6.1所示。

            

图6.1主流程图

6.2显示数据子程序

              显示数据子程序的主要功能就是把超声波模块测量后的结果经单片机处理完毕的距离显示在数码管上。

              显示数据子程序流程图如图6.2所示。

图6.2显示数据子流程图
6.3报警子程序
              报警子程序的主要功能是在距离值超过预警值时,能够使蜂鸣器发声从而达到报警的目的。
              报警子程序流程图如图6.3所示。

图6.3报警子流程图

6.4按键子程序

              按键子程序的主要功能是有效距离可调,功能键调整上限,再次功能键调整下限,再次按功能退出。

              按键子程序流程图如图6.4所示。

            


图6.4按键子流程


结 论

本论文中虽然对安全距离模型进行了改进,但仍需进一步改进和细化,采用一定的控制理论和算法,使模型更具有科学性、可靠性和可操作性。本系统现阶段只是就危险情况实现了向驾驶员报警,事实上由于驾驶员的反应性有差异及注意力不集中、疲劳驾驶等因素的存在,有时未必能及时采取减速、刹车等措施,因此系统下一步的目标是实现自动刹车的功能,使驾驶员的安全更有保障。

(1)本系统只是在理论上讨论了汽车防碰撞的问题,由于实验设备和时间问题还没有进行实验。

(2)本系统还应该进一步在复杂天气(雨、雪、大雾),潮湿、冰雪路面上进一步测试,验证系统的设计功能。

(3)在本系统基础上,进一步开发车辆自适应巡航控制系统,使车辆的舒适性和主动安全性得到提高.

参考文献

[1] 胡汉才.单片机原理及系统设计[M] .北京:清华大学出版社,2012.

[2] 王守中. 51单片机开发入门与典型实例[M].北京:人民邮电出版社,2007.

[3]  陈雪丽. 单片机原理及接口技术[M].北京:化学工业出版社, 2005.

[4]  薛均义,张彦斌.MCS-51系列单片微型计算机及其应用.西安:西安交通大学出版社,2008.

[5]  唐颖,程菊花,任条娟.单片机原理与应用及C51程序设计[M].北京:北京大学出版社,2011

[6]钟勇,范森海,王永辉.高速公路事故的诱因及预防对策[J].公路交通科技.2010(6).

[7]郑安国.我国高速公路交通事故的基本特点与预防对策[J].公路交通科技学报.2012(4).

[8]陈晓东.郑建祥汽车用微机可靠性试验研究[J].汽车与电器.2009(增刊).

[9]周立功.发展有限公司.P89V51RD2器件手册.2013.3.

.




附 录(A)
(单片机原理图)


致 谢
首先,我要感谢我的指导老师在毕业设计中对我给予的悉心指导和严格要求,同时也感谢本校的一些老师在毕业设计期间所给予我得帮助。在我毕业论文写作期间,各位老师给我提供了种种专业知识上的指导和日常生活上的关怀,没有您们这样的帮助和关怀,我不会这么顺利的完成毕业设计,借此机会,向您们表示由衷的感激。同时还要感谢系实验室在毕业设计期间提供给我们优越的实验条件。
接着,我要感谢和我一起做毕业设计的同学。在毕业设计的短短几个月里,你们给我提出很多宝贵的意见,给了我不少帮助还有工作上的支持,在此也真诚的谢谢你们。同时,我还要感谢我的寝室同学和身边的朋友,正是在这样一个团结友爱,相互促进的环境中,在和他们的相互帮助和启发中,才有我今天的小小收获。
最后我要深深地感谢我的家人,正是他们含辛茹苦地把我养育成人,在生活和学习上给予我无尽的爱、理解和支持,才使我时刻充满信心和勇气,克服成长路上的种种困难,顺利的完成大学学业。
还有许许多多给予我学业上鼓励和帮助的朋友,在此无法一一列举,在此也一并表示忠心地感谢!


单片机源程序如下:


  1. <font style="font-size: 12pt">#include <reg52.H>//器件配置文件
  2. #include <intrins.h>

  3. //按键声明
  4. sbit RX  = P3^2;
  5. sbit TX  = P3^3;
  6. sbit S1  = P1^4;
  7. sbit S2  = P1^5;
  8. sbit S3  = P1^6;
  9. //蜂鸣器
  10. sbit Feng= P2^0;

  11. //变量声明
  12. unsigned int  time=0;
  13. unsigned int  timer=0;
  14. unsigned char posit=0;
  15. unsigned long S=0;
  16. unsigned long BJS=50;//报警距离80CM
  17. //模式 0正常模式 1调整
  18. char Mode=0;
  19. bit  flag=0;

  20. unsigned char const discode[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff/*-*/};
  21. unsigned char const positon[4]={0xfd,0xfb,0xf7,0xfe};
  22. unsigned char disbuff_BJ[4]              ={0,0,0,0};//报警信息

  23. //延时100ms
  24. void delay(void)   //误差 0us
  25. {
  26.     unsigned char a,b,c;
  27.     for(c=10;c>0;c--)
  28.         for(b=38;b>0;b--)
  29.             for(a=130;a>0;a--);
  30. }

  31. //按键扫描
  32. void Key_()
  33. {
  34.               //+
  35.               if(S1==0)
  36.               {
  37.                             delay();
  38.                             while(S1==0)
  39.                             {
  40.                                           P1=P1|0x0f;
  41.                             }
  42.                                           BJS++;
  43.                             if(BJS==151)
  44.                             {
  45.                                           BJS=0;
  46.                             }
  47.               }
  48.               //-
  49.               else if(S2==0)
  50.               {
  51.                             while(S2==0)
  52.                             {
  53.                                           P1=P1|0x0f;
  54.                             }
  55.                                           BJS--;
  56.                             if(BJS==0)
  57.                             {
  58.                                           BJS=150;
  59.                             }
  60.               }
  61.               //功能
  62.               else if(S3==0)            
  63.               {
  64.                             delay();
  65.                             while(S3==0)
  66.                             {
  67.                                           P1=P1|0x0f;
  68.                             }
  69.                                           Mode++;
  70.                             if(Mode==2)
  71.                             {
  72.                                           Mode=0;
  73.                             }            
  74.               }
  75. }
  76. /**********************************************************************************************************/
  77. //扫描数码管
  78. void Display(void)                                                      
  79. {
  80.               //正常显示
  81.               if(Mode==0)
  82.               {
  83.                             if(posit==0)//数码管的米标志
  84.                             {
  85.                                           P0=(discode[disbuff[posit]])|0x80;
  86.                             }
  87.                             else
  88.                             {
  89.                                           P0=discode[disbuff[posit]];
  90.                             }
  91.                             if(++posit>=3)
  92.                                           posit=0;
  93.               }
  94.               //报警显示
  95.               else
  96.               {
  97.                             if(posit==0)//数码管的米标志
  98.                             {
  99.                                           P0=(discode[disbuff_BJ[posit]])|0x80;
  100.                             }
  101.                             else if(posit==3)
  102.                             {
  103.                                           P0=0x76;                                         
  104.                             }
  105.                             else
  106.                             {
  107.                                           P0=discode[disbuff_BJ[posit]];
  108.                             }

  109.                             P1=positon[posit];
  110.               }
  111. }
  112. /**********************************************************************************************************/
  113. //计算
  114. void Conut(void)
  115. {
  116.               time=TH0*256+TL0;
  117.               TH0=0;
  118.               TL0=0;
  119.               S=(time*1.7)/100;     //算出来是CM

  120.               if(Mode==0)
  121.               {
  122.                             if((S>=700)||flag==1) //超出测量范围显示“-”
  123.                             {            
  124.                                           Feng=0;
  125.                                           flag=0;
  126.                                           disbuff[0]=10;                 //“-”
  127.                                           disbuff[1]=10;                 //“-”
  128.                                           disbuff[2]=10;                 //“-”
  129.                             }
  130.                             else
  131.                             {
  132.                                           //距离大于报警距
  133.                                           if(S<=BJS)
  134.                                           {
  135.                                                         Feng=0;
  136.                                           }
  137.                                           else
  138.                                           {
  139.                                                         Feng=1;                                         
  140.                                           }
  141.                                           disbuff[0]=S%1000/100;
  142.                                           disbuff[1]=S%1000%100/10;
  143.                                           disbuff[2]=S%1000%10 %10;
  144.                             }
  145.               }
  146.               else
  147.               {
  148.                                           Feng=1;
  149.                                           disbuff_BJ[0]=BJS%1000/100;
  150.                                           disbuff_BJ[1]=BJS%1000%100/10;
  151.                                           disbuff_BJ[2]=BJS%1000%10 %10;
  152.               }
  153. }
  154. /**********************************************************************************************************/
  155. //定时器0
  156. void zd0() interrupt 1                             //T0中断用来计数器溢出,超过测距范围
  157. {
  158.               flag=1;                                                                                    //中断溢出标志
  159. }
  160. /**********************************************************************************************************/
  161. //定时器1
  162. void zd3() interrupt 3                             //T1中断用来扫描数码管和计800MS启动模块
  163. {
  164.               TH1=0xf8;
  165.               TL1=0x30;
  166.               Key_();
  167.               Display();
  168.               timer++;
  169.               if(timer>=400)
  170.               {
  171.                             timer=0;
  172.                             TX=1;                                                    //800MS  启动一次模块
  173.                             _nop_();
  174.                             _nop_();
  175.                             _nop_();
  176.                             _nop_();
  177.                             _nop_();
  178.                             _nop_();
  179.                             _nop_();
  180.                             _nop_();
  181.                             _nop_();
  182.                             _nop_();
  183.                             _nop_();
  184.                             _nop_();
  185.                             _nop_();
  186.                             _nop_();
  187.                             _nop_();
  188.                             _nop_();
  189.                             _nop_();
  190.                             _nop_();
  191.                             _nop_();
  192.                             TX=0;
  193.               }
  194. }
  195. /**********************************************************************************************************/
  196. //主函数
  197. void main(void)
  198. {
  199.               TMOD=0x11;                               //设T0为方式1,GATE=1;
  200.               TH0=0;
  201.               TL0=0;         
  202.               TH1=0xf8;                               //2MS定时
  203.               TL1=0x30;
  204.               ET0=1;                                                        //允许T0中断
  205.               TR1=1;                                             //开启定时器
  206.               EA=1;                                                                      //开启总中断            
  207.               while(1)
  208.               {
  209.                             while(!RX);                            //当RX为零时等待
  210.                             TR0=1;                                          //开启计数
  211.                             while(RX);                            //当RX为1计数并等待
  212.                             TR0=0;                                          //关闭计数
  213.                             Conut();                                          //计算
  214.               }
  215. }</font>
复制代码

完整的Word格式文档51黑下载地址:
57-超声波测距汽车防撞系统.doc (458.5 KB, 下载次数: 126)







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:428137 发表于 2018-11-17 13:02 | 只看该作者
有实物连接图吗
回复

使用道具 举报

板凳
ID:779232 发表于 2020-6-16 09:23 | 只看该作者
有没有源文件
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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