基于单片机的超声波测距系统设计 - 图文

更新时间:2023-12-30 03:30:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ha 2015届毕业生 毕业设计说明书

题 目: 基于单片机的超声波测距系统的设计

院系名称:信息科学与工程学院 专业班级:电信1107

学生姓名: 刘彪 学 号:201116910909

指导教师: 杨静 教师职称: 讲师

2015年 5 月29 日

I

摘 要

AT89C51是单片机里应用比较广泛的一款,在自动控制领域里享有很高的价值。以其易用性和多功能性受到了广大电子设计爱好者的好评。本次设计主要是利用AT89C51单片机、超声波传感器完成测距报警系统的制作。以AT89C51为主控芯片,利用超声波的传播特性完成距离的检测,将前方物体的距离探测出来。然后单片机处理运算单元,与设定的报警距离值进行比较判断,当测得距离小于设定值时,AT89C51发出指令控制蜂鸣器报警。通过DS18B20进行温度补偿,减少温度带来的干扰,提高测量精度。

整个硬件电路由超声波发射电路、超声波接收电路、电源电路、显示电路等模块组成,各探头的信号经单片机综合分析处理,实现超声波测距的各种功能。在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个模块功能。本毕业设计包括:硬件电路图、程序流程图,并给出了系统结构、电路原理和程序设计。系统具有易于控制、工作可靠、测距精度高、可读性强和流程清晰等优点。

关键词:超声波传感器、AT89C51、DS18B20

I

Title Ultrasonic Ranging System Based on MCU Abstract

AT89C51 is used widely which enjoys a high value in the field of automatic control system. It has been well received on versatility and ease of use by the majority of electronic design enthusiasts. This design is composed of SCM AT89C51, ultrasonic distance sensor and alarm system. As the main chip in AT89C51, using of ultrasonic sensors to detect obstacles. Microcontroller as a processing operation unit, then setting the alarm values are compared to judge the distance, when the measured distance is less the value. Then buzzer starts alarm at the microcontroller control. DS18B20 as a temperature compensation sensor, in order to reduce interference caused by temperature, improve the measurement accuracy.

The entire hardware circuit is composed by ultrasonic transmitter circuit, ultrasonic receiver circuit, the power circuit, display circuit and other modules. Each of the probe signal by the microcontroller comprehensive analysis process, then realize various functions of ultrasonic distance measurement. Base on this has designed system's overall concept, final adoption of hardware and software to achieve the various functional modules. The graduation project include: hardware circuit, program flow chart, and gives the system structure, circuit theory and programming. The instrument system has features: ease of control, stability of operation, highness of precision and readability, etc.

Keywords :Ultrasonic sensors、 AT89C51、DS18B20

II

目 次

错误!未找到引用源。

III

1绪论

1.1课题背景及重要意义

随着社会的需求,电子测量的传感器技术应用越来越多。超声波测量的精度符合工业要求,低成本性能稳定使它备受欢迎,随着科技对精度的要求越来越高,超声波测距技术已经被广泛用于人们日常生活和工作之中[1]。

由超声波测距是一种非接触的测量技术,不受光线、被测对象颜色这些外部环境的束缚。较其它仪器更加的方便和直接,更耐潮、腐蚀性气体等恶劣环境,具有很少需要维护、无污染、使用的寿命比较长等特点[2]。可在不同环境中能够实现距离信息实时在线显示,可直接用于水、酒、糖等液位的测量,也能够进行差值设定,直接显示各种液位的高度。因此,超声波在空气中的测距在特定的场合下有较为广泛的应用。利用超声波测距往往速度快而直接、能够迅速的实时控制,并且在测量准确度上得到了业界普遍的认可。它在汽车倒车雷达的研究和使用方面也得到了认可,并且被广泛的应用[3]。在其它方面的应用,也发挥着巨大的潜在价值,如医疗、潜艇等高精尖的科技上。

1.2课题的意义

基于影响超声波测距引起误差的几个重要因素做了分析,并为系统选择了比较合适的传感器。此系统打算在实验室内实现小范围的距离测距,测试距离约为0.02m—3m。系统整体构架如下图所示。

显示 模 块 语 音 模块 单片机控制单元 检测电路 发射电路 发射探头 障碍物 接受电路 接受探头 图1-1系统设计方案图 1

显示电路可以采用动态扫描的方式来实现,这样可以大大减少对硬件的需求的程度。通过单片机内部程序的执行能够使内部计数得到的时间数据迅速的转换为距离信息,并且实现在4个LED数码管显示出来,数据XXXX,单位cm[4]。 基于超声波测距能够克服传统上测距的缺陷,如能够进行液面的测量,传统上的测量方式不仅存在严重的缺陷而且操作起来难以实现;而且基于AT89C51单片机的超声波测距系统不仅价格低廉,其系统的体积也不大,同时也能够实现高精度的要求,这就为未来能够电子技术领域的广泛应用提供了良好的条件,这也是研究超声波技术课题的重要意义[5]。

1.3本文主要研究内容

