毕设2 c8051f020超声波测距及显示 语音报警.docx
《毕设2 c8051f020超声波测距及显示 语音报警.docx》由会员分享,可在线阅读,更多相关《毕设2 c8051f020超声波测距及显示 语音报警.docx(18页珍藏版)》请在冰豆网上搜索。
![毕设2 c8051f020超声波测距及显示 语音报警.docx](https://file1.bdocx.com/fileroot1/2023-2/2/00babb52-d97f-4307-963d-1a5c89ea7767/00babb52-d97f-4307-963d-1a5c89ea77671.gif)
毕设2c8051f020超声波测距及显示语音报警
5调试
5.1硬件调试
由于本设计涉及的模块比较多,包括了超声波测距模块,单片机模块,显示模块、语音报警模块,所以调试起来比较费力,设计的不定因素也比较多,所以,调试的时候采用了分块调试的方法,排除了各个模块的干扰。
在电路安装完毕后,不要急于通电测试,而首先必须做好以下调试前的检查工作。
检查连线情况:
经常碰到的有错接(即连线的一端正确,而另一端误接)、少接(指安装时漏接的线)及多接(指在电路上完全是多余的连线),等连线错误。
检查连线可以直接对照电路原理图进行,但若电路中布线较多,则可以以元器件(如运放、三极管)为中心,依次检察查其引脚的有关连线,这样不仅可以查出错接或少接的线,而且也较易发现多余的线。
为确保连线的可靠,在查线的同时,还可以用万用表电阻档对接线作连通检查,而且最好在器件外引线处测量,这样有可能查出某些“虚焊”的隐患。
检查元器件安装情况:
元器件的检查,重点要查集成运放、三极管、二极管、电解电容等外引线与极性有否接错,以及外引线间有否短路,同时还须检查元器件焊接处是否可靠。
这里需要指出,在焊接前,必须对元器件进行检测,确保元器件能正常工作,以免给调试带来不必要的麻烦。
检查电源输入端与公共接地端间有否短路在通电前,还需用万用表检查电源输入端与地之间是否存短路,若有则须进一步检查其原因。
在完成了以上各项检查并确认无误后,才可通电调试,但此时应注意电源的正、负极性不能接反。
5.2软件调试
KeilC
C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。
C语言有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。
C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。
此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。
因此,使用C语言进行程序设计已成为软件开发的一个主流。
用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。
所以作为一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基本的C语言编程。
使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。
KEILuVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
因此本系统采用KEILuVISION2进行软件的编写和调试
调试过程
把烧录好的芯片放置在电路中,接上电源,检验程序是否如自己所设计的那样可以实现所要求的功能。
如果电路板上的结果和设想的不同,由于在硬件检查部分已经确定了硬件没问题。
则应该是软件部分即程序方面的问题。
需要检查程序。
首先检查红外接收部分,用示波器检查红外接收管的输出口或是INT0口的波形是否正确。
红外接收部分没有问题后再调试电机部分,看电机是否能按照遥控要求那样转动。
然后是超声波部分,主要看数码管的现实是否正常,还有就是控制按钮是否按要求控制。
因为前面已经确定硬件没有问题了,所以,在软件调试的时候可以结合硬件来在线调试,这样很直观,而且发现问题也很容易。
6结论
本设计所有过程都是以单片机为核心的数字控制系统,在超声波传感器进行测距中,测量信号和测量距离的运算都是依靠单片机来完成;从而使系统的运行大大提高了可靠性和稳定性。
在开发上采用软硬件结合,减少了很多硬件的开发,大大降低了开发成本和硬件电路的复杂性。
论文概述汽车防撞报警器设计基本要求和目的、超声波原理及应用,在设计中对方案进行了论证及确定,逐一分析个模块的硬件功能和软件编写设计综合实现系统的功能及要求。
比较遗憾的是因个人能力问题,系统的反应比较迟钝,需进一步优化。
在本次设计中,碰到了许多问题和困难,但经过认真思考,仔细分析具体情况最终解决了大部分问题。
在此过程中自己对各种仪器的使用方法都的到了重新认识,特别是对Keil和proteus软件更进一步熟悉。
通过本次毕业设计把以前很多不懂得,忘了的东西重新温习了,加强了自己的动手能力以及综合运用知识的能力。
附录A
系统总原理图:
附录B
源程序:
#include
#include"delay.h"
#include"isd4004.h"
#defineSYSCLK22118400//SYSCLKfrequencyinHz
#defineBAUDRATE9600//BaudrateofUARTinbps
#defineMAX_LEN10//receivebufMAXlength
ucharaddl[]={0x00,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0x00,0x20};
ucharaddh[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01};
ucharreadCounts=0,Counts=0;
uchartrdata[MAX_LEN]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//发送暂存缓冲区
uchartrdata1[16]={"xianshiJL:
0000mm"};
sbitrs=P3^0;//43
sbitrw=P3^1;//42
sbite=P3^2;//41
sbitBeepIO=P3^5;//蜂鸣器控制脚
sbitSS=P1^0;//片选
sbitMOSI=P1^1;//数据输入
sbitMISO=P1^2;//数据输出
sbitSCLK=P1^3;//ISD4004时钟
sbitLED=P1^7;//指示灯
//-------------------------------------------------------------------
//函数声明
//-------------------------------------------------------------------
voidSYSCLK_Init(void);
voidPORT_Init(void);
voidUART0_Init(void);
voidSend_Char(ucharch);
voidsend_string_com(unsignedchar*str,unsignedintstrlen);
voiddelay_10us(intn)
{
charm;
intj;
for(j=0;jfor(m=0;m<30;m++);//Wait10us
}
voiddelay1us(ucharc)//误差-0.005353009259us
{
uchara,b;
for(b=c;b>0;b--)
for(a=8;a>0;a--);
}
voiddelay1ms(uchard)//误差-0.018084490741us
{
uchara,b,c;
while(d--)
for(c=5;c>0;c--)
for(b=68;b>0;b--)
for(a=31;a>0;a--);
}
voidwrite_comd(unsignedcharcom)
{
e=0;
rs=0;
rw=0;
P5=com;
delay_10us
(1);
e=0;
delay_10us
(2);
e=1;
}
voidwrite_word(unsignedcharword)
{
e=0;
rs=1;
rw=0;
P5=word;
delay_10us
(1);
e=0;
delay_10us(5);
e=1;
}
voidInit_lcd(void)
{
delay_10us(4500);
write_comd(0x38);
delay_10us(1500);
write_comd(0x38);
delay_10us(1500);
write_comd(0x38);
delay_10us(500);
write_comd(0x38);
delay_10us(500);
write_comd(0x08);
delay_10us(500);
write_comd(0x01);
delay_10us(500);
write_comd(0x06);
delay_10us(500);
write_comd(0x0c);
delay_10us(500);
}
ucharsave(ucharreceve)
{
uchartrans=0;
switch(receve)
{
case0:
trans='0';break;
case1:
trans='1';break;
case2:
trans='2';break;
case3:
trans='3';break;
case4:
trans='4';break;
case5:
trans='5';break;
case6:
trans='6';break;
case7:
trans='7';break;
case8:
trans='8';break;
case9:
trans='9';break;
}
return(trans);
}
voidisd_send(ucharisdx)//spi串行发送子程序,8位数据
{
ucharcounter;
SS=0;//ss=0,打开spi通信端
SCLK=0;
for(counter=0;counter<8;counter++)//先发低位再发高位,依次发送。
{
if((isdx&0x01)==1)
MOSI=1;
else
MOSI=0;
isdx=isdx>>1;
SCLK=1;
delay1us
(1);
SCLK=0;
delay1us
(2);
}
}
voidisd_powerup()//发送上电指令
{
delay1us(10);
SS=0;
isd_send(0x20);
SS=1;
delay1ms(50);
}
voidisd_play()//发送play指令
{
LED=0;
isd_send(0xf0);
SS=1;
}
voidisd_setplay(unsignedcharadl,unsignedcharadh)//发送setplay指令
{
delay1ms
(1);
isd_send(adl);//发送放音起始地址低位
delay1us
(2);
isd_send(adh);//发送放音起始地址高位
delay1us
(2);
isd_send(0xe0);//发送setplay指令字节
SS=1;
}
//-------------------------------------------------------------------
//主函数
//-------------------------------------------------------------------
voidmain(void)
{
uchardatah=0,datal=0,dataq=0,datab=0,datas=0,datag=0;
uchari=0,j=0;
uintsdata=0,sdatah=0,sdatal=0;
WDTCN=0xde;
WDTCN=0xad;//关闭WDT
SYSCLK_Init();
PORT_Init();
UART0_Init();
Init_lcd();
EA=1;
ES0=1;
do
{
Send_Char(0x55);
if(Counts==10)
{
Counts=0;
for(i=0;i<10;i+=2)
{
sdatah+=trdata[i];
sdatal+=trdata[i+1];
}
datah=sdatah/5;
datal=sdatal/5;
sdata=datah*256+datal;
dataq=sdata/1000;
datab=sdata/100%10;
datas=sdata/10%10;
datag=sdata%10;
trdata1[10]=save(dataq);
trdata1[11]=save(datab);
trdata1[12]=save(datas);
trdata1[13]=save(datag);
write_comd(0x80);
delay_10us(9000);
for(j=0;j<16;j++)
{
write_word(trdata1[j]);
delay_10us(90);
}
isd_powerup();
isd_setplay(addl[dataq],addh[dataq]);
isd_play();
delay1ms(200);
isd_powerup();
isd_setplay(addl[datab],addh[datab]);
isd_play();
delay1ms(200);
isd_powerup();
isd_setplay(addl[datas],addh[datas]);
isd_play();
delay1ms(200);
isd_powerup();
isd_setplay(addl[datag],addh[datag]);
isd_play();
delay1ms(200);
sdatah=0;
sdatal=0;
}
//delay1ms(230);
}while
(1);
}
//-----------------------------------------------------------------------------
//系统时钟配置
//-----------------------------------------------------------------------------
voidSYSCLK_Init(void)
{
//OSCICN=0x87;//使用内部时钟16M
//while((OSCICN&0x10)==0);//内部时钟按设定频率运行
inti=0;//delaycounter
OSCXCN=0x67;//startexternaloscillatorwith
//22.1184MHzcrystal
for(i=0;i<256;i++);//Waitforosc.tostartup
while(!
(OSCXCN&0x80));//Waitforcrystalosc.tosettle
OSCICN=0x88;//selectexternaloscillatorasSYSCLK
//sourceandenablemissingclock
//detector
}
//-----------------------------------------------------------------------------
//I/O配置
//-----------------------------------------------------------------------------
voidPORT_Init()
{
XBR0=0x04;//允许UART0,RX,TX连到2个端口引脚.XBR0=0000,0100
XBR1=0x00;
XBR2=0x40;//交*开关使能
P0MDOUT|=0x01;/*使能TX0作为推挽输出*/
P1MDOUT=0xFF;
P3MDOUT=0xFF;
P74OUT=0x0C;
//P0MDOUT|=0x03;//P0.0为推拉方式输出,即TX0,RX0所在的端口0000,0011
//P1MDOUT|=0x40;//P1.6为推拉方式输出,即LED所在的端口0100,0000
}
//-----------------------------------------------------------------------------
//串口初始化
//-----------------------------------------------------------------------------
voidUART0_Init(void)
{
SCON0=0x50;//SCON0:
mode1,8-bitUART,enableRX
TMOD=0x20;//TMOD:
timer1,mode2,8-bitreload
TH1=0xB8;//setTimer1reloadvalueforbaudrate
TR1=1;//startTimer1
CKCON|=0x10;//Timer1usesSYSCLKastimebase
}
//-------------------------------------------------------------------
//发送单个字符
//-------------------------------------------------------------------
voidSend_Char(ucharch)
{
SBUF0=ch;//送入缓冲区
while(TI0==0);//等待发送完毕
TI0=0;//软件清零
}
//-------------------------------------------------------------------
//UART0中断服务程序.接收字符
//-------------------------------------------------------------------
voidUART0_ISR(void)interrupt4using1
{
ucharrxch;
if(RI0)//中断标志RI0=1数据完整接收
{
RI0=0;//软件清零
rxch=SBUF0;//读缓冲
if(readCounts==10)readCounts=0;
trdata[readCounts]=rxch;//存入数组,供发送
readCounts++;
Counts++;
}
}
参考文献
[1]陆化普,史其信﹒智能交通系统研究发展动向与启示﹒科技导报,1996﹒第10期
[2]朱红讯﹒现代汽车电器电子设备修理全书﹒沈阳:
辽宁科学技术出版社,1996﹒96
[3]于万海﹒汽车电器设备原理与检修﹒北京:
电子工业出版社,2005﹒60
[4]谢兴盛,方勇文,吴云峰﹒汽车自适应驰控装置中的红外激光测距﹒激光技术﹒2004﹒05
[5]潘仲明,简盈,王跃科﹒大作用距离超声传感技术研究﹒传感技术学报﹒2006﹒01
[6]杨斌虎,谢克明,杜艳生﹒基于DSP芯片的超声波测距系统﹒太原理工大学学报﹒2004﹒02
[7]丹亚,陈德池﹒计算机控制汽车安全语音提示系统﹒汽车电器﹒1999﹒03
[8]钟勇,姚剑锋﹒现代汽车的四种测距方法﹒汽车工业研究﹒2001﹒02
[9]孟立凡,蓝金辉﹒传感器原理与应用﹒北京:
电子工业出版社,2007﹒195
[10]胡建恺,张谦琳﹒超声检测原理和方法﹒合肥:
科学技术出版社,1993﹒136
[11]李朝青﹒单片机原理及其接口技术﹒北京:
北京航空航天大学出版社,2006﹒17
[12]潘琢金,施国君﹒C8051f高速SOC单片机原理及其应用﹒北京:
北京航空航天大学出版社,2002﹒20
[13]张毅,曹丽等﹒自动检测技术及仪表控制系统﹒北京:
化学工艺出版社,2011﹒265
[14]张晔,王玉民﹒单片机应用技术﹒北京:
高等教育出版社,2006﹒85
[15]华成英,童诗白﹒模拟电子技术基础﹒北京:
高等教育出版社,2006﹒575
[16]毕满清﹒模拟电子技术基础﹒北京:
电子工业出版社,2008﹒261
[17]韩焱﹒数字电子技术基础﹒北京:
电子工业出版社,2009﹒291
[18]刘朝阳,张丽红﹒电路原理导论﹒北京:
电子工业出版社,2008﹒143
[19]StefanKocis,ZdenkoFigura﹒UltrasonicMeasurementsandTechnologies﹒Springer,1996
[20]Han-WayHuan﹒UsingtheMCS-51Micrpcontroller[Hardcover]﹒Oxford
UniversityPress,1999
致谢
首先,我要感谢我的指导老师xx在毕业设计中对我给予的细心指导和严格要求,同时也感谢本校的一些老师在毕业设计期间所给予我得帮助。
在我毕业论文写作期间,各位老师给我提供了种种专业知识上的指导和日常生活上的关怀,没有您们这样的帮助和关怀,我不会这么顺利的完成毕业设计,借此机会,向您们表示由衷的感激。
同时还要感谢院实验室在毕业设计期间提供给我们优越的实验条件。
接着,我要感谢和我一起做毕业设计的同学。
在毕业设计的短短4个月里,你们给我提出很多宝贵的意见,给了我不少帮助还有工作上的支持,在此也真诚的谢谢你们。
同时,我还要感谢我的寝室同学和身边的朋友,正是在这样一个团结友爱,相互促进的环境中,在和他们的相互帮助和启发中,才有我今天的