9创新实践实训报告学院信息电子技术学院专业电子信息工程班级14学籍号姓名指导教师蒋野2017年06月29日单片机控制秒表电路一、电路工作原理1.工作原理用STC89C52设计一个2位的LED数码显示作为“秒表”:显示时间为00—99秒,每秒自动加1,另设计一个“暂停”键S2和一个“继续”键S3。为使本设计系统更加完善,可以引入一个“复位”键S1,以方便对系统的控制。如图。本系统采用STC89C51单片机为中心器件,利用其定时器/计数器定时计数的原理,结合硬件电路如电源电路,晶振电路,复位电路和显示电路,以及一些按键电路等来设计计数器,将软硬件有机结合起来,其中软件系统采用汇编语言编写程序,包括显示程序,计数程序,中断,硬件系统利用Protues强大的功能来实现,简单易于观察,在仿真中就可以观察到实际的工作状态。XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52C130pFC230pFX112MR110kC310uFR210k2.元器件作用(1)STC89C52单片机在电子行业中有着广泛的应用。AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,STC89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。(2)时钟电路作用是为电路提供唯一的时钟信号。(3)复位电路外接一个开关,控制电路复位,接通电源电路直接复位,如果没有开关亦可将复位电路引出导线接电源后断开。(4)本设计要求使用共阳极的数码管,如下是共阳极的数码管的0-9编码:0xc0,0x92,0x82,0xf8,0x80,0x90,0xf9,0xa4,0xb0,0x99.(5)控制电路:S2按下电路停止计时,S3按下电路恢复计时。二、程序流程图主程序流程图开始显示“00”开启中断,并允许T1,T2中断TH1、TL1初始化每隔1秒开始计数按键S2T1停止暂停计数S3T2恢复恢复计数三、检测安装与调试1.元件检测序号名称型号(标称值)测量值误差备注1电阻1K78022%2电阻10K10.780.07%3电容33pF323%4电容10uF910%5晶振12M12M0共阳极数码管检测管脚序号利用万用表二极管档红表笔接一个抵住两个管脚,利用另一个接触其他,找出1,2两个管脚,继续分别找出A,D,C,D,E,F,G,Dp管脚。2.安装(1)首先固定好元件,先固定单片机,以单片机为中心安装其他小件,电解电容需要注意不要贴在电路板上,放置短路。将电解电容贴近单片机减少影响。合理运用电路板,保证节省空间,导线明了。(2)按照proteus仿真电路连接电路图。3.调试(1)安装好后,接通电源,电路没有反应,数码管不亮。(2)检查电路:利用万用表蜂鸣档来检测电路的通断,发现几处空焊,补焊完成。(3)二次接通电源,电路依然不工作。(4)复查电路:重新检测电路,利用万用表电流档,检测电路电流,发现电路无电流,检查40引脚VCC,发现单片机40引脚与插座短路,接触不良导致,陆续检查其他引脚。发现还有部分引脚短路。(5)继续检查电路,直至数码管显示数字为止。结果显示,秒表运行正常。按照预期实现了99s计时、暂停以及继续的功能。至此,秒表设计、制作、仿真及调试工作就全部完成了。4.电路工作电流和关键点电压检测序号名称数值(mA)数值(V)备注1电路工作电流2852EA电压-4.83R1电压-0.00474XTAL1-2.015XTAL2-2.02二、问题与解决如图可以看出利用两个数码管,首次焊接没有检测数码管器件为共阴极数码管,与设计程序不符,导致乱码,而后改接电路,重新安装共阳极数码管。单片机与排座接触不良,解决方法:利用废弃的二极管的管脚,插入排座排孔,增大接触面积。附件1.利用单片机完成一定的任务,你的创意(创新)是什么?我的创意就是电路的布局,实验操作起来与仿真不同,需要注意很多细节,例如原件检测。我的电路布局既节省空间,又不影响电路结构。2.程序#includereg52.hsbitW=P1^4;sbitH=P1^6;unsignedcharmsec,sec;voiddelay(unsignedchari){unsignedintj,k;for(k=0;ki;k++)for(j=0;j255;j++);}voidTo_INT(void)interrupt1{TH0=0x3c;TL0=0xb0;msec++;if(msec==20){msec=0;sec++;if(sec==100){sec=0;}}}voidmain(){unsignedcharled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};TMOD=0x01;TH0=0x3C;TL0=0xb0;EA=1;ET0=1;TR0=1;while(1){if(W==0){TR0=1;}if(H==0){TR0=0;}P2=0x02;P0=led[sec%10];delay(10);P2=0x01;P0=led[sec/10];delay(10);}}