#include <reg51.h>#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;sbit LED_alarm=P3^5; //闹钟指示灯sbit led_naozhongonoff=P3^4;//闹铃响(LED亮)sbit P0_1=P0^1;sbit P0_2=P0^2;sbit P0_3=P0^3;sbit P3_0=P3^0;sbit P3_1=P3^1;unsigned char code Disp_Tab[] = {0x3f, 0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char coun=0,coun1=0,sec=0,min=0,hour=0;unsigned char timer_hour=0,timer_min=0,timer_sec=0;unsigned char flag=0,flag1=0,flag2=0;unsigned char temp=0,num=0,dingshi_num=0;unsigned char alarm_hour=0,alarm_min=0,alarm_sec=0;void init_t0();void init_t1();void set_time();void dingshi_end();void alarm_adjust();void dingshi_start();unsigned char key_scan();void delay_ms(unsigned char i);void disp_led(unsigned char hour,unsigned char min,unsigned char sec );void init_t0(){TMOD|=0x01;TH0=0x3c;TL0=0xb0;}void init_t1(){TMOD|=0x10;TH1=0x3c;TL1=0xb0;}void delay_ms(unsigned char i){unsigned int j;for(i;i>0;i--)for(j=200;j>0;j--);}void delay_disp(){unsigned char i,j, LedOut[6],hour1,min1,sec1;if(flag1==0&&flag2==0){hour1=hour;min1=min;sec1=sec;}if(flag2){hour1=timer_hour;min1=timer_min;sec1=timer_sec;}if(flag1==1){hour1=alarm_hour;min1=alarm_min;sec1=alarm_sec;}LedOut[0]=Disp_Tab[hour1/10];LedOut[1]=Disp_Tab[hour1%10]|0x80; //0x7f小数点LedOut[2]=Disp_Tab[min1/10];LedOut[3]=Disp_Tab[min1%10]|0x80;LedOut[4]=Disp_Tab[sec1/10];LedOut[5]=Disp_Tab[sec1%10];for(j=4;j>0;j--){for( i=0; i<6; i++){switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;}P1 = LedOut[i];delay_ms(2);}}}unsigned char key_scan(){unsigned char j,k;j=0x10;for(k=0;k<4;k++){P0=~j;if(P0_1==0) {delay_disp();if(P0_1==0) return k; break;}if(P0_2==0) {delay_disp();if(P0_2==0) return k+4;break;}if(P0_3==0) {delay_disp();if(P0_3==0) return k+8;break;}j=j<<1;}if(P0_1&&P0_2&&P0_3)return 66;}void disp_led(unsigned char hour,unsigned char min,unsigned char sec ) {unsigned char i, LedOut[6];LedOut[0]=Disp_Tab[hour/10];LedOut[1]=Disp_Tab[hour%10]|0x80; //0x7f小数点LedOut[2]=Disp_Tab[min/10];LedOut[3]=Disp_Tab[min%10]|0x80;LedOut[4]=Disp_Tab[sec/10];LedOut[5]=Disp_Tab[sec%10];for( i=0; i<6; i++){switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;}P1 = LedOut[i];delay_ms(2);}}void intt_t1() interrupt 3{TH1=0x3c;TL1=0xb0;coun++;if(coun>=20){coun=0;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;hour++;if(hour==24)hour=0;}}}}void intt_t0() interrupt 1{TH0=0x3c;TL0=0xb0;coun1++;if(coun1>=20){coun1=0;timer_sec++;if(timer_sec==60){timer_sec=0;timer_min++;if(timer_min==60){timer_min=0;timer_hour++;if(timer_hour==24) timer_hour=0;} }}}void intt_ex1(void) interrupt 2 using 2 //设置闹钟时间{EX1=0;flag1++;if(flag1==2)flag1=0;EX1=1;}void intt_ex0(void) interrupt 0 using 1 //时间设置{EX0=0;flag=1;EX0=1;}void dingshi_start() //定时{init_t0();// timer_hour=0;timer_min=0;timer_sec=0;TR0=1;ET0=1;// flag2=1;}void dingshi_end(){TR0=0;ET0=0;}void alarm_adjust(){if(key_scan()!=66){temp=key_scan();if(num==0&&temp<3){alarm_hour=temp*10;num++;temp=66;}if(num==1&&temp<10){alarm_hour=temp+alarm_hour;num++;temp=66;}if(num==2&&temp<6){alarm_min=temp*10;num++;temp=66;}if(num==3&&temp<10){alarm_min=temp+alarm_min;num++;temp=66;}if(num==4&&temp<6){alarm_sec=temp*10;num++;temp=66;}if(num==5&&temp<10){alarm_sec=temp+alarm_sec;num++;temp=66;}if(temp==11){flag1=0;num=0;}}}void set_time(){ET1=0;//hour=min=sec=0;if(key_scan()!=66){temp=key_scan();if(num==0&&temp<3){hour=temp*10+hour%10;num++;temp=66;}if(num==1&&temp<10){hour=temp+hour-hour%10;num++;temp=66;}if(num==2&&temp<6){min=temp*10+min%10;num++;temp=66;}if(num==3&&temp<10){min=temp+min-min%10;num++;temp=66;}if(num==4&&temp<6){sec=temp*10+sec%10;num++;temp=66;}if(num==5&&temp<10){sec=temp+sec-sec%10;num++;temp=66;}//num=num+1;if(temp==11){flag=0;num=0;ET1=1;}}}main(){unsigned char naozhongonoff_num=0;P0=P0&0x0f;init_t1();ET1=1;EA=1;EX0=1;EX1=1;IT0=1;IT1=1;IP=0x0a;P3=P3&0xff;while(1){if(flag1==0&&flag2==0)disp_led(hour,min,sec);if(flag2)disp_led(timer_hour,timer_min,timer_sec);if(flag1==1) //闹钟调整{disp_led(alarm_hour,alarm_min,alarm_sec);alarm_adjust();}if(flag==1) //时间设置set_time();if(P3_1==0){//闹钟开关delay_disp();delay_disp();if(P3_1==0){naozhongonoff_num++;if(naozhongonoff_num==2){naozhongonoff_num=0;led_naozhongonoff=1;}}}if(naozhongonoff_num==1){led_naozhongonoff=0;if(hour==alarm_hour&&min==alarm_min&&sec==alarm_sec){LED_alarm=0;timer_sec=0;dingshi_start();while(1){disp_led(alarm_hour,alarm_min,alarm_sec);if(timer_sec==5){LED_alarm=1;dingshi_end();timer_sec=0;break;}}}else LED_alarm=1;}if(P3_0==0) //定时按键I/O{delay_disp();delay_disp();//delay_disp();if(P3_0==0){dingshi_num++;flag2=1;}if(dingshi_num==1) //定时开始{dingshi_start();timer_hour=0;timer_min=0;timer_sec=0;}if(dingshi_num==2) // 定时结束dingshi_end();if(dingshi_num==3) //退出{flag2=0;dingshi_num=0;} //}}}以下是仿真图片以上完全是原创代码,水平有限,难免有些不足之处!。