一個鬧鐘的單片機程序。
其中蜂鳴器接P37,我的單片機數(shù)碼管是四位共陽數(shù)碼管,接P0和P2,K1接P14,K2接P15,K3接P16,K4接P17。晶振采用12MHz。STC89C52
代碼如下: //File: Clock.c #include <REGX52.H> const unsigned char LED7Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; unsigned int hour,minute,second,cHour,cMinute; bit isClick = 0; unsigned char modify =0x00;//是否處于時間編輯狀態(tài) bit isClock =0;//是否開啟鬧鐘 unsigned char timercount; void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; timercount++; if(timercount==20) { timercount=0; second++; if(second==60) { minute++; second=0; } if(minute==60) { hour++; minute=0; } if(hour==24) { hour=0; } } } //延遲 void Delay(unsigned int time) { unsigned char a,b; for(a=0;a<time;a++) for(b=0;b<120;b++); } //用于顯示時間 void ShowTime(void) { unsigned int a,b, tempH,tempM; unsigned char showChar; if(modify==0x00 || modify ==0x01 || modify ==0x02) { tempH=hour; tempM=minute; } else { tempH=cHour; tempM=cMinute; } if(modify==0x00 || modify ==0x01 || modify ==0x03) { //顯示第4個數(shù)碼管 P0=0xFF; P2=0xFF; a=tempH/10; showChar=LED7Code[a]; P0=showChar; P2_3=0x00; Delay(1);//延遲很短 //顯示第3個數(shù)碼管 P0=0xFF; P2=0xFF; b=tempH%10; showChar=LED7Code[b]; P2_2=0x00; P0=showChar; Delay(1);//延遲很短 } if(modify==0x00 || modify ==0x02 || modify ==0x04) { //顯示第2個數(shù)碼管 P0=0xFF; P2=0xFF; a=tempM/10; showChar=LED7Code[a]; P0=showChar; P2_1=0x00; Delay(1);//延遲很短 //顯示第1個數(shù)碼管 P0=0xFF; P2=0xFF; b=tempM%10; showChar=LED7Code[b]; P2_0=0x00; P0=showChar; Delay(1);//延遲很短 } } //蜂鳴器響 void Beep() { unsigned char i ; for (i=0 ;i<100 ;i++) { Delay(100) ; P3_7=!P3_7 ; //Beep取反 } P3_7=1 ; //關(guān)閉蜂鳴器 Delay(100); } void main(void) { unsigned int i; hour=12; minute=30; second=0; cHour=7; cMinute=0; TMOD=0x01; ET0=0x01;//定時器T0可以中斷 EA=0x01;//表示允許所有的中斷 TR0=0x01;//開始T0計時 while(1) { if(P1_4==0x00)//按下了K1鍵,增加小時或分鐘 { if(!isClick) { switch(modify) { case 0x01://調(diào)整小時 hour++; if(hour==24) hour=0; break; case 0x02://調(diào)整分鐘 minute++; if(minute==60) minute=0; break; case 0x03://調(diào)整鬧鐘的小時 cHour++; if(cHour==24) cHour=0; break; case 0x04://調(diào)整鬧鐘的分鐘 cMinute++; if(cMinute==60) cMinute=0; break; default: break; } isClick=1; } } else if(P1_5==0x00)//按下了K2鍵,減少小時或分鐘 { if(!isClick) { switch(modify) { case 0x01://調(diào)整時間的小時 if(hour==0) hour=23; else hour--; break; case 0x02://調(diào)整時間的分鐘 if(minute==0) minute=59; else minute--; break; case 0x03://調(diào)整鬧鐘的小時 if(cHour==0) cHour=23; else cHour--; break; case 0x04://調(diào)整鬧鐘的分鐘 if(cMinute==0) cMinute=59; else cMinute--; break; default: break; } isClick=1; } } else if(P1_6==0x00)//按下了K3鍵,更改模式,第一次修改小時,第二次修改分鐘,第三次恢復(fù) { if(!isClick) { switch(modify) { case 0x00://不是修改狀態(tài),調(diào)整小時 modify=0x01; break; case 0x01://調(diào)整分鐘 modify=0x02; break; case 0x02://調(diào)整鬧鐘的小時 modify=0x03; break; case 0x03://調(diào)整鬧鐘的分鐘 modify=0x04; break; case 0x04://不修改 modify=0x00; break; default: break; } isClick=1; } } else if(P1_7==0x00)//按下了K4鍵,開啟或關(guān)閉鬧鐘 { if(!isClick) { isClock=~isClock; isClick=1; } } else isClick=0; //鬧鐘是否響了 if(isClock) { if(hour==cHour && minute == cMinute) { Beep();//響 } } ShowTime(); } }