演讲限时器单片机设计_第1页
演讲限时器单片机设计_第2页
演讲限时器单片机设计_第3页
演讲限时器单片机设计_第4页
演讲限时器单片机设计_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图4-1软件设计框图4.2程序设计流程图开始开始系统初始化按键扫描S1S2S3S4S5启动正计时计数据暂停计时设置秒设置秒显示时间00.00~59.59蜂鸣结束图4-2程序流程图

5系统调试与结果分析5.1硬件调试硬件调试是利用基本测试仪器检查系统硬件是否存在问题,主要是对单片机外围器件以及整个硬件系统进行检测。硬件调试主要是对系统显示模块、系统按键模块、硬件系统整体进行调试。5.1.1系统显示模块调试对显示模块的测试,主要是为了验证电源模块是否能会出现一些短路或者其他的现象。测试步骤具体如下:第一步:通过肉眼观察线路板的焊接状况。进行相应的判断,是否会出现一些短路或者断路。第二步:接通系统的电源。此时,显示屏会亮。第三步:通过按键的功能不同进行调试。观察显示显示屏是否随着不同的功能显示数字不同,如果可以实现变化,就说明设计是合理可靠的。5.1.2系统按键模块调试对系统按键模块的测试步骤具体如下:第一步:重复的检测电路的完整性。及时焊好在检测中出现短路或者断路情况的地方。第二步:接通系统的电源。此时,功率放大器应该不发出任何声音。第三步:按下开始计时按键,观察显示屏是否会随着按键的按下而数字变化,如果显示屏的数字等间隔增大,则证明系统按键模块是正确的。5.1.3系统整体调试为了让系统的功能更加的完善,主要对以下内容进行调试:第一步:按键按下观察是否可以正常的显示数字;第二步:观察芯片的引脚是否对应正确;第三步:当倒计时为零时检查是否会出现蜂鸣声;第四步:验证电源模块是否能会出现一些短路或者其他的现象。5.1.4设计出现的问题在演讲限时器的设计中,出现了几个问题以及解决方法如下:在设计上蜂鸣器的响度不够,声音有时存在时断时续现象。问题分析:本设计中的USB与充电宝接触不良,因而导致蜂鸣器声响不一致。出现单片机的程序运行出现卡死的情况。问题分析:在单片机进入中断之后,没有及时进行中断的退出,因而导致程序发生错乱的情况。5.2软件调试软件调试采用单步式的执行每一句程序,选择设置断点的方法来控制程序运行的速度,可以比较直观地查看当前程序调试的具体数值。这样可以直观地体验到软件调试的过程,比自己一句一句地读代码更容易让人理解。当程序运行结果与期望值不符的时候,可以通过多次的调试,定位到具体语句或者操作中出现问题的地方,进而针对性的分析出现问题的原因,可以达到快速解决的目的。此外,软件调试用了keil软件进行软件仿真,进一步提高设计的合理性。在演讲限时器的软件设计中,为了让设计更加的合理可靠,需要采用protelse99进行画原理图,生成网络表之后再转PCB图。本系统采用keil软件对软件进行调试仿真,以达到更清晰的对设计进行仿真调试。也就是说,通过对程序的连接,以及程序的执行来发现存在的程序中的语法错误和逻辑错误,并加修正。通过keil软件进行仿真之后,大大的减少了本设计过程中出现的逻辑错误。keil软件仿真界面如图5-1。图5-1keil软件仿真界面