本系统硬件部分由AT89C51控制器,超声波的接受电路以及发射电路、报警装置、温度补偿传感器电路和显示电路组成。当进行倒车时,发射和接受的超声波的电路开始工作,经过AT89C51数据处理的结果将以距离信息显示到LED数码管上,倘若距离小于所设定值时,报警电路中的蜂鸣器就会发出鸣叫,能够提醒司机遇到障碍物,要保持车距,注意安全[6]。超声波测距流程框图如下图所示:

发射电路 AT89C51 LED DS18B20 接受电路 图1-2系统设计总框图

报警电路 发射出去的声波碰到障碍物后大部分的会反射回来,一部分因折射而损失掉;由超声波接受头接受到信号,这时通过接受电路处理。单片机可以利用声波在环境中的传播速度和发射脉冲到接受反射脉冲的时间差,就能够计算出测距仪到障碍物的距离。倘若所显示的测量距离小于所设定的距离值,报警电路的蜂鸣器就会发出报警,起到警惕的作用。

对本课题的研究而言,不仅会从深度上分析超声波测距的基本原理,也了解超声波的特点及如何应用超声波,对本课题的研究后,也要展望未来超声波的发

2

展趋势,如何使这门技术富有价值,更重的一点是,此课题的研究不只仅研究理论方面,还要动手实践,设计硬件和编写软件,正真做到学以致用。

3

2 超声波测距原理与方法

2.1超声波简介

超声波技术在整个国民经济中的各个领域取得了广泛的应用。对提高产品的性能和质量,保障安全生产和机器设备的安全运作,有着十分重要的作用,在工业生产中提高生产的效益具有其它技术所不具备的优点。

超声波的物理性质主要是指超声波的折射和反射,当超声波要通过两种特性阻抗特性不同介质的平面上时,超声波的传播变成两种方式,一部分超声波在平面上被反射回来,而此系统就是利用超声波的此特性;另一部分超声波会穿过介质面,在另一种介质内部继续传播[7]。这两种传播方式称为超声波的反射和折射。正是利用超声波的这些特性,才使超声波的研究具备了真正的价值。

2.2 超声波测距原理

超声波测距可以通过不同的方式实现:例如相位检测法、往返时间检测法及声波幅值检测法等比较常用的三种方法[8]。本系统采用往返时间检测法的方式进行距离的测量。其所经过的时间也就是往返的总时间。由于确定了往返时间,再按照周围环境中空气的温度,可以实际情况推测出超声波在空气中的传播速度,便可以计算出距离。

如果测量的障碍物与测距仪之间的距离是s(m),超声波从发射到接受所用的总时间为t(s),超声波传播速度为v(m/s)表示。则有关系式如(2-1);

(2-1)

由于超声波的传播速度与环境中的温度紧密相关,一般而言,环境中的温度每抬高1℃,其超声波的传播速度也会随着增加0.6米/秒[9]。

表2-1 环境中不同温度下的传播速度

温度(℃) -30 声速(m/s) 313

-20 319 -10 325 0 10 20 344 30 349 323 338 在设计系统时,倘若环境中空气温度变化不大,就可以认为声速c是定值,这时取声速c为340m/s。如果测距精度要求的非常高,这时就可以通过改变硬

4

件电路的办法来实现其精度的测量,通过增加温度补偿电路法来加以实现精度的测量。

在本系统的设计计划利用AT89C51中的定时器来测量超声波传播在空气中的传播时间。利用DS18B20传感器测量环境中空气的温度,从而克服了测量精度低的缺点。空气中的超声波的传播速度与环境中空气的温度的关系可表示为:

c?331.45T?273.16?331.4?0.6T(m/s) (2-2)

273.16这时按式(2-2)对超声波传播速度进行实时的修正,以来提高测量的准确度。 这时式(2-2)可以简化为:

(2-3) 式中,T的温度单

位为℃,v为超声波在介质中的传播速度单位为m/s[10]。

当超声波的传播速度知道后,这时只需要求超声波在介质中传播的往返的时间t(s),可求得传感器与障碍物的距离l为:

l=1/2(331.4+0.6T)t (2-4)

2.3本章小结

本章首先介绍了超声波的基本的特性和特点,而后利用超声波的这些基本的特性为我们所用,如超声波的直线传播方式以及超声波在特定环境温度下有恒定的速度可以用来距离。接下来介绍了超声波的形成的方式和传播的特点,超声波在传播过程中的会发生反射、折射规律等特点;通过超声波的内部结构和影响超声波传播的几个重要参数给出本系统设计中所用超声波传感器的该如何选择。通过以上的这些特性,给出了超声波测距的原理以及公式表达式,这为超声波测距的软件系统的实现,提供了保障;在硬件电路的实践上提供了根据。而本章研究的重点是超声波的一些重要特性和超声波测距的基本原理,为后面章节系统的设计提供了有利的途径。

5

3 系统硬件设计

3.1硬件的选择

3.1.1 主控制器模块

采用单片机作为整个系统控制的中心,用来控制超声波传感器的收发模块,以实现特定的性能。充分了解我们的系统后,重点在于实现超声波测距功能,而在这一点上。单片机就显现并发挥出来它特别而又独特的好处,不仅体现在控制上的稳定,而且操作方便和快捷[11]。从这方面来看,单片机就可以充分发挥其丰富的资源,并且具有价格低廉等优点。因此,这种方案是一种较为理想的方案。单片机各管脚图如图3-1:

