1、#includetypedef unsigned char u8;typedef unsigned int u16;sbit A=P20;sbit BA=P21;sbit C=P22;sbit led = P30;sbit s7=P37;/*k1 设置时间,k2 定时。k1 ,k2 使用不自动弹起按键。k3 时分秒选择,k4 加数字,k5 减数字。*/sbit k1=P10; sbit k2=P11;sbit k3=P12;sbit k4=P13;sbit k5=P14;u8 count=0,sec,min=44,hour=8,mon=9,day=28,ss=0;s=60,m=60,h=24,
2、month=12,d=31;u16 year=2015,y=9999;#define DATA P0u16 code table= 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /共阴数码管 0-F 编码void delay(u16 z)u16 x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*通过 count 获得 hour,min, sec 变量值 */void timecontrol() sec+;if(sec=60)sec=0;min+;if(mi
3、n=60)min=0;hour+;if(hour=24)/1dhour=0;day+;switch(mon) case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(day=32)/一个月day=0;mon+;break;case 4:case 6:case 9:case 11:if(day=31)/一个月day=0;mon+;break;default: /2 月if(year%4=0 mon+;elseif(day=29)day=0;mon+;break;if(mon=12) /1 年mon=0;year+;if(year=9999)ye
4、ar=0;void display(u16 year1,u8 mon1,u8 day1,u8 zs,u8 zm, u8 zh)led=1;DATA=0x00;A=0;BA=0;C=0;DATA=tablezh/10;delay(3);DATA=0x00;A=1;BA=0;C=0;led=1;DATA=tablezh%10|0x80;delay(3);DATA=0x00;A=0;BA=1;C=0;led=1; DATA=tablezm/10;delay(3);DATA=0x00;A=1;BA=1;C=0;led=1;DATA=tablezm%10|0x80;delay(3);DATA=0x00;
5、A=0;BA=0;C=1;led=1; DATA=tablezs/10;delay(3);DATA=0x00;A=1;BA=0;C=1;led=1; DATA=tablezs%10|0x80;delay(3);DATA=0x00;led=0;A=0;BA=0;C=0;DATA=tableyear1/1000;delay(3);DATA=0x00;A=1;BA=0;C=0;led=0;DATA=tableyear1%1000/100;delay(3);DATA=0x00;A=0;BA=1;C=0;led=0;DATA=tableyear1%1000%100/10;delay(3);DATA=0x
6、00;A=1;BA=1;C=0;led=0;DATA=tableyear1%10;delay(3);DATA=0x00;A=0;BA=0;C=1;led=0;DATA=tablemon1/10;delay(3);DATA=0x00;A=1;BA=0;C=1;led=0;DATA=tablemon1%10;delay(3);DATA=0x00;A=0;BA=1;C=1;led=0;DATA=tableday1/10;delay(3);DATA=0x00;A=1;BA=1;C=1;led=0;DATA=tableday1%10;delay(3);void keyscan_settime() /时间
7、设置模块u16 ye;u8 mo,da, st,mt,ht;if(k1=0)delay(10);if(k1=0)st=sec,mt=min,ht=hour,ye=year,mo=mon,da=day;TR0=0; /关闭定时器while(k1=0) /等待用户按键display(ye,mo,da,st,mt,ht); if(k3=0)delay(10);if(k3=0) while(!k3);ss+;if(ss=6) ss=0;/*通过 ss 选择时分秒设置*/if(k4=0) /加数delay(10);if(k4=0)while(!k4);switch(ss)case 0:st+;if(st
8、=60)st=0;break;case 1:mt+;if(mt=60)mt=0;break;case 2:ht+;if(ht=24)ht=0;break;case 3:ye+;if(ye=9999) ye=0;break;case 4:mo+;if(mo=13) mo=0;break;case 5:da+;if(da=32) da=0;break; default :; if(k5=0) /减数delay(10);if(k5=0)while(!k5);switch(ss)case 0:if(st0)st-;else st=0;break;case 1:if(mt0)mt-;else mt=0;
9、break;case 2:if(ht0)ht-;else ht=0;break; case 3:if(ye0) ye-;else ye=0;break;case 4:if(mo0) mo-;else mo=0;break;case 5:if(da0) da-;else da=0;break; default : ; TR0=1;sec=st,min=mt,hour=ht,day=da,mon=mo,year=ye; display(year,mon,day,sec,min,hour);void keyscan_time() /用户定时模块if(k2=0)delay(10); if(k2=0)s
10、=sec;m=min;h=hour,y=year,month=mon,d=day;while(k2=0) /开始定时设置display(y,month,d,s,m,h);if(k3=0)delay(10);if(k3=0) while(!k3);ss+;if(ss=6) ss=0;/*通过 ss 选择时分秒设置*/if(k4=0) /加数delay(10);if(k4=0)while(!k4);switch(ss)case 0:s+;if(s=60)s=0;break;case 1:m+;if(m=60)m=0;break;case 2:h+;if(h=24)h=0;break;case 3:
11、y+;if(y=9999) y=0;break;case 4:month+;if(month=13) month=0;break;case 5:d+;if(d=32) d=0;break; default :; if(k5=0) /减数delay(10);if(k5=0)while(!k5);switch(ss)case 0:if(s0)s-;else s=0;break;case 1:if(m0)m-;else m=0;break;case 2:if(h0)h-;else h=0;break; case 3:if(y0) y-;else y=0;break;case 4:if(month0)
12、 month-;else month=0;break;case 5:if(d0) d-;else d=0;break; default : ; void buz()if(year=y)delay(1000);s7=1;void time0_init()TMOD=0x01;TH0=0x4b;TL0=0xfe;EA=1;ET0=1;TR0=1;void main(void)time0_init();while(1)keyscan_settime();keyscan_time(); buz(); void Time0() interrupt 1TH0=0x4b;TL0=0xfe;count+;if(count=20) count=0;timecontrol();