结束语本系统总体设计相对比较简单,性能相对比较稳定。经过反复检测,本系统硬件设备基本满足设计需求;软件设计也能够配合硬件设备连接实现本系统功能;在功能上,基本实现当显示模块倒计时至零时,提示模块蜂鸣器响5声等功能。在整个硬件设计构思过程中,通过查阅STC89C51单片机相关的资料,深入了解了限时设计的基本原理,以及单片机的工作基本原理等等。渐渐地在稿纸上构思出了能够实现本设计硬件电路功能的各个部分电路的组成结构。在完成系统设计的框架后,根据实际要求进行手动组装电路,在原材料的选取中,我本着以实现设计功能的原则之上,以成本为选取标准。在软件设计过程中,首先采用PROTELSE99软件对整个硬件系统原理图进行绘制,生成网络表之后再进行PCB图的转换,这里在PCB图布线的过程中遇到了很多问题,比如线段交叉等。但是进过与专业学习成绩好的同学交流后,终于布线成功了。其次采用C语言进行编写程序。虽然在编译中出现很多错误,但是经过自己翻阅相关书籍并仔细研究、上网搜索其错误原因,最后总算是编译成功了。最后运用keil软件进行设计仿真,刚开始接触这个软件,操作不是很娴熟,查阅该软件的相关资料及看过网上的视频后,慢慢的接触后发现这个仿真软件并没有自己想象的那么难。在软、硬件较完美的结合之后,则需要进行检测并加以调试到最佳工作状态。其中主要是检测,当本系统通电后是否可以正常工作。此外,还希望在实现功能的基础之上让本系统更新升级。比如,怎么实现缩小电路板的面积,采用印刷电路板,提高其实用性、可靠性等等。在第一次检测时,蜂鸣器模块就出现异常,虽然这个异常让我感觉有点意外,用了排除法进行仔细检查并尝试对应的解决办法之后,终于解决了这个问题。经过层层检测,本毕业设计总算实现了各大模块的正常工作。在论文的撰写过程中,本人也是通过查阅大量的相关资料,借鉴他人撰写论文报告的格式,不断地探索并尝试,如何才能把自己的设计用文字的方式表达出来。在参照多份相关报告和设置之后,最后采用“先硬再软”的论文格式来介绍,即先介绍硬件模块设计,再结合硬件分析介绍软件的设计。本论文重点解说了两个大的问题,一是系统可靠性的问题;二是硬件选材的成本问题。经过不断的查阅相关专业术语的表述和修改,发现自己的文字功底和言语表达能力有了一定的提升。通过本次毕业设计和毕业论文的撰写,获益良多。实践是最有具高度,也是最能检验整体知识水平的过程。比如,设计一个硬件电路图,不仅需要掌握keil软件的相关操作,还要熟练掌握其电路图的基本原理,以及设计的相关注意事项。此外,还有设计中如何能使硬件电路图简单明了,程序简单而准确;如何在运行中出现的错误进行分析并纠正等等,都是需要经过自己的独立思考、再手动研究夹加上反复实践摸索出来的。由于没有进行相应的单片机开发经验,在程序编写过程中对我来说是比较棘手的事。通过自己的不断自学,终于顺利的完成了大学的最后一课,即毕业设计和毕业论文。参考文献[1]彭伟.单片机C语言程序设计实训100例[M].北京:电子工业出版社,2009.[2]李全利.单片机原理及接口技术(第二版)[M].北京:高等教育出版社,2009.[3]张刚毅.单片机原理及应用(第二版)[M].北京:高等教育出版社,2010.[4]宋国富主编.单片机技能与实训[M].北京:电子工业出版社,2010年2月.[5]谢维成.单片机原理与应用及C51程序设计(第二版)[M].北京:清华大学出版社,2009.[6]杜文洁,王晓红.单片机原理及应用案例教程.北京:清华大学出版社,2012.[7]及力.Protel99SE原理图与PCB设计教程[M].北京:电子工业出版社,2007.8.附录1原理图:

附录2PCB图

附件3飞线说明图

