52单片机超声波测距论文最终版要点.docx
《52单片机超声波测距论文最终版要点.docx》由会员分享,可在线阅读,更多相关《52单片机超声波测距论文最终版要点.docx(13页珍藏版)》请在冰豆网上搜索。
52单片机超声波测距论文最终版要点
超声波测距
摘要:
本作品采用AT89S52作为主控制器,包括LCD液晶显示模块、超声波测距模块,构成了一个基于单片机控制的超声波测距。
系统框图如图1所示
硬件电路的设计主要包括单片机系统及显示电路、超声波发射电路和超声波接收电路等几部分。
单片机采用AT89S52,系统晶振采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。
单片机用P1.0端口输出超声波换能器所需的40kHz的方波信号,P3.2端口监测超声波接收电路输出的返回信号。
显示电路采用简单实用的LCD1602液晶显示,输出端口为单片机的P2口,位码输出端口分别为单片机的P3.5、P3.6、P3.7口。
1.1系统整体方案的设计
由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。
利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到农业生产等自动化的使用要求。
超声波发生器可以分为两大类:
一类是用电气方式产生超声波,一类是用机械方式产生超声波。
电气方式包括压电型、电动型等;机械方式有加尔统笛、液哨和气流旋笛等。
它们所产生的超声波的频率、功率、和声波特性各不相同,因而用途也各不相同。
目前在近距离测量方面常用的是压电式超声波换能器。
根据设计要求并综合各方面因素,本文采用AT89S52单片机作为控制器,用LCD实现数字动态显示,采用555定时器构成振荡电路。
1.151系列单片机的功能特点
5l系列单片机中典型芯片(AT89C51)采用40引脚双列直插封装(DIP)形式,内部由CPU,4kB的ROM,256B的RAM,2个16b的定时/计数器TO和T1,4个8b的工/O端I:
IP0,P1,P2,P3,一个全双功串行通信口等组成。
特别是该系列单片机片内的Flash可编程、可擦除只读存储器(E~PROM),使其在实际中有着十分广泛的用途,在便携式、省电及特殊信息保存的仪器和系统中更为有用。
该系列单片机引脚与封装如图2-1所示。
52系列单片机提供以下功能:
4kB存储器;256BRAM;32条工/O线;2个16b定时/计数器;5个2级中断源;1个全双向的串行口以及时钟电路。
空闲方式:
CPU停止工作,而让RAM、定时/计数器、串行口和中断系统继续工作。
掉电方式:
保存RAM的内容,振荡器停振,禁止芯片所有的其他功能直到下一次硬件复位。
5l系列单片机为许多控制提供了高度灵活和低成本的解决办法。
充分利用他的片内资源,即可在较少外围电路的情况下构成功能完善的超声波测距系统。
1.3系统整体方案的论证
超声波测距的原理是利用超声波的发射和接收,根据超声波传播的时间来计算出传播距离。
实用的测距方法有两种,一种是在被测距离的两端,一端发射,另一端接收,直接接收波方式,适用于身高计;一种是发射波被物体反射回来后接收的反射波方式,适用于测距仪。
此次设计采用反射波方式。
测距仪的分辨率取决于对超声波传感器的选择。
超声波传感器是一种采用压电效应的传感器,常用的材料是压电陶瓷。
由于超声波在空气中传播时会有相当的衰减,衰减的程度与频率的高低成正比;而频率高分辨率也高,故短距离测量时应选择频率高的传感器,而长距离的测量时应用低频率的传感器。
2.1超声波测距单片机系统
超声波测距单片机系统主要由:
AT89C51单片机、晶振、复位电路、电源滤波部份构成。
如图3-2。
图3-2:
超声波测距单片机系统
2.2超声波发射、接受电路
超声波发射如图3-3,接收电路如图3-4。
超声波发射电路由电阻74ALO4、555电路及超声波发送头T40构成接收电路。
由555发射出波形,再由555外围的电路经过滤波、调整,形成好看无杂波的波形,再经过74AL04反向驱动放大,最后由超声波发射探头发射出去。
接收电路由一级放大100倍,低通滤波,高通滤波,二级放大100倍,经过比较器LM393转换为高低电平,触发三极管,启动中断计时。
图3-3:
超声波测距发送单元
图3-4:
超声波测距接收单元
由于反射回来的超声波信号非常微弱,所以接收电路需要将其进行放大。
接收电路如图3-4所示。
接收到的信号加TL084的两级放大器上进行放大。
每级放大器的放大倍数为100倍。
放大的信号经过高低通两段滤波,使波形该接收电路结构简单,性能较好,制作难度小。
2.3显示电路
本系统采用三位一体LCD显示所测距离值,如图3-6。
显示电路采用简单实用的LCD1602液晶显示,输出端口为单片机的P2口,位码输出端口分别为单片机的P3.5、P3.6、P3.7口。
图3-5:
显示单元
3.1主程序设计
超声波测距的软件设计主要由主程序、超声波发生子程序、超声波接收程序及显示子程序组成。
超声波测距的程序既有较复杂的计算(计算距离时),又要求精细计算程序运行时间(超声波测距时),所以控制程序可采用C语言编程。
主程序首先是对系统环境初始化,设定时器0为计数,设定时器1定时。
置位总中断允许位EA。
进行程序主程序后,进行定时测距判断,当测距标志位ec=1时,测量一次,程序设计中,超声波测距频度是4-5次/秒。
测距间隔中,整个程序主要进行循环显示测量结果。
当调用超声波测距子程序后,首先由单片机产生4个频率为38.46kHz超声波脉冲,加载的超声波发送头上。
超声波头发送完送超声波后,立即启动内部计时器T0进行计时,为了避免超声波从发射头直接传送到接收头引起的直射波触发,这时,单片机需要延时约1.5-2ms时间(这也就是超声波测距仪会有一个最小可测距离的原因,称之为盲区值)后,才启动对单片机P3.2脚的电平判断程序。
当检测到P3.2脚的电平由高转为低电平时,立即停止T0计时。
由于采用单片机采用的是12MHz的晶振,计时器每计一个数就是1μs,当超声波测距子程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按式
(2)计算,即可得被测物体与测距仪之间的距离。
设计时取15℃时的声速为340m/s则有:
d=(c×t)/2=172×T0/10000cm其中,T0为计数器T0的计算值。
测出距离后结果将以十进制BCD码方式送往LCD显示约0.5s,然后再发超声波脉冲重复测量过程
3.2程序流程图:
本次实训在设计中,力求能达到最基础的功能,系统性能的稳定,在此条件下在加强其测距的距离。
3.3程序清单:
Main.c:
#include
#include"Delay.h"
#include
#defineucharunsignedchar
#defineuintunsignedint
//#defineVELOCITY_30C3495
#defineLcd_PortP2//定义数据端口
enumstate_all{n1,n2,n3}state;
ucharaa[10]={'0','1','2','3','4','5','6','7','8','9'};
longintdistance=0;
sbitOutput=P1^0;//发射控制端口
sbitLcd_RS=P3^5;//定义和LCD的连接端口,写数据指令端口2.6
sbitLcd_RW=P3^6;//读写端口2.5
sbitLcd_E=P3^7;//使能端口2.4
sbitLcd_Busy=P2^7;//读忙端口
//bitflag;
//发射超声波
voidTrig_SuperSonic(void)
{
Output=1;
TR0=1;
Delayus(45);
Output=0;
Delayus(5);//
EX0=1;
}
//距离转换函数
voidMeasure_Distance(void)
{
longintl;
longinth,y;
l=TL0;
h=TH0;
y=(h<<8)+l;
TL0=0x00;
TH0=0x00;
Delayus(20);
//distance=(int)(y*17/100);//mm
distance=(int)(y*340*80/200000);//mm310y*340*100/200000测80cm,200cm校准
}
//外部中断
voidExt0(void)interrupt0
{
TR0=0;
EX0=0;
//flag=1;
//Output=0;
}
//定时器初始化函数
voidInit_MCU(void)
{
TMOD=0x01;//定时器0初始化,设置为16位自动重装模式
TL0=0x00;
TH0=0x00;//1ms定时
ET0=1;//开定时器0
EA=1;//总中断使能
//TF0=1;
IT0=0;//
}
//初始化清零
voidInit_Parameter(void)
{
TL0=0x00;
TH0=0x00;
EX0=0;
}
//读忙信号判断
voidRead_Busy(void)
{
uchark=255;
Lcd_Port=0xff;
Lcd_RS=0;
Lcd_RW=1;
Lcd_E=1;
while((k--)&&(Lcd_Busy));
Lcd_E=0;
}
//写指令函数
voidWrite_Comm(uintlcdcomm)
{
Read_Busy();//先读忙
Lcd_RS=0;//端口定义为写指令
Lcd_RW=0;//端口写入使能
Lcd_E=1;//端口输入总使能
Lcd_Port=lcdcomm;//数据端送指令
Lcd_E=0;//端口输入总禁止
}
//写数据函数
voidWrite_Chr(uintlcddata)
{
Read_Busy();//先读忙
Lcd_RS=1;//端口写数据使能
Lcd_RW=0;//端口写入使能
Lcd_E=1;//端口总输入使能
Lcd_Port=lcddata;//数据端口送数据
Lcd_E=0;//端口总输入禁止
}
//初始化LCD
voidInit_LCD(void)
{
Delayms
(2);//稍微延时,等待LCD进入工作状态
Write_Comm(0x38);//8位2行5*8
Write_Comm(0x0c);//显示开/关,光标开闪烁开
Write_Comm(0x01);//清显示
Write_Comm(0x06);//文字不动,光标右移
Write_Comm(0x02);//光标归位
}
voidTimer0(void)interrupt1using1
{
TR0=0;//
EX0=0;//
//set=1;
TH0=0X00;
TL0=0X00;
}
voidmain(void)
{
Delayms(10);
Init_MCU();//定时器初始化
Init_LCD();//lcd初始化
distance=0;
Write_Comm(0x80);//确定显示位置,第1行第3列
Write_Chr(aa[distance/1000]);//m
Write_Chr('.');
Write_Chr(aa[distance/100%10]);//dm
Write_Chr(aa[distance%100/10]);//cm
Write_Chr(aa[distance%10]);//mm
Write_Chr('m');
state=n1;
while
(1)
{
Write_Comm(0x80);//确定显示位置,第1行第3列
Write_Chr('0');
Write_Chr(aa[distance/1000]);
Write_Chr('.');
Write_Chr(aa[distance/100%10]);
Write_Chr(aa[distance%100/10]);
Write_Chr(aa[distance%10]);
Write_Chr('m');
Delayms(100);//LCD刷新时间10090
switch(state)
{
casen1:
//等待状态
Init_Parameter();//清零
state=n2;
break;
casen2:
Trig_SuperSonic();//发射超声波
state=n3;
break;
casen3:
Delayms(10);
Measure_Distance();//有接收到,就显示出距离,没有就显示0
state=n1;
Delayms(200);
break;
}
}
}
延时程序
#include"reg52.h"
#defineucharunsignedchar
//1ms延时函数,
voidDelayms(ucharms)
{
uchari;
while(ms--!
=0)
for(i=0;i<125;i++)
;
}
//1us延时函数
voidDelayus(ucharus)
{
while(us--!
=0);
}