图3-1 AT89C51管脚图

对于本系统实物设计而言,若选用一片CPLD作为系统数据处理的核心,也能实现全局的掌控,处理的速度快、程序语言采用VHDL也比较容易编写,而且开发的周期也不会太长,虽然它的优点很明显,但是仅本系统采用单片机作为数据的核心则是更为合理,首先超声波测距对数据的处理速度要求不是很高,因此对系统信息的处理的要求自然没有太高的要求,仅这一点而言单片机就可以胜任,

6

同时单片机更为廉价,更符合商业的发展。综合各种考虑,我们决定采用AT89C51单片机作为系统的主控制器。 3.1.2 电源模块

对于电源模块经过综合的考虑将采用3节1.5v干电池共4.5v做电源,干电池输出的电压稳定,并且经过试验验证系统工作时,单片机、传感器的工作电压稳定能够满足本系统的要求,最重要的是干电池更换方面,与5v蓄电池相比较体积小,节约空间。综合考虑选择干电池供电是更加可行的方式。 3.1.3 显示模块

用数码管进行显示,数码管的显示速度快,使用起来简单,显示画面简洁明了。所以得到非常广泛的应用。在这里我们需要显示的数据仅是长度单位即距离值,用数码管作为显示模块足以满足要求。倘若用LCD液晶屏显示,虽然也满足此系统的各项要求,但是显然浪费了资源,仅从这点,选择数码管是更为合理的方案。

3.1.4 温度补偿模块

采用DS18B20器件作为温度补偿电路的温度传感器。DS18B20的数字温度输出是通过“一线”总线的方式,这是它独特的数字信号总线协议,和其它的传感器不同的是,它是将信号线和电源线结合在一起的方式,仅是使用一条口线,因此使用起来特别的简单;另外它每个芯片有特定的唯一编码,能够实现联网寻址等[12]。也可以使用多个这样的传感器组件成传感器网络,这能够实现更大测量系统的可能性。最重要的是,它在测温精度高,容易实现时间的转换,分辨率的精度等方面和其它温度传感器相比较,已经有了很大的进步,同时它体积微小,形状如三极管,具有三个管脚;其特点是独特的单线接口,也就是说只需一个接口引脚即可以通信,无需外部元件,并且可用数据线供电,又不需要备份电源;测量温度的范围是从-55℃到+125℃,分辨值为0.5℃。也可以等效成为华氏温度。它是通过九位的数字值来读取温度的,能够在一秒内把把数字信号转化为温度。对于用户而言,带来了诸多的方面和满意的效果。DS18B20实物图如图3-2:

7

图3-2 DS18B20实物图

左边管脚为GND与地相连、DQ为中间管脚,为数字输入输出管脚、最右为VDD与电源相连。 3.1.5 报警模块

采用蜂鸣器提示,优点是实现的电路简单而实用,且性能稳定同时可靠性高。报警电路的作用是与单片机的p2.3管脚相连,当测距的距离值小于特定值时,p2.3的电平值会从低电平变为高电平,这时蜂鸣器便会发出报警,当数码管所显示的数值大于所设定的值,蜂鸣器则保持不工作的状态[13]。报警电路的作用就是提醒用户的目的。

图3-3 蜂鸣器实物

3.2 最终方案

经过反复论证,我们最终确定了如下方案: 1、 主控芯片采用AT89C51单片机作为主控制器; 2、 用3节干电池供电; 3、 用数码管显示;

8

4、 采用DS18B20传感器做温度补偿; 5、 用蜂鸣器做提示。

3.3本章小结

本章主要是通过对比各硬件器件的优缺点,来找到合适本系统所需要的最佳器件;如供电模块是选用干电池或是蓄电池、显示模块是用液晶显示还是用数码管显示、报警模块用蜂鸣器还是语音芯片、温度补偿传感器是用DS18B20传感器还是用TP100器件;通过对不同器件的特性、参数做比较,选择出设计本系统所需要的最合适的器件,这样做既节约了资源,也节约了设计系统所需要的成本;通过这样的对比,能够使我们更加了解不同器件的各个性能指标和参数,也培养了我们良好的学习的习惯,既找到了实现目标的最佳途径,有利于对专业知识的深度认知,对以后的学习和职业的发展有巨大的好处。

9

4 硬件实现与电路设计

4.1 主控制模块

主控制最小系统电路如图4-1所示。

图4-1 单片机主控电路

4.2 单片机的时钟电路与复位电路设计

单片机使用串口对单片机进行程序的烧写,下载程序简单且迅速;而且AT89C51单片机内部集成的电路结构,具有十分强大的抗干扰能力[14]。

本系统采用内部方式的时钟电路和复位电路,如下图:

图4-2 时钟电路

10

图4-3 复位电路

4.3超声波测距模块

超声波模块使用的是现成的HC-SR04超声波的发射和接受模块,该模块功能能够实现 2cm-400cm 的非接触式距离的测量,测距误差能够达到 3mm。其中此模块包括控制电路、超声波发射器与接收器三个部分组成[15]。