附录4C程序://包含头文件#include<reg52.h>//宏定义#defineucunsignedchar#defineuiunsignedintvoiddisplay();//声明显示函数uccodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //数字对应显示码表uccodetab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的数字码表uccodeindex[]={0xef,0xdf,0xbf,0x7f};//每位数字对应数码管显示位置ucnum[8];//num【0】-num【3】是计时用数组,4-7是范围计时用(设置10s,计时到10秒报警)ucval[10][4];//存储的记录[10]为记录序列,[4]为每组记录中的数字charval_index;//记录序列标志位ucset_index,ok_flag,timing;//set_index:设置的位。ok_flag:设置状态标志,=0时是正常状态,=1是设置状态。timing:显示状态标志:=0正常显示,=1闪烁设置位bitmode=1;//运行模式,1为正向计数,0为反向计数。bitfin_flag=0;//完成标志位,当反向计数结束时,此位为高电平,触发蜂鸣器bitset_shan;sbitbeep=P3^2; //蜂鸣器sbitkey1=P3^3; //开始停止计时数据sbitkey2=P3^4; //记录按钮/设置位置加sbitkey3=P3^5; //复位sbitkey4=P3^6; //模式切换sbitkey5=P3^7; //设置按钮voiddelay(uiz) //延时函数,大约延时zms{ uii,j; for(i=0;i<z;i++) for(j=0;j<121;j++);}voidinit() //初始化{ TMOD=0x11; //工作方式 TH0=0x3c; TL0=0xb0; //定时器0赋初值 TH1=0x3c; TL1=0xb0; //定时器1赋初值 ET1=1; //允许中断 TR1=1; //定时开关 ET0=1; TR0=0; EA=1; //中断总开关 val_index=0; //清零}voidclr() //清除函数{ uci; for(i=0;i<8;i++) //将存储的数据清零 for循环8次 num[i]=0;}voidsetup() //设置函数{ ok_flag=0xff; //ok_flag赋值1 set_index=0; //设置位置0 while(ok_flag) //进入设置后,循环,直到ok_flag为0 { display(); //调用显示函数 if(key1==0) //按动KEY1设置值加1 { delay(5);//延时去抖 if(key1==0)//再次判断按键是否按下 { if((set_index==0)|(set_index==2)|(set_index==4)|(set_index==6))//设置个位数据时 { num[set_index]++; //数据加 if(num[set_index]==10) //加到10 num[set_index]=0; //清零 } elseif((set_index==1)|(set_index==3)|(set_index==5)|(set_index==7))//设置十位数据时 { num[set_index]++; //数据加 if(num[set_index]==6) //加到6时 num[set_index]=0; //清零 } while(!key1)display(); //按键释放 } } if(key2==0) //按动KEY2设置位置加1 { delay(5);//延时去抖 if(key2==0)//再次按下按键 { set_index++;//设置位置加 if(set_index==8)//设置位置加到最后一位时 { set_index=0;//设置位置到0 } while(!key2)display();//按键释放 } } if(key5==0) //按动KEY5设置结束 { delay(5);//延时去抖 if(key5==0)//再次判断按键是否按下 { ok_flag=0x00;//ok_flag清零 if((num[4]!=0)||(num[5]!=0)||(num[6]!=0)||(num[7]!=0))//如果计时时间上限设置数据不都为0时 { num[0]=0;num[1]=0;num[2]=0;num[3]=0;mode=1;//将正计时时间清零,Mode置1,正计时 } elseif((num[4]==0)&&(num[5]==0)&&(num[6]==0)&&(num[7]==0))//如果计时时间上限设置数据都为0时 { if((num[0]==0)&&(num[1]==0)&&(num[2]==0)&&(num[3]==0))//判断计时时间都为0 mode=1; //正计时模式 elseif((num[0]!=0)||(num[1]!=0)||(num[2]!=0)||(num[3]!=0))//判断计时时间有不为0 mode=0; //倒计时模式 } while(!key5)display(); //按键去抖 } } }}voiddisplay(){ uci; if(ok_flag!=0xff) //不是设置状态时 { if(timing==0) { for(i=0;i<4;i++) { P0=0xff; //清显示 P2=index[i]; //选中位 if(i==2) //如果是第二位时 P0=tab1[num[i]];//显示有小数点的数据 else //不是第二位时 P0=tab[num[i]]; //正常显示数据 delay(2); //修改此参数可修改刷新频率 } } else //设置时闪烁相应位 { if(set_shan==0) { for(i=0;i<4;i++) { P0=0xff; P2=index[i]; P0=tab[10]; //熄灭 delay(2); //修改此参数可修改刷新频率 } } elseif(set_shan==1) { //点亮显示 for(i=0;i<4;i++) { P0=0xff; P2=index[i]; if(i==2) P0=tab1[num[i]]; else P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 } } } } else //设置时 { if(set_shan==0) { if(set_index==0) //设置不同位时,闪烁相应位 { for(i=0;i<4;i++) { if(i==0) { P2=index[0]; P0=tab[10]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } else { P2=index[i]; if(i==2) P0=tab1[num[i]]; else P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } } } elseif(set_index==1) { for(i=0;i<4;i++) { if(i==1) { P2=index[1]; P0=tab[10]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } else { P2=index[i]; P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } } } elseif(set_index==2) { for(i=0;i<4;i++) { if(i==2) { P2=index[2]; P0=tab[10]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } else { P2=index[i]; if(i==2) P0=tab1[num[i]]; else P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } } } elseif(set_index==3) { for(i=0;i<4;i++) { if(i==3) { P2=index[3]; P0=tab[10]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } else { P2=index[i]; if(i==2) P0=tab1[num[i]]; else P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } } } elseif(set_index==4) { for(i=4;i<8;i++) { if(i==4) { P2=index[0]; P0=tab[10]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } else { P2=index[i-4]; if(i==6) P0=tab1[num[i]]; else P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } } } elseif(set_index==5) { for(i=4;i<8;i++) { if(i==5) { P2=index[1]; P0=tab[10]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } else { P2=index[i-4]; if(i==6) P0=tab1[num[i]]; else P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } } } elseif(set_index==6) { for(i=4;i<8;i++) { if(i==6) { P2=index[2]; P0=tab[10]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } else { P2=index[i-4]; if(i==6) P0=tab1[num[i]]; else P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } } } elseif(set_index==7) { for(i=4;i<8;i++) { if(i==7) { P2=index[3]; P0=tab[10]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } else { P2=index[i-4]; if(i==6) P0=tab1[num[i]]; else P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } } } } else { if(set_index<4) { for(i=0;i<4;i++) { P2=index[i]; if(i==2) P0=tab1[num[i]]; else P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } } else { for(i=4;i<8;i++) { P2=index[i-4]; if(i==6) P0=tab1[num[i]]; else P0=tab[num[i]]; delay(2); //修改此参数可修改刷新频率 P0=0xff; } } } }}voidalarm(){ if((num[4]==0)&&(num[5]==0)&&(num[6]==0)&&(num[7]==0)) //计时时间到0时 {timing=0;} //开始报警 else { if((num[4]==num[0])&&(num[6]==num[2])&&(num[5]==num[1])&&(num[7]==num[3]))//设置上限模式时,计时时间到 {timing=1;TR0=0;} //停止计时,并闪烁显示 }}voidmain(){ uch,g,k; init(); clr(); while(1) { display(); //刷屏显示数码管 alarm(); if(key1==0) //开始/暂停按钮 { delay(5); if(key1==0) { TR0=~TR0; while(!key1)display(); } } if(key2==0) //记录按钮 { delay(5); if(key2==0) { if(TR0==1)//当在运行中按下记录键则存储记录 { for(g=1;g<10;g++) { for(k=0;k<4;k++) { val[g-1][k]=val[g][k]; //低位存储的数据向高位移一位 } } for(h=0;h<4;h++) { val[9][h]=num[h];//将当前时间存储 } } else//在停止状态下按下记录键查看记录,按动一次序列递减一次,即查看上一次记录 { for(h=0;h<4;h++) num[h]=val[val_index][h];//将当前时间存储 val_index--; if(val_index<0) val_index=9; } while(!key2)display(); //按键释放 } } if(key3==0) //复位按钮 { delay(5); if(key3==0) { clr(); //将数据清零 while(!key3)display(); //按键释放 } } if((key4==0)&&(TR0==0)) //模式选择按钮,仅在停止状态下有效 { delay(5); if(key4==0) { mode=~mode; //正计时倒计时切换 while(!key4)display(); } } if((key5==0)&&(TR0==0)) //时间设置,仅在停止状态下有效 { delay(5); if(key5==0) { while(!key5) display(); setup(); //调用设置函数 } } }}voidT0_time()interrupt1{ ucm; TH0=0x3c; //12M晶振定时器定时时间为50ms TL0=0xb0; m++; if(m==20) {

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论