吴鉴鹰:
第二讲:吴鉴鹰单片机实战精讲之数字电子钟的设计(一)——源代码介绍 /*******************************************************程序:吴鉴鹰数字电子钟的设计**这一讲的主要内容:数字电子钟的设计原理和程序**功能描述:**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************///变量定义和头文件的调用//定义头文件和各个输入管脚以及变量声明#include#include#defineuintunsignedint#defineucharunsignedchar/*定义字型字位口*/#defineDIGPORTXBYTE[0X8000]#defineWORDPORTXBYTE[0X4000]/*定义P1口各管脚*/sbitK0=P1^0;sbitK1=P1^1;sbitK2=P1^2;sbitBEEP=P1^3;sbitL0=P1^4;sbitL1=P1^5sbitL2=P1^6;sbitL3=P1^7;uchardataBUFFER[2]={0,0};//显示的缓存数组,依次为低位、高位uchardataCLOCK[4]={0,0,0,0};uchardataSECOND[2]={0,0};/*定义运行状态*/uchardataSTATE=0;/*STATE=0;秒表*//*STATE=4,或者7,时钟运行*//*STATE=6,时钟时调整*/bitbdataSND=0;/*秒表START(开始)*/bitbdataRST=0;/*秒表RESET(复位)*//*数码管显示编码“0”-“9”,"A","-"*/ucharcodeTABLE[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X40};/*******************************************************程序:主程序**功能描述:主干程序**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voidmain(){ucharstabak;P1=0X0F;EA=1;IT1=1;ET0=1;TMOD=0X61;TH0=-5000/256;TL0=-5000%256;TH1=0XFF;TL1=0XFF;T2CON=0;TH2=-5000/256;TL2=-5000%256;K0=1;K1=1;K2=1;STATE=P1&0X07;stabak=STATE;for(;;){switch(STATE){case0:{EX1=0;ET1=1;ET2=1;TR1=1;SND=1;L1=1;L0=0;L2=0;SECOND[0]=0;SECOND[1]=0;}break;case5:{IE1=0;EX1=1;ET1=0;ET2=0;TR0=0;L0=1;L1=0;L2=0;}break;case6:{IE1=0;EX1=1;ET1=0;ET2=1;TR0=0;}break;default:{EX1=0;ET1=0;ET2=1;L1=0;L2=0;}}while(STATE==stabak){switch(STATE){case0:{BUFFER[0]=SECOND[0];BUFFER[1]=SECOND[1];}break;case5:{BUFFER[0]=CLOCK[2];BUFFER[1]=101;/*A-*/}break;case6:{BUFFER[0]=110;/*A-*/BUFFER[1]=CLOCK[3];}break;default:{BUFFER[0]=CLOCK[2];BUFFER[1]=CLOCK[3];}break;default:{BUFFER[0]=CLOCK[2];BUFFER[1]=CLOCK[3];}}//显示函数display();K0=1;K1=1;K2=1;STATE=P1&0X07;}stabak=STATE;}}/*******************************************************程序:子函数(1):timer0(void)**功能描述:用定时器0实现24小时的时钟显示**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voidtimer0(void)interrupt1using1{/*重置定时器初值*/TH0=-5000/256;TL0=-5000%256;/*定时器处理*/CLOCK[0]=CLOCK[0]+1;if((CLOCK[0]==50)&&(STATE>=4)){L0=!L0;}if(CLOCK[0]==100){if(STATE>=4)L0=!L0;CLOCK[0]=0;CLOCK[1]=CLOCK[1]+1;if(CLOCK[1]==60){CLOCK[1]=0;CLOCK[2]=CLOCK[2]+1;if(CLOCK[2]==60){CLOCK[2]==0;CLOCK[3]==CLOCK[3]+1;if(CLOCK[3]==24){CLOCK[3]=0;}}}}}/*******************************************************程序:子函数(2):intsvr1(void)**功能描述:对外中断1的按键脉冲进行判断和计数,并完成对应的时间调整功能。**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voidintsvr1(void)interrupt2using2{if(STATE==5){CLOCK[2]==CLOCK[2]+1;if(CLOCK[2]==60)CLOCK[2]==0;}if(STATE==6){CLOCK[3]==CLOCK[3]+1;if(CLOCK[3]==24)CLOCK[3]=0;}}/*******************************************************程序:子函数(3):display(void)**功能描述:用动态显示的方法,将当前的时间或秒表内容通过数码管显示。**输 入:**内容:**输 出:****全局变量:**调用模块:****作 者:吴鉴鹰**日 期:14.02.17备注:有什么错误的地方,欢迎各大烧友指正O(∩_∩)O~*******************************************************/voiddiplay(void){uchari;uchardelay;uchardisp;uchardigit;digit=0x08;for(i=0;i<2;i++){if(BUFFET>100){disp=BUFFER%10+10;}elsedisp=BUFFER%10;DIGPORT=digit;WORDPORT=TABLE[disp];for(delay=0;delay>1;disp=BUFFER/10;DIGPORT=digit;WORDPORT=TABLE[disp];for(delay=0;delay>1;}}