此模块的基本工作原理:采用 IO 口 TRIG 触发的方式来实现的,其中模块自动发送40KHz左右的方波信号,能够实现自动检测是否有方波信号折回;倘若有方波信号的折回,可以通过 IO 口 ECHO 输出一个持续的高电平信号,因此高电平持续的时间就是超声波在整个传播过程中所用的时间。测试距离=(高电平时间*声速(340M/S))/2。实物如下图4-4:

图4-4 超声波模块实物

11

此超声波测距模块正常工作时的电气参数如下表:

表4-1 超声波传感器模块工作特性参数

电气参数 工作电压 工作电流 工作频率 测量角度 最远射程 最近射程 触发信号 回响信号 规格尺寸 HC-SRO4超声波模块 5v 15mA 40kHz 15度 4m 2cm 持续10us的TTL脉冲 输出TTL电平信号 45*20*15mm 此模块要注意的是:此模块不可以带电连接,倘若必须要带电连接,就必须

先让此模块的GND管脚首先连接,否则会影响模块的稳定性,导致模块错误的数据传输。测距的时候,被测物体的面积不能太小,否则发射出去的超声波难以反射回来,同时要求平面要求尽可能的平整,否则也会影响测量的结果的准确度。

4.4 声音报警电路的设计

如下图所示,用一个蜂鸣器和三极管、电阻组成的并与单片机的P2.3引脚连接,通过软件程序控制管脚高低电平的输出,从而控制蜂鸣器的工作与否;这样就组成声音报警电路。如图4-5:

图4-5 声音报警电路图

12

4.5 显示模块

显示模块采用数码管显示接口电路如图4-6所示。

图4-6 数码管电路

4.6温度补偿电路

温度补偿电路采用DS18B20传感器进行测量环境中的温度,P2.4引脚接DS18B20数据总线,并且控制DS18B20传感器进行温度的转换和传输的数据。本系统对温度传感器DS18B20选用的是外部供电的方式。并且总线控制器也不需要在温度转换的阶段连续的保持高的电平信号。因此在转换的过程中,也可以在单线总线上完成其他数据传输,如图4-7:

图4-7 温度传感器接口电路图

13

4.7元件清单

综上分析,系统所需的元件清单如下表:

表4-2 系统设计所需原件清单

参数 10k 10uF 12M 指示灯 SW-灰色 DS04 U1 蜂鸣器 S9012 20uF Header4 SW—PB 2k 1k DS18B20 名称 电阻 电容 晶振 发光二极管 电源开关 数码管 单片机 蜂鸣器 三极管 电容 超声波接口 独立按键 电阻 电阻 温度传感器 种类 R14 C1 Y1 D1 SW1 DS1 U1 B1 Q1.Q2.Q3.Q4.Q5 C2.C3 P1 S1.S2.S3.S4 R4.R5.R6.R13.R15 数量 1 1 1 1 1 1 1 1 5 2 1 4 R1.R2.R3.R8.R9.R10.R11.R12 U2 1 4.8本章总结

本章通过各个模块电路图的设计和硬件功能的实现来完成实际的操作,首先是对单片机的时钟电路和复位电路进行了设计,其次是结合超声波的特性对超声波测距传感器做了详细的介绍,说明了各个引脚的功能及如何结合单片机构成一个简单的系统,再者就是如何设计声音报警电路以及显示模块电路的设计,最后最重要的就是如何利用温度传感器DS18B20来设计温度补偿电路来提高超声波测距的精度。总的来说本章就是通过各个模块的设计,然后结合在一起实现其功能。在这实现的过程中不仅要求我们掌握一些计算机仿真软件的使用,

14

如keil uVision软件来完成程序的编写,并且生成可执行的.hex文件植入到单片机中[16]。其次就是电路仿真软件,如Proteus软件进行仿真;最终便是硬件电路的焊接与调试[17]。本章需要我们较强的专业知识体系和较强的实践动手能力。

15

5系统软件设计方案

5.1主程序流程图

如图5-1所示为超声波测距主程序流程图。

开始 系统初始化 测得距离小于设定值比较 N Y 启动报警电路,开启报警 距离比较,报警是否持续 N Y 报警结束 Y 再次检测等待下次报警 N 结束

图5-1 系统软件的整体流程图

16

5.2 DS18B20初始化程序流程图

在DS18B20工作之前需要进行初始化,以实现温度传感器的正常工作,流程图如图5-2:

发复位命令 发跳过ROM命令 初始化成功 结束

图5-2 初始化程序流程图

5.3硬件系统的实现及功能分析

当以上准备工作的完成,首先在市场上完成了各器件的采购,部分器件通过使用万用表测试了器件的性能,器件全部准备妥当后,首先要把调试好的程序生成.hex文件烧进单片机中,完成整个电路板的焊接。焊接完成实物图如图5-3:

图5-3 系统的实物图

17

当硬件系统的焊接、调试完成后,对系统的稳定性和对数据的准确度做了详细的分析。首先在实际的环境下,并且环境的温度保持恒定的情况下:我们利用该系统测得了一组数据,当测量距离小于0.5m时,如下表5-4:

