1、#include#define uchar unsigned char#define uint unsigned intsbit w1=P00;sbit w2=P01;sbit w3=P02;sbit w4=P03;sbit k1=P04; /定义按键sbit k2=P05;sbit k3=P06;sbit k4=P07;sbit fm=P34;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /0-9十六进制数共阴void timetune(); /时间校正函数 void delayms(uint); /延
2、迟函数void keyscan(); /闹钟设置函数void keyscan1(); /闹钟检测函数 void display(uint anum,uint anum1,uint anum2,uint anum3); /显示函数uint num0,num,num1,num2,num3,anum,anum1,anum2,anum3,temp,temp0,temp1,temp2,temp3,temp4,s,s1,s2,s3,s4;void main()TMOD=0x01; /设置定时器0为工作方式1(0000 0001)TH0=(65536-45872)/256; /装初值50毫秒中断一次TL0=
3、(65536-45872)/256;EA=1; /开总中断ET0=1; /开定时器0终中断TR0=1; / 开定时器 while(1) /中断后进入死循环时间永不停止计时 timetune(); / 调用时间设置函数keyscan(); /调用闹钟设置函数 if(num0=20) num0=0;num+;if(num=10)num1+;num=0;if(num1=6)num2+;num1=0;if(num2=10) /和下面if必须分开,否则时间到24小时后不会清0继续走下去num3+;num2=0;if(num3=2&num2=4) /当时间走到24小时后自动清0num3=0;num2=0;
4、num=0;num1=0; if(temp0=1) /为了防止闹钟时间显示和正常时间显示同时显示出现数码管显示不清晰,所以 display(s1,s2,s3,s4); /写两个对立的if条件判断语句(temp=1和temp!=1)来作为限制条件. if(temp0!=1) display(num,num1,num2,num3); /keyscan1();void display(uint anum,uint anum1,uint anum2,uint anum3) /时间显示函数 P2=tableanum3; w1=1; delayms(1); w1=0; P2=tableanum2; w2=
5、1; delayms(1); w2=0; P2=tableanum1; w3=1; delayms(1); w3=0; P2=tableanum; w4=1; delayms(1); w4=0;void timetune() /时间校正程序if(k4=0) /当每按下第四个键后会出现temp不同的值,然后用delayms(10); /不同的值作为不同的条件给四个数码管加减值来校正时间if(k4=0)temp+; while(!k4); if(temp=1)if(k2=0) delayms(10); /按键时由于会产生机械振动,为了准确检测到按键if(k2=0) /按下所以要延时num+;if(
6、num=10)num=0;while(!k2); if(temp=2)if(k2=0) delayms(10);if(k2=0)num1+;if(num1=6)num1=0;while(!k2); if(temp=3) if(k2=0) delayms(10);if(k2=0)num2+;if(num2=10)num2=0;while(!k2); if(temp=4)if(k2=0) delayms(10);if(k2=0) num3+;if(num3=3)num3=0;while(!k2); if(num3=2&num2=4) /前面由于num2可以加到十,但是num2最多只能是4,所以 /
7、当num3加到2时,num2只能最大为4,大于4后要清0num2=0;if(temp=5)temp=0; /为了让时间能够反复校正,temp要清0void keyscan1() /闹钟判断程序if(s1=num&s2=num1&s3=num2&s4=num3&temp0=2) /闹钟判断条件temp0=0; /当闹钟判断条件成立后,第一次闹钟响了后,为了能够进行第二次闹钟的设置,所以temp0要清0fm=0; /蜂鸣器void keyscan() /闹钟调整程序 if(k3=0)delayms(10);if(k3=0)temp0+; while(!k3); /按键释放if(k1=0)delay
8、ms(10);if(k1=0)s+; while(!k1);if(s=1)if(k2=0) delayms(10);if(k2=0)s1+;if(s1=10)s1=0;while(!k2);if(s=2)if(k2=0) delayms(10);if(k2=0)s2+;if(s2=6)s2=0;while(!k2); if(s=3)if(k2=0) delayms(10);if(k2=0)s3+;if(s3=10)s3=0;while(!k2); if(s=4)if(k2=0) delayms(10);if(k2=0) s4+;if(s4=3)s4=0;while(!k2); if(s4=3&s3=5) /同时间调整程序一样s3=0;if(s=5)s=0;void delayms(uint xms)uint i,j;for(i=xms;i0;i-)for(j=110;j0;j-);void T0_time() interrupt 1 /中断服务程序 EA=0;TH0=(65536-45872)/256;TL0=(65536-45872)/256;num0+;EA=1;