智能超声波测距仪项目设计学士学位论文Word格式.doc
《智能超声波测距仪项目设计学士学位论文Word格式.doc》由会员分享,可在线阅读,更多相关《智能超声波测距仪项目设计学士学位论文Word格式.doc(33页珍藏版)》请在冰点文库上搜索。
![智能超声波测距仪项目设计学士学位论文Word格式.doc](https://file1.bingdoc.com/fileroot1/2023-4/29/01c58e11-08b5-4776-9f89-5f38aa7aa610/01c58e11-08b5-4776-9f89-5f38aa7aa6101.gif)
2、确定论文提纲,查阅资料:
2012年11月—2012年12月;
3、形成初稿:
2012年12月—2013年2月;
4、形成修订稿:
2013年2月—2013年3月;
5、形成论文定稿:
2013年4月。
指导教师意见:
指导教师(签名):
年月日
开题报告专家论证意见:
专家组长(签名):
摘要
各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。
在此基础上设计了系统的总体的方案,最后通过硬件和软件实现了各个功能模块。
相关部分附有硬件电路、程序流程图。
关键词:
stc8925;
微型化液晶显示;
语音播报超声波;
设计
Abstract
ThisdesignadoptstheSTC8952single-chipmicrocomputerasthecoreoflowcost,miniaturization,liquidcrystaldisplayandspeechbroadcasthardwarecircuitandsoftwaredesignmethodofultrasonicrangefinder.ThewholecircuitUSESmodulardesign,themainprogram,thepresetsubroutine,launchsubroutines,receivesubroutineanddisplaysubroutinemodules.TheprobesignalbySCMcomprehensiveanalysisprocessing,realizethefunctionsofultrasonicrangefinder.Onthebasisoftheoverallschemeofthesystemisdesigned,finally,realizedthefunctionofhardwareandsoftwaremodules.Relevantpartswithhardwarecircuit,programflowchart.
Keywords:
stc8925;
MiniaturizationLCDdisplay;
Speechultrasound;
design
目录
1引言 1
2.设计要求、内容及组织形式 2
2.1设计要求 2
2.2设计内容 2
2.3工作原理 2
2.4组织形式 4
2.4.1设计软、硬件方案 4
3超声波的发射电路及电路原理 5
3.1发射电路 5
3.2显示电路原理 5
3.2.1超声波监测接收电路 6
3.2.2语音转换输出电路 7
4软件结构设计及源代码 8
4.1软件流程图 8
4.2程序源代码 8
5.设计进度安排 23
6.总结 24
参考文献 25
1引言
利用STC89C52单片机实现超声波测距。
通过超声波放射装置发射超声波遇物体反射回来再由接收装置接收处理。
利用声波在空气中的传输速度和整个收发延时计算出距离。
为了满足智能化、无接触距离测量要求,自主研制了一种性价比高、体积小的智能超声波测距仪,该测距仪以STC89C52单片机为控制核心,本文给出其具体实现方案。
本文设计的一种超声波测距仪,其最大特点是测量的液面与感应元件之间非接触。
超声波是指频率大于20KHz,并且能够在连续介质中传播的弹性机械波,超声波方向性较好,经过专门设计可定向的发射,遇到界面时将发生反射、折射以及波形的改变,超声波在空气中的传播速度为334m/s(常温下)。
利用超声波在介质中传播时,这些好的物理特性进行设计,使得超声波在测距中的灵活性、精确度大幅提高。
2.设计要求、内容及组织形式
2.1设计要求
(1)学会焊接单片机系统板和驱动板并且连接驱动板与系统板间的连线。
(2)用超声波测离障碍物的距离,经过单片机处理判断是否是安全范围根据距离的长短分为安全、注意、危险。
(3)每采集一次信号LED灯闪烁一次表示采集成功。
(4)把采集的数据经单片机处理用12864液晶显示器显示出来,和语音模块处理用耳机输出提示距离情况。
2.2设计内容
本文所设计的超声波测距仪主要由AT89C52单片机、超声波发射电路、超声波接收放大电路、显示电路、语音播报电路。
首先由单片机驱动产生11.0592晶振,由超声破发射探头发送出去,在遇到障碍物反射回来时由超声破接收探头检测到信号,然后经过滤波、放大、整形之后送入单片机进行计算,把计算结果输出到液晶显示屏上。
2.3工作原理
声波在介质中传播被定义为纵波。
当声波受到尺寸大于其波长的目标物体挡住时即会发生反射;
反射波被称为回声。
假如声波在介质中传播的速度是提前知道的,而且声波从声音的发生源到达目标,而返回声源的时间可以通过测量得到,那么就可以计算出从声波到目标地距离。
这就是本设计的测量原理,见式(2-1):
L=½
vt(2-1)
上式中,L为待测距离,v(m/s)为超声波在空气中的速度,t为往返时间。
由于超声波在空气中的传播速度与温度T(单位:
摄氏度)有如下关系,见式(2-2)
v=331.45+0.61T(2-2)
在平常温度下,温度每当变化1摄氏度,超声波的速度变化0.6m/s。
所以可以通过测温电路测量出当前温度,计算出超声波在当前温度下的传输速度。
通常声速随温度的变化会比较大,因此产生的测量误差也会比较大,所以若是所在环境中温度变化较大的环境下进行测量时,需要考虑声速补偿地问题。
时间t可以通过脉冲计数的方法间接测量,相当于将时间转化为对计数脉冲个数N的测量,假设计数脉冲的频率为f,则公式
(1)可写成见式(2-3)
L=Nv½
f(2-3)
电路原理图如图2-1所示:
图2-1超声波测距驱动板原理
2.4组织形式
2.4.1设计软、硬件方案
(1)硬件结构设计
首先单片机发出振荡频率再整形再由超声波发射器发出出超声波经物体反射回来。
接收器接收超声波信号再放大整形传入门控电路。
单片机处理再显示输出。
硬件结构设计图如图2-2所示:
图2-2硬件结构设计图
3超声波的发射电路及电路原理
3.1发射电路
超声波的发射电路原理图如下所示。
发生电路主要是由反相器74HC04和超声波的换能器T构成,单片机P3.3端口输出40KHZ方波信号一路经一级反相器后送到超声波换能器的一个电极,另一路经两级的反相器后送到超声波换能的另一个电极。
通过这种推挽形式将方波的信号加到超声波换能器两端,可以提高超声波的发射强度。
输出端则采用两个反相器并联,用以提高驱动能力的上拉电阻R1、R2一方面则可以提高反相器74HC04输出高电平的驱动能力,另一方面可以加强超声波换能的阻尼效果缩短振荡的时间。
超声波发射的电路如图3-1所示:
图3-1超声波发射电路
3.2显示电路原理
通过单片机的P0.0——P0.7、RST、P3.0——P3.7、X1、X2、GND与跳线帽连接控制液晶显示器的显示。
12864液晶显示器可显示32个汉字或64个字母可满足要求输出的内容。
显示电路的原理图如图3-2所示:
图3-2显示电路原理图
3.2.1超声波监测接收电路
集成电路CX20103A是一种红外线检波接收的专用芯片,常用在电视红外遥控接收器上。
本设计利用它制作超声波接收电路。
实验证明用CX20106A接收超声波具有很高的灵敏度和较高的抗干扰能力。
超声波监测接收电路如图3-3所示:
图3-3超声波监测接收电路
3.2.2语音转换输出电路
由单片机P3.4引脚为语音芯片WT558D-16提供数据再经过处理输出音频信号。
语音转换输出电路如图3-4所示:
图3-4语音转换输出电路图
4软件结构设计及源代码
4.1软件流程图
软件流程图如图4-1所示:
图4-1软件流程图
4.2程序源代码
程序源代码如下:
/***************************************
函数名:
floatDistance_count()
功能:
距离计算函数
****************************************/
{
floattemp;
temp=high_time*256+low_time;
temp=(temp*10/9216)/2;
temp*=speed;
returntemp;
}
voidtran(),voidtran1(),voidtran2()
超声波的发射
voidtran()
uchari;
TH0=0;
TL0=0;
TR0=1;
for(i=4;
i>
0;
i--)
{
csb=!
csb;
nop;
}
csb=1;
delay_ms
(2);
EX1=1;
delay_ms(30);
if(flag==1)
{
distance=Distance_count();
dis=(ulong)distance;
flag=0;
elsedis=0;
voidtran1()
for(i=8;
distance=Distance_count();
dis=(unsignedlong)distance;
flag=0;
}
voidtran2()
for(i=16;
delay_ms(40);
{
}
elsedis=0;
voiddis_all(ulongdis_s)
控制LED指示灯和语音播报
show(dis_s);
if(dis_s>
2000)
show_one(DIS4,2);
if(flag_2!
=1)
{
send_oneline(12);
//安全距离
delay_nms(50);
while(!
busy);
}
flag_2=1;
else
if((dis_s>
500)&
(dis_s<
1000))
{
show_one(DIS5,2);
if(flag_2!
=2)
{
send_oneline(14);
//保持距离
delay_nms(50);
while(!
}
flag_2=2;
else
{
if((dis_s>
100)&
500))
{
show_one(DIS6,2);
if(flag_2!
=3)
{
send_oneline(15);
//请注意
delay_nms(50);
while(!
send_oneline(13);
//危险距离
delay_nms(50);
while(!
}
flag_2=3;
}
else
{
show_one(DIS8,2);
}
}
voidmain(void)
主函数
****************************************/
{
ulongdatatime;
uchari,j;
P1=0xff;
P2=0xff;
TMOD=0x01;
EA=1;
IE=0x80;
displayall();
while
(1)
lcd_pos(4,0);
//设置显示位置为第三行
for(i=0;
i<
16;
i++)
{
write(1,DIS10[i]);
//lcd_wdat(DIS3[i]);
delay
(2);
for(i=0;
3;
i++)
{
tran();
if(dis==0)
{
tran1();
if(dis==0)
{tran2();
dis=do_s(dis);
dis_4[i]=dis;
}
fit_1();
if(dis<
time)
{
if((time-dis)>
4000)time=time-1000;
else
{
if((time-dis)<
2500)time=dis;
elsetime=time-100;
}
}
time=dis;
dis_all(time);
if(tc_say==4)
soundplay(time);
tc_say=0;
temp_all();
}
tc_say++;
lcd_pos(1,6);
for(j=0;
j<
4;
j++)
write(1,space4[j]);
write(1,point4[j]);
delay(100);
voidTT()interrupt2
中断,产生脉冲
uinttemp;
TR0=0;
ET1=0;
flag=1;
temp=TH0*256+TL0;
if((temp>
0)&
&
(temp<
30000))
{
high_time=TH0;
low_time=TL0;
else
high_time=0;
low_time=0;
}
/*********************************************************
voidwrite()
写指令或数据函数
*********************************************************/
voidwrite(bitstart,ucharddata)
ucharstart_data,Hdata,Ldata;
if(start==0)//11111,(0),(0),0
start_data=0xf8;
//写指令
else//11111,(0),
(1),0
start_data=0xfa;
//写数据
Hdata=ddata&
0xf0;
//取高四位
Ldata=(ddata<
<
4)&
//取低四位
sendbyte(start_data);
//发送起始信号
delay_lcd
(1);
//延时
sendbyte(Hdata);
//发送高四位
sendbyte(Ldata);
//发送低四位
voidlcd_init()
初始化LCD
voidlcd_init()
delay_lcd(10);
//延时等待LCM进入工作状态
LCD_CS=1;
//片选高电平有效
write(0,0x30);
//基本指令操作
write(0,0x0c);
//显示打开,光标关,反白关
write(0,0x01);
//清屏,将DDRAM的地址计数器归零
write(0,0x06);
voiddisplayall()
主显示函数
uchari;
delay
(2);
lcd_init();
//初始化LCD
lcd_pos(2,0);
//设置显示位置为第二行
for(i