单片机课程设计之超声波测距 电子工程系单片机课程设计报告Word格式.docx
《单片机课程设计之超声波测距 电子工程系单片机课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计之超声波测距 电子工程系单片机课程设计报告Word格式.docx(26页珍藏版)》请在冰点文库上搜索。
8、实物拍摄..........................................................................................................23
九、参考文献..........................................................................................................25
一、功能要求
超声波测距器可应用于汽车倒车。
建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度、物体厚度等的测量。
其测量范围为0.10~4.00m,测量精度为1cm。
测量时与被测物体无直接接触,能够清晰、稳定地显示测量结果。
二、方案论证
由于超声波指向性强,能量消耗慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。
利用超声波检测距离设计比较方便,计算处理也比较简单,并且在测量精度方面也能达到使用的要求。
超声波发生器可以分为两大类:
一类是使用电气方式产生超声波;
另一类是用机械方式产生超声波。
电气方式包括电压型、电动型等;
机械方式有加尔统笛、液哨和气流旋笛等。
它们所产生的超声波的频率、功率和声波各不相同,因而用途也各不相同。
目前在近距离测量方面较为常用的是压电式超声波换能器。
根据设计要求并综合各方面因素,本例决定采用AT89C52单片机作为主控器,用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器完成。
超声波测距器系统设计框图如下:
三、系统硬件电路设计
硬件电路主要分为以下三个部分:
1.单片机系统及显示电路
单片机采用89C51或其兼容系列。
系统采用12MHZ高精度的晶振,以获得较稳定的时钟频率,并减小测量误差。
单片机用P1.0端口输出超声波换能器所需的40kHz方波信号,利用外中断0口监测超声波接收电路输出的返回信号。
显示电路采用简单实用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP三极管驱动。
单片机系统及显示电路如图:
LED的工作原理:
四位共阳LED的一边是段选端,一边是位选端。
同名段选端各自相连,然后7位段选端口接到P0口,位选端接到P2口。
通过位选可以控制每一个LED亮,通过段选端可以控制LED亮什么,其中段选端还要接上拉电阻,其作用是为了保证LED能够点亮。
在位选端加一个高电压,段选端加一个低电压,那么再加上上拉电阻的作用,便可以保证LED的两端形成一个压差,这样LED就点亮了。
2.超声波发射电路
超声波发射电路原理图如下图。
发射电路主要由反向器74LS04和超声波换能器构成,单片机P1.0端口输出的40kHz方波信号一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极,用这种推挽形式将方波信号加到超声波换能器两端可以提高超声波的发射速度。
输出端采用两个反向器并联,用以提高驱动能力。
两个上拉电阻一方面可以提高反向器74LS04输出高电平的驱动能力;
另一方面可以增加超声波换能器的阻尼效果,以缩短其自由振荡的时间。
超声波换能器的工作原理
压电式超声波换能器是利用压电晶体的谐振来工作的。
超声波换能器内部结构如下图所示,它有两个压电晶片和一个共振板。
当它的两极加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动产生超声波,这时它是一个超声波发生器;
反之,如果两极间未加外电压,当共振板接收道超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成
为超声波接收换能器了。
超声波发射换能器与接收换能器在结构上稍有不同,使用时应分清器件上的标志。
超声波发射换能器上标有字母T,而接收换能器上标有字母R。
超声波换能器结构图
3.超声波检测接收电路
集成电路CX20106A是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。
考虑到红外遥控常用的载波频率38kHz与测距的超声波频率40kHz较为接近,可以利用它制作超声波检测接收电路,如图所示。
实验证明,用CX20106A接收超声波(无信号的输出高电平)具有很高的灵敏度和较强的抗干扰能力。
适当地更改电容C4的大小,可以改变接收电路的灵敏度和抗干扰能力。
超声波检测接收电路
四、系统程序的设计
超声波测距器的软件设计主要由主程序、超声波程序发生子程序、超声波接收中断程序及显示子程序组成。
由于C语言程序有利于实现较复杂的算法,汇编语言程序则具有较高的效率并且容易精确计算程序运行的时间,而超声波测距器的程序既有较复杂的计算(计算距离时),又要求精确计算程序运行时间(超声波测距时),所以控制程序可采用C语言和汇编语言混合编程。
下面对超声波测距器的算法。
1.超声波测距器的算法设计
距离计算公式:
d=s/2=(vt)/2
其中d是被测物与测距器的距离;
s是超声波的来回路程,v是超声波在当前温度下的速度,t是发送和接收超声波所经历的时间。
超声波测距器原理图
2.主程序算法设计
主程序首先要对系统环境初始化,设置定时器工作模式为16位定时、计数器模式,置位总中断允许位EA并对显示端口P0和P2清0;
然后调用超声波发生子程序送出一个超声波脉冲。
为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延迟0.1ms后才打开外中断0,接收返回的超声波信号。
由于采用12MHZ晶振,计数器每记一个数就是1us,取20℃时的超声波传输速度v=344m/s,则d=(vt)/2=344t/2=(172T0/106)m=(172T0/10000)cm
其中T0为中断T0的计数值。
测出距离后,结果以十进制BCD码方式送往LED显示约0.5S,然后再发出超声波脉冲重复测量。
主程序流程图如下:
3.超声波发生子程序和超声波接收中断程序
超声波发生子程序的作用是通过P1.0端口发送两个左右的超声波脉冲信号(频率约40KHZ的方波),脉冲宽度为12us左右,同时把计数器T0打开进行计时。
超声波发生子程序较简单,但要求程序运行时间准确,所以采用汇编语言程序编程。
超声波测距主程序利用外中断0检测返回超声波信号,一旦接收到返回的超声波信号(即INT0引脚出现低电平),立即进入超声波接收中断程序。
进入该中断后,就立即关闭计时器T0,停止计时,并将测距成功标志字赋1。
如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2,表示本次测距不成功。
源程序代码:
#include<
AT89X51.H>
intrins.h>
/***************************
数码管为共阳数码管
***************************/
sbits0=P2^7;
//个位选通
sbits1=P2^6;
//十位选通
sbits2=P2^5;
//百位选通
sbits3=P2^4;
//千位选通
sbitdp=P0^7;
//小数点
sbitin=P3^2;
//外部中断,接CX20106的脚
sbitcsb=P3^3;
//40KHz方波输出脚
#definesegP0//数码管的数据口为P1口
#defineucharunsignedchar
#defineuintunsignedint
#definenop_nop_()
/****************************/
voidinit(void);
//初始化
voiddelay_nms(uintn);
//延时nms
voiddelay100us();
//延时us
voiddisplay(uintdat);
//4位数码管显示函数,只用了位
voidtran(void);
//超声波测量函数
/***************************/
uintdis,H=100,L=0;
ucharflag=0,high_time,low_time,m=0;
ucharleddata[]={
0x00,//"
0"
0x01,//"
1"
0x02,//"
2"
0x03,//"
3"
0x04,//"
4"
5"
0x06,//"
6"
0x07,//"
7"
0x08,//"
8"
0x09,//"
9"
0x0A,//"
A"
0x0B,//"
B"
0x0C,//"
C"
0x0D,//"
D"
0x0F,//"
E"
0x10,//"
F"
0x11,//"
H"
0x12,//"
L"
0x13,//"
n"
0x14,//"
u"
0x15,//"
P"
0x16,//"
o"
0x17,//"
-"
0x00,//熄灭
0x00//自定义
};
voiddelay100us()
{
uchari;
for(i=0;
i<
50;
i++)
;
}
/**********************************
函数名称:
主函数
修改日期:
入口参数:
无
返回值:
无
**********************************/
voidmain(void)
s0=1;
s1=1;
s2=1;
s3=1;
seg=0;
init();
while
(1)//循环测量并显示
tran();
//发送超声波信号测距
display(dis);
//显示距离
初始化函数
voidinit(void)
TMOD=0x01;
//定时器方式用于计时
TH0=0;
TL0=0;
/*设定T0的工作模式为*/
EA=1;
IT0=1;
//下降沿有效,左传感器
延时函数
n
voiddelay_nms(uintn)
uchari;
while(n--)
for(i=123;
i>
0;
i--);
显示函数
data
voiddisplay(uintdat)
uchari,j,k;
//分别为百十个位的缓存
i=dat/100;
//百位
j=dat%100/10;
//十位
k=dat%100%10;
//个位
s3=0;
s1=0;
s0=0;
seg=leddata[i];
dp=0;
delay_nms
(2);
dp=1;
s2=0;
seg=leddata[j];
s0=1;
seg=leddata[k];
超声波测量函数
voidtran(void)
floattemp;
//清定时
TR0=1;
//开定时
for(i=8;
i--)
csb=!
csb;
nop;
csb=1;
delay_nms
(1);
EX0=1;
//开中断
if(flag==1)//中断标志位置,说明有回波
{//以下为路程计算
temp=high_time*256+low_time;
temp=(temp/1000)/2;
temp*=344;
temp=temp/10;
dis=(unsignedint)temp;
flag=0;
中断函数
voidTT()interrupt0
uinttmp;
TR0=0;
//关定时器
ET0=0;
//关外部中断
flag=1;
//置位标志位
tmp=TH0*256+TL0;
//读取定时器的值
if((tmp>
0)&
&
(tmp<
60000))//判断是否超出范围,此设置的范围为到米,实际不能达到米
high_time=TH0;
//把计时值放入缓冲
low_time=TL0;
else//超出范围则重新测量
high_time=0;
low_time=0;
}
8、遇到的问题以及解决办法
1.当把硬件电路连接好后,接到电源,发现LED灯不亮。
LED灯不亮的原因有以下几个:
1).单片机不工作
2).LED显示模块的硬件电路设计有问题
3).LED显示模块的硬件电路连线有问题
故障排查:
1).单片机不工作。
先检查AT89C52单片机的电源线和地线是否接好,发现接线无误。
再看晶振电路是否工作,仔细检查发现晶振有一个引脚接错,改正后发现,通电后晶振一端出现50HZ的正弦波,且ALE端出现方波,表示单片机正常工作。
LED可以显示了,但是显示全部是8888。
解决办法:
软件仿真
在LED显示模块的proteus仿真文件中添加如下程序代码的hex文件,仿真后可以看到LED被点亮。
LED模块调试代码
ORG0000H
AJMP0030H
ORG0030H
MOVP2,#00H;
P2端全部送低电平,经过三极管9012后,位选端为高电平
MOVP0,#00H;
P0端全部送低电平,段选全部为低电平,使LED全部点亮
END
由于单片机正常工作后,4位共阳LED能够全部点亮;
而且LED显示模块的软件仿真成功,说明LED显示模块的硬件电路连线没有问题。
至此,LED显示模块的故障被排除。
2.LED全部显示8888的问题
把HEX程序烧进单片机后,连接电源,发现LED全部显示8888。
可能是P0口没有接上拉电阻(上拉电阻的阻值一般在1K-10K之间)。
因为“从P0口输出时,必须外接上拉电阻才能有高电平输出。
”(见单片机课本p20)。
如果P0口不接上拉电阻,那么段选一直是低电平,而采用的是数码管的动态扫描,看上去,位选端相当于一直高电平,即:
数码管一直点亮。
因此,如果LED全部显示8888,那么在P0口加上上拉电阻或许可以解决问题。
前后分别做了两个板子,第一个板子出现LED全部显示8888的问题,再加上电路布线不够合理,不够美观,于是换了一块板子重新焊接。
但是第2块板子焊好后,又发现单片机不能正常工作了。
检查别人正常电路上的单片机的晶体振荡器,观察晶振两个脚上的波形,发现其中一个脚上是50HZ的正弦波,另一个脚上出现类似正弦波的波形,但是有少量谐波成分。
但是检查我们自己的晶振,发现一端是50HZ的正弦波,但是另一端出现无规律的杂波,另外ALE端也没有出现方波。
P1.0口(输出到超声波发射电路)也没有输出40KHZ的方波。
说明单片机没有正常工作。
3.晶振不能正常工作的问题
接线时,尽量使晶振电路靠近单片机。
晶振正常工作时,一端可以检测到50HZ的正弦波,另一端类似正弦波,但是有少量的谐波成分。
4.复位电路
LED不能正常显示,可能是复位电路出问题。
如果复位开关一直导通,则LED可能不亮。
检查复位开关是否短路即可。
9、总结
1.遇到不懂的问题,应该虚心向别人请教。
2.不要盲目相信课本。
例如,书上的原理图上P0口没有接上拉电阻,而实际上P0口一般都要接上拉电阻。
本实验中,P0口不接上拉电阻的后果是LED一直显示8888。
另外,书上说可以用74LS244驱动LED的断码,而74LS244芯片在本实验中的作用就是输入等于输出,并没有用到锁存功能,所以为了简化电路,可以省掉74LS244。
3接线应该细心。
特别是一些芯片的电源线和地线容易出问题。
4.多调试。
包括软件调试和硬件调试。
如果一个功能模块电路出现问题,先用软件仿真,看看电路设计是否有误;
若无误,则检查硬件电路的连线是否有问题;
如果没有问题,再进行硬件仿真,看看是不是程序的问题。
一个模块一个模块地排查,就可以发现错误。
5.如果多次检查仍不能解决问题,也不要盲目地换电路,重头开始。
耐心地调试,一步一步排查错误,总能找到问题的症结;
不仅最后能解决问题,还能学到很多实际操作的方法和经验,这都是在课本上学不到的。
七、仿真结果
9、实物拍摄
参考文献
[1]胡萍.计算机与现代化[J].第10期超声波测距仪的研制,2003.10
[2]时德刚,刘哗.计算机测量与控制[J].第7卷超声波测距的研究.2002.10
[3]华兵.MCS-51单片机原理应用[M].武汉:
武汉华中科技大学出版社,2002.5
[4]李华.MCU-51系列单片机实用接口技术[M].北京:
北京航空航天大学出版社,1993.6
[5]陈光东.单片机微型计算机原理与接口技术(第二版)[M].武汉:
华中