表5- 1 超声波测量距离与实际距离对照表

实际0.01 0.02 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.50 值(m) 测量0.01 0.02 0.05 0.10 0.15 0.20 0.25 0.29 0.35 0.40 0.50 值(m) 当测量的距离大于0.5时,测量值与实际值如下表5-5:

表5-2 超声波测量距离与实际距离对照表

实际0.50 0.65 0.70 0.85 0.90 0.95 1.00 1.50 2.00 2.50 3.00 值(m) 测量0.50 0.65 0.70 0.84 0.89 0.95 0.99 1.48 1.97 2.47 2.96 值(m) 通过上面两个的表格的分析,在相同的环境中且环境温度恒定,超声波测距系统在测量距离小于0.5m时,测量值与实际值基本达到完全一致;当测量的距离大于0.5m时,随着距离的增加,引起的误差就越大。因此可得,超声波测距系统更适合短距离的测量。

对超声波测距系统的误差分析:(1)由超声波传播方式引起的误差:经分析知超声波的发射方向和接收方向并不是平行的,而是呈现一定的角度。当测量的距离越长,超声波传播的实际距离与测距仪到障碍物的距离差就会越大,引起的角度误差就会越大。(2)由超声波的特性引起的误差:超声波在环境介质中的传播会发生衰落,且衰落的大小与传播的距离成正比;因此距离越长,衰落就越严重,引起的误差就会越大。根据这两方面的原因,超声波测距更合适短距离的测量。

18

如何减小超声波测距系统的误差:根据误差引起的原因分析可知,对于由超声波传播方式引起的误差,就是如何减小角度。这就需要在设计硬件时,尽可能的使超声波的发射方向与接受方向接近平行。对于由超声波的特性引起的误差;这是由超声波自身条件决定的,我们无法改变;要想改变这部分原因引起的误差,我们可以考虑优化单片机的内部程序,如在不同测量的距离段内,设置不同的算法,来补偿由超声波衰落而引起的那部分误差。通过以上两种方式的改进,可以减少误差,提高测量的精度。

当然在实际的操作中,如果障碍物的表面不平整,也会影响到系统所测得距离值的正确性。另外在操作遇到恶劣的天气如大雨、大雾,这改变了环境中介质的密度,这些因素都会影响系统所测距离的正确定。这些外部环境引起的误差,很多时候难以改变,就需要我们想办法提高系统自身的性能,来克服这些缺陷。 而下图5-6是在温度恒定,理想均匀的空气介质的环境下,超声波测距系统的实验平台。所测的数据是准确的。

图5-4 系统正在测量与障碍物距离的实验

19

5.4 本章总结

本章主要根据超声波测距系统的硬件实现方案,然后给出具体实现单片机涉及到的软件结构以及相关的开发语言、编程。这里面主要包括整个程序的算法思想,以及采用模块化设计思路,并且大量采用子程序设计的方法来实现,这样从而大大缩短编程开发的周期,节约了时间和成本。而且程序事先在计算机进行软件仿真,确定所编写程序的准确性,然后进行单片机和硬件模块的结合,而后进行调试,从而实现测距的功能。对本章而言,是对整个超声波测距系统的整体把控,按照各模块的逻辑顺序及把握硬件的实现功能流程,给出合理的设计思路,思路严谨,细节周到。总的来说,本章就是对系统整体方案流程的严格把控。

20

6 系统实现所遇到的问题及解决方案

6.1 硬件方面

6.1.1元件焊接所遇到的问题

按电路图买好元件后,首先检查买回元件的质量和性能,按各元件的检测方法分别进行逐一的检测,要谨慎认真。更重要的要认真核对元件与原理图是否一致,在完全检查好后才可上件、焊接,防止出错的焊件难以改正。 在焊接的过程中由于四个管脚的键控开关的错误使用,错误的使用了对角管脚,导致电路的短路,开关便没起到任何的作用,尤其是复位开关的短路,导致整个系统的短路,这种错误导致整个系统不能工作。更大的隐患是通电后直接烧坏电路板上的元件,导致无法想象的后果和损失。最后解决这个问题的方法是用万用表在各个元件测量,仔细的检测后,才发现问题的所在,解决后整个系统才能完成基本的功能。

6.1.2放置、焊接元件所遇到的问题

按照设计好的电路图的位置合理的放置各个元件,在这个过程中,要遵循一定的规律,起初放置焊接较低的元件,然后焊接较高的和要求较高的元件[18]。特别是容易损坏的元件要最后再焊,在焊集成芯片时连续焊接时间不能够太长,以免损伤硬件的内部电路构造,造成器件的损伤而失其性能;同时要注意芯片的安装方向,比如单片机的底座和芯片的方向是否一致。其次,比较重要的是各元件的整体布局一定要合理,这样有利于电路的焊接和电路板的空间。在元件的放置过程中没有按照合理的顺序,导致电路板的空间不够用,引起焊接点过于混乱,而引起焊错位置,引起整个电路比较严重的后果。最后从新编排,即节约了空间,又准确的完成的电路焊接。

6.1.3由温度传感器DS18B20引起的误差分析

