吳鑒鷹:
第二講:吳鑒鷹單片機實戰精講之數字電子鐘的設計(一)——源代碼介紹 /*******************************************************程序:吳鑒鷹數字電子鐘的設計**這一講的主要內容:數字電子鐘的設計原理和程序**功能描述:**輸 入:**內容:**輸 出:****全局變量:**調用模塊:****作 者:吳鑒鷹**日 期: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;}}