您好,欢迎访问三七文档
11、实训任务目的1.根据单片机课程所学内容,结合其他相关课程知识,设计电子秒表,以加深对单片机知识的理解,锻炼实践动手能力,为以后的毕业设计和工作打下坚实基础;2.熟悉汇编语言或C语言的程序设计方法,熟悉51系列单片机的使用;3.掌握单片机的内部功能模块的应用,如定时器/计数器、中断、I/O口、串行口通讯等功能;4.掌握单片机应用系统的软硬件设计过程、方法及实现。2、设计方案2.1系统总体设计方案使用STC89C52单片机作为核心控制部件,采用12M晶体振荡器及30PF微小电容构成振荡电路;用1个四位一体共阴极数码显示管作为显示部分,构成数字式秒表的主体结构,配合独立式键盘和复位电路完成此秒表的计时、清零、停止、增减初始时间等各项功能。2.2系统总体整体框图图2.2系统设计框图3、电路设计3.1硬件部分系统设计3.1.1电路原理图AT89C52单片机最小系统模块独立摁键控制模块4位数码管显示模块2图3.1.秒表计时器电路图1.时钟电路在XTAL1、XTAL2的引脚上外接定时元件(一个石英晶体和两个电容),内部振荡器便能产生自激振荡。在本设计中采用的12M的石英晶振。和晶振并联的两个电容的大小对振荡频率有微小影响,可以起到频率微调作用。当采用石英晶振时,电容可以在20~40pF之间选择。2.复位电路复位操作通常有两种基本形式:上电自动复位和开关复位。上电瞬间,电容两端电压不能突变,此时电容的负极和RESET相连,电压全部加在了电阻上,RESET的输入为高,芯片被复位。随之+5V电源给电容充电,电阻上的电压逐渐减小,最后约等于0,芯片正常工作。并联在电容的两端为复位按键,当复位按键没有被按下的时候电路实现上电复位,在芯片正常工作后,通过按下按键使RST管脚出现高电平达到手动复位的效果。3.EA/VPP(31脚)的功能和接法51单片机的EA/VPP(31脚)是内部和外部程序存储器的选择管脚。当EA保持高电平时,单片机访问内部程序存储器;对于现今的绝大部分单片机来说,其内部的程序存储器(一般为flash)容量都很大,因此基本上不需要外接程序存3储器,而是直接使用内部的存储器。4.P0口外接上拉电阻51单片机的P0端口为开漏输出,内部无上拉电阻。所以在当做普通I/O输出数据时,由于V2截止,输出级是漏极开路电路,要使“1”信号(即高电平)正常输出,必须外接上拉电阻。3.1.2数码管显示模块设计显示部分采用动态显示。数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的共阴极增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的位选通端,就使各个数码管轮流受控显示,这就是动态驱动。动态显示是利用人眼视觉暂留特性来实现显示的。事实上,显示器上任何时刻只有一个数码管有显示。由于各数码管轮流显示的时间间隔短、节奏快,人的眼睛反应不过来,因此看到的是连续显示的现象。为防止闪烁延时的时间在1ms左右,不能太长,也不能太短。3.1.3焊接过程的问题和解决办法因为对焊接技术的不熟练,所以在焊接的过程中也出现了一些问题。例如出现虚焊的问题。所谓虚焊,是指焊点处只有少量锡焊住,造成接触不良,时通时断。焊接时,应保证每个焊点焊接牢固、接触良好,锡点应光亮、圆滑无毛刺,锡量适中。锡和被焊物熔合牢固,不应有虚焊。为避免虚焊,应注意以下几点:(1)保证金属表面清洁:若焊件和焊点表面带有锈渍、污垢或氧化物,应在焊接之前用刀刮或砂纸磨,直至露出光亮金属,才能给焊件或焊点表面镀上锡。(2)掌握温度:为了使温度适当,应根据元器件大小选用功率合适的电烙铁,并注意掌握加热时间。若用功率小的电烙铁去焊接大型元器件或在金属底板上焊接地线,易形成虚焊。(3)上锡适量:根据所需焊点的大小来决定烙铁蘸取的锡量,使焊锡足够包裹4住被焊物,形成一个大小合适且圆滑的焊点。若一次上锡不够,可再补上,但须待前次上的锡一同被熔化后再移开电烙铁。(4)选用合适的助焊剂:助焊剂的作用是提高焊料的流动性,防止焊接面氧化,起到助焊和保护作用。焊接电子元器件时,应尽量避免使用焊锡膏。比较好的助焊剂是松香酒精溶液,焊接时,在被焊处滴上一点即可。3.2软件部分控制系统设计由P1口作为独立摁键信号的输入端控制时钟的加1s、减1s、复位60.0s等操作。用外部中断0作为秒表计时器的开启和暂停的操作。且所有摁键均为低电平有效。其中部分摁键为单刀双掷开关用于控制增计时或减计时以及限60.0s计时和60.0s外计时。3.2.1程序流程图图3.253.2.2程序设计秒表程序:#includereg52.h//#includeI2C_AT24C02.h#defineucharunsignedchar#defineuintunsignedint#defineN50000sbitkeyInc=P3^2;//按键+sbitkeyDec=P3^3;//按键-sbitkeyClear=P3^4;//按键清零sbitkeyPause=P3^5;//按键自增ucharTab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码表ucharTab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//个位段码表ucharcntDeci;//cntDeci为中断计数值uintdeciSec;//deciSec=10*秒数值,显示的数值//=======函数声明=======voiddelay1ms(uint);voidTimer_Init();voidDisplay(uint);voidKeyScan();//=======主函数=======voidmain(){Timer_Init();deciSec=0;6cntDeci=0;TR0=1;//开启定时器0while(1){Display(deciSec);KeyScan();}}/***************************延时1ms基准******************************************/voiddelay1ms(uinti){uinta,b,c;while(i--){for(c=0;c1;c++)//1ms基准延时程序12MHZ晶振for(b=0;b142;b++)for(a=0;a2;a++){;}}}/**************************************************************************************************数码管显示程序***********************************************/voidDisplay(uintx){7P0=Tab1[x%1000/100];//显示十位P2=0xfd;//P2.1引脚输出低电平,11111101delay1ms(1);P2=0xff;P0=Tab2[x%100/10];//显示个位P2=0xfb;//P2.2引脚输出低电平,11111011delay1ms(1);P2=0xff;P0=Tab1[x%10];//显示0.1位P2=0xf7;//P2.3引脚输出低电平,11110111delay1ms(1);P2=0xff;}//=======定时器初始化函数=======voidTimer_Init(){TMOD=0x01;//设置定时器0为工作方式10000TH0=(65536-N)/256;//装初值50ms一次中断TL0=(65536-N)%256;EA=1;//开总中断ET0=1;//开定时器0中断TF0=0;//溢出标志位清零TR0=0;//先不开启定时器0}//=======定时器中断服务函数=======voidTimer_Serv()interrupt1{8TH0=(65536-N)/256;//50ms中断一次TL0=(65536-N)%256;cntDeci++;if(cntDeci==2){cntDeci=0;deciSec=deciSec+1;//秒表加0.1sif(deciSec==599){deciSec=0;}}TF0=0;}//=======键盘扫描函数=======voidKeyScan(){if(keyInc==0&TR0==0){delay1ms(1);if(keyInc==0){deciSec+=10;if(deciSec599)//当到60s时重新归0deciSec=0;while(!keyInc);//等待按键释放}}if(keyDec==0&TR0==0){9delay1ms(1);if(keyDec==0){deciSec-=10;if(deciSec0)//当到0时重新归60sdeciSec=599;while(!keyDec);}}if(keyClear==0&TR0==0){delay1ms(1);if(keyClear==0){deciSec=0;//清0while(!keyClear);}}if(keyPause==0){delay1ms(1);if(keyPause==0){TR0=~TR0;//启动或停止定时器0while(!keyPause);}}}1060秒倒计时#includereg52.h//#includeI2C_AT24C02.h#defineucharunsignedchar#defineuintunsignedint#defineN5000sbitkeyInc=P3^2;//按键+sbitkeyDec=P3^3;//按键-sbitkeyClear=P3^4;//按键清零sbitkeyPause=P3^5;//按键自增ucharTab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码表ucharTab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//个位段码表ucharcntDeci;//cntDeci为中断计数值uintdeciSec;//deciSec=10*秒数值,显示的数值//=======函数声明=======voiddelay1ms(uint);voidTimer_Init();voidDisplay(uint);voidKeyScan();//=======主函数=======voidmain(){Timer_Init();deciSec=6000;cntDeci=0;11TR0=1;//开启定时器0while(1){Display(deciSec);KeyScan();}}/***************************延时1ms基准******************************************/voiddelay1ms(uinti){uinta,b,c;while(i--){for(c=0;c1;c++)//1ms基准延时程序12MHZ晶振for(b=0;b142;b++)for(a=0;a2;a++){;}}}/**************************************************************************************************数码管显示程序***********************************************/void
本文标题:秒表计时器设计报告
链接地址:https://www.777doc.com/doc-1826862 .html