基于单片机控制的超声波测距报警系统设计Word格式文档下载.docx
《基于单片机控制的超声波测距报警系统设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机控制的超声波测距报警系统设计Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
附录14
附录1元件清单及实物图14
附录2系统原理图15
附录3程序15
第一章绪论
1.1课题设计背景与目的
超声波测距【1】作为一种传统且实用的非接触测量方法,与激光、无线电测距方法相比,不易受外界光及电磁场等因素的影响,结构简单,成本低,在恶劣环境下也有一定的适应能力,因此在工业控制、建筑测量、机器人避障等方面都得到了广泛应用。
而且由于超声波指向性强,能量消耗缓慢,在介质中传播距离远,利用超声波检测距离,设计方便,计算处理简单,并在测量精度方面也能达到工业要求。
通过本次设计掌握超声波测距系统【2】硬件设计方法与软件编写方法,了解设计过程中所涉及的芯片结构、控制原理、硬件及编程等方面知识,加深对现代通信技术课程知识点的理解,提高在应用知识、设计、调试等方面的能力。
1.2课题设计任务及要求
任务:
1、设计最小化单片机系统并进行焊接和调试
2、设计并编程,实现超声波测距报警【3】功能
要求:
1、数码管能实时显示障碍物与超声波模块的距离信息。
单位为cm,精确到小数点后1位。
2、系统具备测距启动/复位功能。
3、当测试距离小于10cm或大于50cm时报警,并用蜂鸣器时间长短来区别。
1.3课题设计的主要内容
本课题设计的主要内容包括硬件设计和软件设计两部分。
通过对超声波测距可行性进行理论分析的基础上,利用计算机、电子技术及超声波在介质中的传播特性,制作出超声波测距的硬件部分,并编写相应的软件程序,进行调试与运行。
其中在硬件设计方面,针对超声波在传播时呈指数衰减的特性,采取最大限度提高驱动能力、对回波进行多级放大等方法,扩大测量范围。
在软件设计方面,采用模块化程序设计构想,将软件分为超声波驱动和数据处理2大模块,而每个模块又由若干小模块组成,使其软件结构简单清晰,利于调试与修改。
第2章系统硬件设计
超声波测距硬件主要包括STC89C52单片机最小系统、超声波发射/接收模块、显示模块、报警模块等。
2.1测距原理
超声波是指频率高于20KHz的机械波,其测距方法有多种,如相位检测法、声波幅值检测法和往返时间检测法等。
相位检测法虽然精度高,但检测范围有限,声波幅值检测法则易受反射波影响。
故本文采用超声波往返时间检测,其原理是检测出从超声波发射器发出的超声波经传播介质发送到接收器所需的时间,再与传播介质中的声速相乘,得到声波传输的距离。
而它的一半即为所测距离。
2.2设计思路及原理框图
单片机【4】首先发出40KHz信号,经放大后通过超声波发射器输出,然后超声波接收器将接收到的超声波信号经放大器放大,用锁相环电路进行检波处理,启动单片机中断程序,测得时间T,再由系统软件对其进行计算、判别,最后将相应的计算结果送至LED数码管进行显示。
图2.1超声波测距原理框图
2.3设计方案
采用AT89S52【5】单片机作为主控制器,选用高精度的晶振,以获得稳定的时钟频率,减少测量误差。
用P1.0端口输出40KHz方波信号,并利用外中断0口检测超声波接收电路输出的返回信号。
LED显示电路采用3位共阳数码管,段选接P0口的8位,位选接P2口的高三位。
超声波测距器的系统框图如下:
图2.2超声波测距报警系统框图
图2.3超声波测距报警系统流程图
第3章各模块介绍
3.1单片机AT89S52
AT89S52是一种低功耗、高性能CMOS8位微控制器【6】,具有8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,3个16位定时器/计数器,1个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容,片内置通用8位CPU及Flash存储单元,使其为众多嵌入式控制应用系统提供高灵活、高效率的解决方案。
3.2引脚及其功能
如图3.1为AT89S52引脚图。
图3.1AT89S52引脚图
1、VCC:
电源GND:
地
2、P0口:
8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口则作为低8位地址/数据复用,在这种模式下,它具有内部上拉电阻。
在flash编程时,P0口用来接收指令字节。
在程序校验时,则需要外部上拉电阻来输出指令字节。
3、P1口:
具有内部上拉电阻的8位双向I/O口。
P1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,作为输入口使用。
在输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。
在flash编程和校验时,P1口接收低8位地址字节。
引脚号第二功能:
P1.0T2:
定时器/计数器T2的外部计数输入,时钟输出
P1.1T2EX:
定时器/计数器T2的捕捉/重载触发信号和方向控制
P1.5MOSI、P1.6MISO、P1.7SCK:
系统编程用
4、P2口:
P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,作为输入口使用。
在访问外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高8位地址。
在使用8位地址访问外部数据存储器时,P2口输出锁存器内容。
在flash编程和校验时,P2口接收高8位地址字节和一些控制信号。
5、P3口:
P3输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,作为输入口使用。
在flash编程和校验时,P3口接收一些控制信号。
P3.0RXD:
串行输入P3.1TXD:
串行输出
P3.2INT0:
外部中断0P3.3INT0:
外部中断0
P3.4T0:
定时器0外部输入P3.5T0:
定时器1外部输入
P3.6WR:
外部数据存储器写选通P3.7RD:
外部数据存储器读选通
6、RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR的DISRT0位可以是此功能无效。
DISRT0默认状态下,复位高电平有效。
7、ALE/PROG:
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
通常,ALE以晶振1/6的固定频率输出脉冲,作为外部定时器或时钟使用。
在flash编程时,PROG用作编程输入脉冲。
8、PSEN:
外部程序存储器选通信号。
当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,则不被激活。
9、EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA应接GND。
为执行内部程序指令,EA应接VCC。
在flash编程时,EA应接12V的VPP电压。
10、XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
11、XTAL2:
振荡器反相放大器的输出端。
3.2单片机最小系统
本文单片机型号为AT89S52,采用频率为12MHz的晶振与两个电容组成的晶振电路,为单片机提供工作时序。
复位电路是按键电平复位,是通过使复位端经电阻与VCC电源接通而实现。
最小系统【7】电路图如图3.2所示。
图3.2单片机最小系统
3.2超声波发射模块
本文的发射电路是利用STC89C52的P3.3口发射40KHz的方波信号,将其分成两路,分别由74LS04经两次和一次反向放大后输出到超声波换能器,产生超声波,如图3.3所示。
其中,74LS04是一个高速CMOS六反相器,具有对称的传输延迟和转换时间,起着放大的作用。
对于HC类型,其工作电压为2~6V,具有高抗扰度,同时还能兼容LSTTL直接输入和CMOS逻辑输入。
图3.3超声波发射电路
3.3超声波接收模块
接收的回波信号先经过前置放大器和限幅放大器,将信号调整到合适的幅值,再通过带通滤波器滤除干扰信号来得到有用信号,最后由峰值检波器和整形电路输出到锁相环路,实现准确计时。
超声波接收电路如图3.4所示。
图3.4超声波接收电路
上图3.4中1脚是接收信号输入端,2脚是调节接收信号灵敏度,电阻越小,电容越大,灵敏度就越高。
在干扰较大的场合增加电阻阻值来调低灵敏度,干扰小的场合则减少电阻值来调高灵敏度。
5脚是调节中心频率,7脚接上拉电阻。
3.4显示模块
单片机【8】对LED管的显示分为静态和动态两种。
静态显示的特点是各LED管能稳定地同时显示各自字形,动态显示则是指各LED轮流地一遍一遍显示各自字形。
人们通常会由于视觉惰性,看到各LED在同时显示不同字形。
为了减少硬件开销,提高系统可靠性并降低成本,单片机控制系统通常采用动态扫描显示,但由于本系统所用的单片机引脚少,只需显示三位字符,所以采用静态的显示方式,用软件译码,从单片机引脚输出后直接接到LED显示管上,省去了外部复杂的译码电路。
显示电路【9】如图3.5所示。
图3.5显示电路
3.5报警模块
本系统选用单片机P3.6连接报警电路。
通过软件编程来控制蜂鸣器报警时间长短来表示所测距离是否超限。
当蜂鸣器发出长时间报警声时,说明测得距离小于10cm;
当发出短时间蜂鸣声时,说明测得距离大于50cm。
报警电路【10】如图3.6所示。
图3.6报警电路
第4章系统软件设计
本系统软件设计主要由主程序、超声波发射子程序、超声波接收中断程序及显示子程序组成。
4.1主程序设计
主程序首先对系统环境初始化,设置定时器T0工作模式为16位定时/计数器模式,置位总中断允许位EA并对显示端口P0和P2清0;
然后调用超声波发射子程序送出一个超声波脉冲。
为避免超声波从发射器直接传到接收器引起的直射波,需要延时0.1ms后才可以打开外中断0接收返回的超声波信号。
由于采用的是12MHz的晶振,计数器每计一个数就是1us,所以当主程序检测到信号后,将计数器T0中的数按式(4.1)计算,即可得被测物体与测距器之间的距离。
设计时取声速v为340m/s,则有
d=(v×
t)/2cm(4.1)
其中,t为计数器T0的计数值。
测出距离后,结果以十进制BCD码方式送往LED显示约为0.5s,然后再发超声波脉冲重复测量过程。
主程序流程图如图4.1
所示。
图4.1超声波测距主程序流程图
4.2超声波发射子程序
通过P1.0端口发送40KHz方波,计数器T0打开进行计时。
如图4.2所示。
图4.2超声波发射子程序流程图
4.3超声波接收中断程序
通过P3.2端口检测返回信号,收到后进入接收中断程序。
如图4.3所示。
图4.3超声波接收子程序流程图
第5章调试及性能分析
5.1调试
超声波测距器的制作和调试都较为简单。
首先硬件电路焊接完成后,通过KeiluVision3软件对编写的程序进行错误查找、修改,生成HEX文件,然后下载到单片机中运行,实现相应功能。
而且可以根据实际情况,修改超声波子程序每次发送的脉冲个数和两次测量的间隔时间,以适应不同距离的测量需求。
5.2性能分析
根据本文电路参数和程序,测距器可测量范围为10~50cm。
在试运行中,对平面物体做了多次调试,测距器的最大误差不超过3cm,重复性很好。
第六章结束语
在本次设计中,我们广泛借鉴了各种设计的优点,讨论并研究各个设计环节,包括如何产生40KHz方波,如何在接收电路中对其进行滤波、放大、整形等问题。
但由于条件和技术有限,对于在发射和接收过程中所产生的误差没有考虑并矫正,如温度误差、硬件电路误差等。
在为期两周的设计中,我们运用之前所学的知识,如电工、单片机、C语言等。
了解了超声波传感器的原理,学会了各种放大电路的分析和设计,也掌握了单片机开发过程中所涉及的开发方法和工具。
同时对一块电路板的设计、焊接、调试、改进等整个过程,有了更深入的理解,动手能力与自学能力也得到了锻炼和提高。
可以说为今后的工作、学习打下了坚实的基础。
参考文献
[1]杨帆,刘畅.超声波测距仪研究[J].电子器件,2009
[2]赵广涛,程荫杭.基于超声波传感器的测距系统设计[J].微计算机信息,2006
[3]胡瑞,周锡清.基于超声波传感器的测距报警系统设计[J].科技信息,2009
[4]姜志海,黄玉清.单片机原理及应用[M].电子工业出版社,2005
[5]朱士虎,何培忠.基于AT89S52超声波测距仪设计[J].仪表技术,2009
[6]沈俊霞,杨德.单片机在超声测距中的一种应用[J].电子科技,2005
[7]徐煜明.单片机原理及接口技术[M].电子工业出版社,2008
[8]何立民.单片机高级教程[M].北京航空港天大学出版社,2007
[9]杜刚.电路设计与制版protel99高级应用[M].新华大学出版社,2006
[10]清源科技编著.Prtotel99SE电路原理图与PCB仿真[M].机械工业出版社,2007
附录
附录1元件清单及实物图
1、元件清单
电解电容2个
KBP310AC1个
瓷片电容5个
STC89C52RC1个
电阻3个
SFCD9串口1个
二极管1个
ISP芯片擦槽1个
发光LED红色1个
USB接口1个
开关2个
排阻2个
Max232CPE1个
电路板1块
2、实物图
附录2系统原理图
附录3程序
LCD1602源程序:
#include"
systemInit.h"
#definelcdenGPIO_PIN_0//PB0;
#definelcdrsGPIO_PIN_1//PB1;
unsignedchardata;
//PD0-PD7;
unsignedcharnum;
unsignedchartable[]="
ABC"
;
unsignedchartable1[]="
DEF"
voidwrite_com(unsignedcharcom)//写命令
{
GPIOPinWrite(GPIO_PORTB_BASE,lcdrs,0x00);
//lcdrs=0;
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,com);
//PD=com;
SysCtlDelay(5*(TheSysClock/4000));
//延时5ms
GPIOPinWrite(GPIO_PORTB_BASE,lcden,0xFF);
//lcden=1;
GPIOPinWrite(GPIO_PORTB_BASE,lcden,0x00);
//lcden=0;