吳鑒鷹:
第二講:吳鑒鷹單片機(jī)實(shí)戰(zhàn)精講之?dāng)?shù)字電子鐘的設(shè)計(jì)(一)——源代碼介紹 /*******************************************************程序:吳鑒鷹數(shù)字電子鐘的設(shè)計(jì)**這一講的主要內(nèi)容:數(shù)字電子鐘的設(shè)計(jì)原理和程序**功能描述:**輸 入:**內(nèi)容:**輸 出:****全局變量:**調(diào)用模塊:****作 者:吳鑒鷹**日 期:14.02.17備注:有什么錯(cuò)誤的地方,歡迎各大燒友指正O(∩_∩)O~*******************************************************///變量定義和頭文件的調(diào)用//定義頭文件和各個(gè)輸入管腳以及變量聲明#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};//顯示的緩存數(shù)組,依次為低位、高位uchardataCLOCK[4]={0,0,0,0};uchardataSECOND[2]={0,0};/*定義運(yùn)行狀態(tài)*/uchardataSTATE=0;/*STATE=0;秒表*//*STATE=4,或者7,時(shí)鐘運(yùn)行*//*STATE=6,時(shí)鐘時(shí)調(diào)整*/bitbdataSND=0;/*秒表START(開始)*/bitbdataRST=0;/*秒表RESET(復(fù)位)*//*數(shù)碼管顯示編碼“0”-“9”,"A","-"*/ucharcodeTABLE[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X40};/*******************************************************程序:主程序**功能描述:主干程序**輸 入:**內(nèi)容:**輸 出:****全局變量:**調(diào)用模塊:****作 者:吳鑒鷹**日 期:14.02.17備注:有什么錯(cuò)誤的地方,歡迎各大燒友指正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];}}//顯示函數(shù)display();K0=1;K1=1;K2=1;STATE=P1&0X07;}stabak=STATE;}}/*******************************************************程序:子函數(shù)(1):timer0(void)**功能描述:用定時(shí)器0實(shí)現(xiàn)24小時(shí)的時(shí)鐘顯示**輸 入:**內(nèi)容:**輸 出:****全局變量:**調(diào)用模塊:****作 者:吳鑒鷹**日 期:14.02.17備注:有什么錯(cuò)誤的地方,歡迎各大燒友指正O(∩_∩)O~*******************************************************/voidtimer0(void)interrupt1using1{/*重置定時(shí)器初值*/TH0=-5000/256;TL0=-5000%256;/*定時(shí)器處理*/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;}}}}}/*******************************************************程序:子函數(shù)(2):intsvr1(void)**功能描述:對外中斷1的按鍵脈沖進(jìn)行判斷和計(jì)數(shù),并完成對應(yīng)的時(shí)間調(diào)整功能。**輸 入:**內(nèi)容:**輸 出:****全局變量:**調(diào)用模塊:****作 者:吳鑒鷹**日 期:14.02.17備注:有什么錯(cuò)誤的地方,歡迎各大燒友指正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;}}/*******************************************************程序:子函數(shù)(3):display(void)**功能描述:用動態(tài)顯示的方法,將當(dāng)前的時(shí)間或秒表內(nèi)容通過數(shù)碼管顯示。**輸 入:**內(nèi)容:**輸 出:****全局變量:**調(diào)用模塊:****作 者:吳鑒鷹**日 期:14.02.17備注:有什么錯(cuò)誤的地方,歡迎各大燒友指正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;}}