一个闹钟的单片机程序。
其中蜂鸣器接P37,我的单片机数码管是四位共阳数码管,接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;//是否处于时间编辑状态 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个数码管 P0=0xFF; P2=0xFF; a=tempH/10; showChar=LED7Code[a]; P0=showChar; P2_3=0x00; Delay(1);//延迟很短 //显示第3个数码管 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个数码管 P0=0xFF; P2=0xFF; a=tempM/10; showChar=LED7Code[a]; P0=showChar; P2_1=0x00; Delay(1);//延迟很短 //显示第1个数码管 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 ; //关闭蜂鸣器 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://调整小时 hour++; if(hour==24) hour=0; break; case 0x02://调整分钟 minute++; if(minute==60) minute=0; break; case 0x03://调整闹钟的小时 cHour++; if(cHour==24) cHour=0; break; case 0x04://调整闹钟的分钟 cMinute++; if(cMinute==60) cMinute=0; break; default: break; } isClick=1; } } else if(P1_5==0x00)//按下了K2键,减少小时或分钟 { if(!isClick) { switch(modify) { case 0x01://调整时间的小时 if(hour==0) hour=23; else hour--; break; case 0x02://调整时间的分钟 if(minute==0) minute=59; else minute--; break; case 0x03://调整闹钟的小时 if(cHour==0) cHour=23; else cHour--; break; case 0x04://调整闹钟的分钟 if(cMinute==0) cMinute=59; else cMinute--; break; default: break; } isClick=1; } } else if(P1_6==0x00)//按下了K3键,更改模式,第一次修改小时,第二次修改分钟,第三次恢复 { if(!isClick) { switch(modify) { case 0x00://不是修改状态,调整小时 modify=0x01; break; case 0x01://调整分钟 modify=0x02; break; case 0x02://调整闹钟的小时 modify=0x03; break; case 0x03://调整闹钟的分钟 modify=0x04; break; case 0x04://不修改 modify=0x00; break; default: break; } isClick=1; } } else if(P1_7==0x00)//按下了K4键,开启或关闭闹钟 { if(!isClick) { isClock=~isClock; isClick=1; } } else isClick=0; //闹钟是否响了 if(isClock) { if(hour==cHour && minute == cMinute) { Beep();//响 } } ShowTime(); } }