温度传感器DS18B20有三个管脚,电路完成焊接后,通电后,由于温度传感器管脚的反接,导致传感器温度急剧的升高,由于具有耐高温的特性而没有烧坏,但是大大增加测量的误差,发现测量的数据有较大的偏差后,才发现温度补偿传感器管脚接错了,改正后,距离的测量精度才有了较大的提高。这样温度补偿电路才发挥它真正的作用。有时一步的错误,所导致的后果是不可想象的,在以后

21

的实验设计要足够的细心,才能降低这样错误的出现,把损失降低到最低。

6.2软件方面

程序的编写首先是要保证程序逻辑的正确性,因此,在此之前,要设计出程序的整体流程图,这是要成为一个优秀的程序员首先要坚持的习惯;当程序的整体构架基本确定。使用模块化的编程方式,这样才使程序的逻辑感更强。[9对本系统程序,我在开始编程的时候,忽略了程序的模块化,导致整个程序错乱不堪,连最基本的功能就很难实现。后来按照规范的构架,合理的调整程序,才使程序模块更清晰,程序需要调试的次数少了,而且更容易找到错误的原因。如对本系统而言,数码管段选定义、处理距离的函数以及报警函数和数码管的显示函数把它们采用模块化思路独立编写,又通过函数定义使它们紧密相连,然后与单片机相结合构成一个可执行的系统[19]。

程序的各个模块只是把握了系统的整体架构,而程序的关键是执行,而每步的程序不仅要合法,而且每步的程序怎样设计更合理,才更符合现实。例如,延时函数怎样设计,才能使数码管显示的数据既不跳变剧烈也不长时间保持不变,而是显示的数据更具有直观性才是我们想要的。这就需要我们结合实际不断的调整函数的循环参数,直到调试成我们想要的那种效果。这样的好处是有利于我们实时的读出数据,并保证了数据的正确性。总之,这些编程的细节的掌握,一方面需要我们不断提高编程能力,另一方面就是我们怎样把设计好的程序和实际结合的更好。

22

结论

本设计研究了一种基于单片机技术为核心的超声波测距报警系统。该系统是以AT89C51单片机作为工作处理器核心元件,同时DS18B20温度传感器作为温度补偿系统。它能够以非接触的方式测出到前方障碍物的距离,并把距离信息显示出来。该系统的优点是操作便捷且简单易懂,用户容易上手造作;且安装起来简单、智能程度好。

其次,利用超声波检测迅速、方便以及计算简单、容易做到实时的控制,并且在测量精度上已经能够达到工业上的标准,随着科技的大踏步前进,超声波的应用将会变得越来越广泛。但就目前技术水平来说,超声波的应用潜能还远没有开发出来,所以超声波技术在未来有着广阔前景的技术领域。

最后,对超声波技术的展望,研制具有更高定位精度的测距声呐,能够满足在水中测距和检测,比如潜艇声呐,能够识别水下的目标。另外,也能在医疗领域发挥它巨大的价值,如更深层次的探伤、为人们发现隐藏在人体中难以发现的肿瘤[20]。总之,超声波技术的应用与研究我们只走了一小步,未来更大的空间还需要我们去挖掘。

23

致谢

时间过得很快,让人抓不住它的尾巴,大学已经接近了尾声,我的毕业设计也基本要完成了。在此期间,我的导师杨静从课题的立项,到课程的研究,然后到论文的完成都给我了很大的帮助,悉心的指导,并且告诉我怎么样查资料,从哪里查,让我们谨记毕业设计的要求,让我的毕业设计做到规范标准少走了很多弯路。其次,不得不提到我的同学,无论是在硬件电路设计中电路的仿真,电路板的焊接,还是控制程序的编写,每次我遇到问题,是他们第一时间给了我帮助,因为如此我才能顺利的完成设计。毕业设计的完成,意味着大学四年的学生生涯的结束,才发现我对母校已经有了深深的不舍,是母校给我们提供了良好的学习环境,是母校中的老师给我们这些学生给予正确的学习指导和职业生涯规划,让我们提前对以后的工作和生活前景有了一个大概的认识和目标。谢谢曾经教课的每一位老师,谢谢曾经给予无私帮助的同学们,谢谢给我们带来欢乐的校友们,尤其的感谢我的导师杨静老师,谢谢你们,是你们给了我一个充实的大学四年生活!

24

参考文献

[1]贾伯年.传感器技术[M].南京:东南大学出版社,2000 [2]李丽霞.单片机在超声波测距中的应用.电子技术,2002 [3]金发庆.传感器技术与应用.机械工业出版社, 2004

[4]赵广元.Proteus辅助的单片机原理实践.北京航空航天大学出版社,2013 [5]王元.单片机接口技术与应用. 清华大学出版社,2013

[6]姜道连,袁世良.用AT89C51设计超声波测距仪.国外电子元器件,2000 [7]赵继文.传感器与应用电路设计.北京:北京科学出版社,2002 [8]蔡自兴. 智能控制原理与应用(第2版). 清华大学出版社,2014 [9]郭天祥.51单片机应用开发.电子工业出版社,2010

[10]童华.单片机应用技术及项目应用.电子工业出版社,2013 [11]童诗白.模拟电子技术基础,第二版.高等教育出版社,2003 [12]黄继昌.电子元器件应用手册,北京人民邮电出版社,2004 [13]林清安.Pro/E基础入门.电子工业出版社,2010

[14]肖看,李群芳.单片机原理、接口及应用.清华大学出版社,2010 [15]华杰. 51单片机应用开发.人民邮电出版社,2014

[16]周国运.单片机原理及接口技术 (C语言)清华大学出版社,2013

[17]金杰.基于proteus的仿真单片机应用.电子工业出版社,2013 [18]D.Ensminger and L.J.Bond, Ultrasonics; Fundamentals, Technologies,and Applications. Boca Raton, FL: CRC Press, 2012.

[19]L.C.Lynnworth. Ultrasonic Measuremets for Process Control: Theory, Techniques, and Applications. New York: Academic Press, 1989.

[20]B.G.Kim, J.L.Rempe,J.-F. Villard,and S.Solstad, Review of instrumentation for irradiation testing of fuels and materials, Nucl. Technol.vol. 176, Noy. 2011.

25

附录1整机电路原理图

26

附录2 系统程序

#include //调用单片机头文件

#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 #include #include \

//数码管段选定义 0 1 2 3 4 5 6 7 8 uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0, 0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //断码

uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};

