(一)设计基本要求 1、用51单片机的中断实现时钟计时功能,数码管显示时、分、秒 2、可以设置一个闹钟,精确到分钟,可以通过按键设置闹钟时间(闹钟响三十秒) 3、可以分别对时、分、秒进行加和减的调整,每次加一或减一 4、最多使用四个按键 5、闹铃响的同时时钟显示不能受到影响 6、显示年月日(提示:换屏显示)
(二)程序 #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit wela=P2^7; sbit dula=P2^6; sbit key1=P3^0; sbit key2=P3^1; sbit key3=P3^2; sbit key4=P3^3; uchar num1,num2,temp1,flag; uint count; char xiaoshi,fen,miao,year=16,month=7,day=29,alahour,alafen,alamiao,a1,a2; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void display(uchar a,uchar b,uchar c) { uchar a1,a2,a3,a4,a5,a6; a1=a/10;a2=a%10; a3=b/10;a4=b%10; a5=c/10;a6=c%10; P0=0xfe; wela=1; wela=0; P0=table[a1]; dula=1;dula=0; delay(3); P0=0xfd; wela=1;wela=0; P0=table[a2]; dula=1;dula=0; delay(1); P0=0xfb; wela=1;wela=0; P0=0x80; dula=1;dula=0; delay(3); P0=0xf7; wela=1;wela=0; P0=table[a3]; dula=1;dula=0; delay(3); P0=0xef; wela=1;wela=0; P0=table[a4]; dula=1;dula=0; delay(1); P0=0xdf; wela=1;wela=0; P0=0x80; dula=1;dula=0; delay(3); P0=0xbf; wela=1;wela=0; P0=table[a5]; dula=1;dula=0; delay(3); P0=0x7f; wela=1;wela=0; P0=table[a6]; dula=1;dula=0; delay(3); } void init() { TMOD=0x11; TH0=(65536-45872)/256; TL0=(65536-45872)%256; TH1=(65536-45872)/256; TL1=(65536-45872)%256; EA=1; ET0=1; ET1=1; TR0=1; } void keyscan() { if(key4==0) { delay(10); if(key4==0) { temp1++; if(temp1==3) { temp1=0; display(xiaoshi,fen,miao); num2=0; } } while(!key4); } switch(temp1) { case 0:display(xiaoshi,fen,miao);break; case 1:display(year,month,day);break; case 2:display(alahour,alafen,alamiao); break; } if(key1==0) { delay(10); if(key1==0) { while(!key1); num2++; if(temp1==0) TR0=0; } if(num2==4 && temp1==2) flag=1; if(num2==4) { num2=0; //display(xiaoshi,fen,miao); TR0=1; } } if(num2!=0) { if(key2==0) { delay(10); if(key2==0) { while(!key2); if(temp1==0) { if(num2==1) { miao++; if(miao==60) miao=0; display(xiaoshi,fen,miao); } if(num2==2) { fen++; if(fen==60) fen=0; display(xiaoshi,fen,miao); } if(num2==3) { xiaoshi++; if(xiaoshi==24) xiaoshi=0; display(xiaoshi,fen,miao); } } if(temp1==1) { if(num2==1) { day++; if(year%4==0 && year%100!=0 || year%400==0) { if(month==2) { if(day==30) day=1; } } else { if(month==2) { if(day==29) day=1; } } if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) { if(day==32) day=1; } if(month==4 || month==6 || month==9 || month==11) { if(day==31) day=1; } display(year,month,day); } if(num2==2) { month++; if(month==13) month=1; display(year,month,day); } if(num2==3) { year++; if(year==100) year=0; } } if(temp1==2) { if(num2==2) { alafen++; if(alafen==60) alafen=0; } if(num2==3) { alahour++; if(alahour==23) alahour=0; } } } } if(key3==0) { delay(10); if(key3==0) { while(!key3); if(temp1==0) { if(num2==1) { miao--; if(miao==-1) miao=59; display(xiaoshi,fen,miao); } if(num2==2) { fen--; if(fen==-1) fen=59; display(xiaoshi,fen,miao); } if(num2==3) { xiaoshi--; if(xiaoshi==-1) xiaoshi=23; display(xiaoshi,fen,miao); } } if(temp1==1) { if(num2==1) { day--; if(year%4==0 && year%100!=0 || year%400==0) { if(month==2) { if(day==-1) day=29; } } else { if(month==2) { if(day==-1) day=28; } } if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) { if(day==-1) day=31; } if(month==4 || month==6 || month==9 || month==11) { if(day==-1) day=30; } display(year,month,day); } if(num2==2) { month--; if(month==-1) month=12; display(year,month,day); } if(num2==3) { year--; if(year==-1) year=99; } } if(temp1==2) { if(num2==2) { alafen--; if(alafen==-1) alafen=59; } if(num2==3) { alahour--; if(alahour==-1) alahour=23; } } } } } if(xiaoshi==alahour && fen==alafen && flag==1 ) { flag=0; P1=0x00; TR1=1; } } void main() { init(); while(1) { keyscan(); // display(xiaoshi,fen,miao); } } void t1() interrupt 3 { TH1=(65536-45872)/256; TL1=(65536-45872)%256; count++; if(count==600) { P1=0xff; count=0; TR1=0; } } void t0() interrupt 1 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; num1++; if(num1==20) { num1=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; xiaoshi++; if(xiaoshi==24) { xiaoshi=0; day++; if(year%4==0 && year%100!=0 || year%400==0) { if(month==2) { if(day==30) { day=1; month++; if(month==13) { month=1; year++; if(year==100) year=0; } } } } else { if(month==2) { if(day==29) { day=1; month++; if(month==13) { month=1; year++; if(year==100) year=0; } } } } if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) { if(day==32) { day=1; month++; if(month==13) { month=1; year++; if(year==100) year=0; } } } if(month==4 || month==6 || month==9 || month==11) { if(day==31) { day=1; month++; if(month==13) { month=1; year++; if(year==100) year=0; } } } } } } } }
|