//数码管位选定义

sbit smg_we1 = P3^4; //数码管位选定义 sbit smg_we2 = P3^5; sbit smg_we3 = P3^6; sbit smg_we4 = P3^7;

uint code wendu_buchang1[46] = { //温度补偿表格 331,332,333,333,334,334,335,336,336,337, // 0-9度 337,338,339,339,340,341,341,342,342,343, //10-19度 343,344,345,345,346,346,347,348,348,349, //20-29度 349,350,351,351,352,352,353,354,354,355, //30-39度 355,356,357,357,358,358 //40-45度 };

sbit dq = P2^4; //18b20 IO口的定义 uint temperature ; //

sbit c_send = P3^2; //超声波发射 sbit c_recive = P3^3; //超声波接收

sbit beep = P2^3; //蜂鸣器IO口定义 uchar smg_i = 3; //显示数码管的个位数 bit flag_300ms ;

long distance; //距离 uint set_d; //距离

uchar flag_csb_juli; //超声波超出量程

27

9

uint flag_time0; //用来保存定时器0的时候的

uchar menu_1; //菜单设计的变量

sfr WDT_CONTR=0xe1; //看门狗(watch-dog-Timer)控制器

/***********************小延时函数*****************************/ void delay_uint(uint q) { while(q--); }

/***********************1ms延时函数*****************************/ void delay_1ms(uint q) { uint i,j; for(i=0;i

/***********************处理距离函数****************************/ void smg_display() { dis_smg[0] = smg_du[distance % 10]; dis_smg[1] = smg_du[distance / 10 % 10]; dis_smg[2] = smg_du[distance / 100 % 10] & 0xdf; ; }

/******************把数据保存到单片机内部eeprom中******************/ void write_eeprom() { SectorErase(0x2000); byte_write(0x2000, set_d % 256); byte_write(0x2001, set_d / 256); byte_write(0x2058, a_a); }

/******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom() { set_d = byte_read(0x2001); set_d <<= 8; set_d |= byte_read(0x2000);

28

a_a = byte_read(0x2058); }

/**************开机自检eeprom初始化*****************/ void init_eeprom() { read_eeprom(); //先读 if(a_a != 1) //新的单片机初始单片机内问eeprom { set_d = 50; a_a = 1; write_eeprom(); //保存数据 } }

/********************独立按键程序*****************/ uchar key_can; //按键值

void key() //独立按键程序 { static uchar key_new; key_can = 20; //按键值还原 P2 |= 0x07; if((P2 & 0x07) != 0x07) //按键按下 { delay_1ms(1); //按键消抖动 if(((P2 & 0x07) != 0x07) && (key_new == 1)) { //确认是按键按下 key_new = 0; switch(P2 & 0x07) { case 0x06: key_can = 3; break; //得到k2键值 case 0x05: key_can = 2; break; //得到k3键值 case 0x03: key_can = 1; break; //得到k4键值 } } } else key_new = 1; }

/****************按键处理显示函数***************/ void key_with()

29

{ if(key_can == 1) //设置键 { menu_1 ++; if(menu_1 >= 3) { menu_1 = 0; smg_i = 3; //只显示3位数码管 } if(menu_1 == 1) { smg_i = 4; //只显示4位数码管 } } if(menu_1 == 1) //设置报警 { if(key_can == 2) { set_d ++ ; //加1 if(set_d > 400) set_d = 400; } if(key_can == 3) { set_d -- ; //减1 if(set_d <= 1) set_d = 1; } dis_smg[0] = smg_du[set_d % 10]; //取小数显示 dis_smg[1] = smg_du[set_d / 10 % 10] ; //取个位显示 dis_smg[2] = smg_du[set_d / 100 % 10] & 0xdf ; //取十位显示 dis_smg[3] = 0x60; //a write_eeprom(); //保存数据 } }

/***********************18b20初始化函数*****************************/ void init_18b20() { bit q; dq = 1; //把总线拿高 delay_uint(1); //15us dq = 0; //给复位脉冲

30

delay_uint(80); //750us dq = 1; //把总线拿高 等待 delay_uint(10); //110us q = dq; //读取18b20初始化信号 delay_uint(20); //200us dq = 1; //把总线拿高 释放总线 }

/*************写18b20内的数据***************/ void write_18b20(uchar dat) { uchar i; for(i=0;i<8;i++) { //写数据是低位开始 dq = 0; //把总线拿低写时间隙开始 dq = dat & 0x01; //向18b20总线写数据了 delay_uint(5); // 60us dq = 1; //释放总线 dat >>= 1; } }

/*************读取18b20内的数据***************/ uchar read_18b20() { uchar i,value; for(i=0;i<8;i++) { dq = 0; //把总线拿低读时间隙开始 value >>= 1; //读数据是低位开始 dq = 1; //释放总线 if(dq == 1) //开始读写数据 value |= 0x80; delay_uint(5); //60us 读一个时间隙最少要保持60us的时间 } return value; //返回数据 }

/*************读取温度的值 读出来的是小数***************/ uint read_temp() { uint value;

31

uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0xbe); //发出读取暂存器命令 EA = 0; low = read_18b20(); //读温度低字节 value = read_18b20(); //读温度高字节 EA = 1; value <<= 8; //把温度的高位左移8位 value |= low; //把读出的温度低位放到value的低八位中 value *= 0.0625; //转换到温度值 return value; //返回读出的温度 }

/****************报警函数***************/ void clock_h_l() { static uchar value; if(distance <= set_d) { value ++; //消除实际距离在设定距离左右变化时的干扰 if(value >= 2) { beep = ~beep; //蜂鸣器报警 } } else { value = 0; beep = 1; //取消报警 } }

/***********************数码位选函数*****************************/

32

void smg_we_switch(uchar i) { switch(i) { case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break; case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break; case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break; case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break; } }

/***********************数码显示函数*****************************/ void display() { static uchar i; i++; if(i >= smg_i) i = 0; smg_we_switch(i); //位选 P1 = dis_smg[i]; //段选 }

/******************小延时函数*****************/ void delay() { _nop_(); //执行一条_nop_()指令就是1us _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }

/*********************超声波测距程序*****************************/ void send_wave() { c_send = 1; //10us的高电平触发 delay();

33

c_send = 0; TH0 = 0; //给定时器0清零 TL0 = 0; TR0 = 0; //关定时器0定时 while(c_recive); //当c_recive为零时等待 TR0=1; while(!c_recive) //当c_recive为1计数并等待 { flag_time0 = TH0 * 256 + TL0; if((flag_time0 > 40000)) //当超声波超过测量范围时,显示3个888 { TR0 = 0; flag_csb_juli = 2; distance = 888; break ; } else { flag_csb_juli = 0; } } if(flag_csb_juli == 1) { TR0=0; //关定时器0定时 distance =flag_time0; //读出定时器0的时间 if(temperature <= 45) distance *= wendu_buchang1[temperature] / 2.0 * 0.0001; // 0.017 = 340M / 2 = 170M = 0.017M 算出来是米 else distance *= 358 / 2.0 * 0.0001; // 0.017 = 340M / 2 = 170M = 0.017M 算出来是米 if((distance > 500)) //距离 = 速度 * 时间 { distance = 888; //如果大于3.8m就超出超声波的量程 } } }

/*********************定时器0、定时器1初始化******************/ void time_init() { EA = 1; //开总中断

34

TMOD = 0X11; //定时器0、定时器1工作方式1 ET0 = 0; //关定时器0中断 TR0 = 1; //允许定时器0定时 ET1 = 1; //开定时器1中断 TR1 = 1; //允许定时器1定时 }

/***************主函数*****************/ void main() { beep = 0; //开机叫一声 delay_1ms(150); P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平 send_wave(); //测距离函数 smg_display();//处理距离显示函数 time_init(); //定时器初始化程序 init_eeprom(); //开始初始化保存的数据 send_wave(); //测距离函数 send_wave(); //测距离函数 while(1) { if(flag_300ms == 1) { flag_300ms = 0; clock_h_l(); //报警函数 temperature = read_temp(); //先读出温度的值 if(beep == 1) send_wave(); //测距离函数 if(menu_1 == 0) smg_display(); //处理距离显示函数 if(menu_1 == 2) //显示温度 { dis_smg[0] = 0xf0; dis_smg[1] = smg_du[temperature % 10]; //取温度的个位显示 dis_smg[2] = smg_du[temperature / 10 % 10] ; //取温度的十位显示 dis_smg[3] = 0xFF; } } key(); //按键函数

35

if(key_can < 10) { key_with(); //按键处理函数 } } }

/*********************定时器1中断服务程序************************/ void time1_int() interrupt 3 { static uchar value; //定时2ms中断一次 TH1 = 0xf8; TL1 = 0x30; //2ms display(); //数码管显示函数 value++; if(value >= 150) { value = 0; flag_300ms = 1; } }

36

本文来源:https://www.bwwdw.com/article/w44x.html

Top