#include #define uint unsigned int #define uchar unsigned char uchar num=0; //记录按键KEY1的次数和变量 uchar temp=0; //记录定时器0中断次数的变量--时钟 uchar count=0; //记录定时器1中断次数的变量 uchar aa,i,j; uchar hour,min,sec; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管 0~9 sbit _led=P2^7; sbit key1=P2^0; sbit key2=P2^1; sbit key3=P2^2; sbit SPK=P3^0; sbit K1=P3^7; void delay(uint z); //延时函数 void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar aa); //显示函数 void read_key(); //读按键函数 void led(); void Alarm(uchar t); /****************** 主函数 *******************/ void main() { P2=0xff; //将p2口置1 hour=6; min=29; sec=55; TMOD=0x11; //同时控制定时器T1和T0采用模式1工作(16位计数器) TH0=0x3c; //50ms中断一次 TL0=0xb0; TH1=0x3c; //50ms中断一次 TL1=0xb0; EA=1; //开总中断 ET0=1; //开定时器0中断 ET1=1; //开定时器1中断 TR0=1; //开定时器0 TR1=1; //开定时器1 SPK=0; while(1) { //如果到了设定的响铃时间 if((hour==6)&(min==30)&(sec==0)||(hour==8)&(min==00)&(sec==0)||(hour==9)&(min==\ 50)&(sec==0)||(hour==10)&(min==00)&(sec==0)||(hour==11)&(min==50)&(sec==0)||(hour==14)&(min==00)&(sec==0)||(hour==15)&(min==50)&(sec==0)||(hour==16)&(min==00)\ &(sec==0)||(hour==17)&(min==50)&(sec==0)||(hour==23)&(min==00)&(sec==0)) { if(K1==1) //如果按键1没按下 { Alarm(90); Alarm(120); Alarm(90); Alarm(120); } } read_key(); if(temp>=20) //如果到了1S { temp=0; sec++; if(sec>=60) { sec=0; min++; if(min>=60) { min=0; hour++; if(hour>=24) { hour=0; } } } } if(count<=15) display(table[hour/10]/*取出小时的十位*/,table[hour%10],table[min/10], table[min%10],table[sec/10],table[sec%10],0xff); if(count>15) display(table[hour/10],table[hour%10],table[min/10], table[min%10],table[sec/10],table[sec%10],0x00); } } /****************** 显示函数 *******************/ void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar aa) { if(num==0) //如果还没选择时分秒,显示“-” { P1=0x24&aa; P0=0xbf; delay(2); } else { P1=0x24; P0=0xbf; delay(2); } if(num==1) { P1=0x01&aa; P0=a; delay(2); } else { P1=0x01; P0=a; delay(2); } //hour if(num==1) { P1=0x02&aa; P0=b; delay(2); } else { P1=0x02; P0=b; delay(2); } //hour if(num==2) { P1=0x08&aa; P0=c; delay(2); } else { P1=0x08; P0=c; delay(2); } //min if(num==2) { P1=0x10&aa; P0=d; delay(2); } else { P1=0x10; P0=d; delay(2); } //min if(num==3) { P1=0x40&aa; P0=e; delay(2); } else { P1=0x40; P0=e; delay(2); } //sec if(num==3) { P1=0x80&aa; P0=f; delay(2); } else { P1=0x80; P0=f; delay(2); } //sec } /************** 定时器0中断函数***************/ //时钟 void timer0() interrupt 1 { TH0=0x3c; //50ms中断一次 TL0=0xb0; temp++; } /************** 定时器1中断函数 ***************/ //闪烁 void timer1() interrupt 3 { TH1=0x3c; //定时1S TL1=0xb0; count++; if(count>=20) count=0; } /****************** 延时子函数*******************/ void delay(uint z) { uint j,k; for(j=z;j>0;j--) for(k=120;k>0;k--); } /****************** 读按键函数*******************/ void read_key() { if(key1==0) //如果按下按键1 { delay(50); //按键消抖 if(key1==0) //如果按键1确实是按下了 { _led=0; num++; //按键1按下次数计数 if(num>3) {num=0;} } while(!key1); //防止碰到了按键1但是没按下 delay(10); while(!key1); _led=1; } if(key2==0) { delay(90); if(key2==0) { _led=0; if(num==1) { hour++; if(hour==24) hour=0; } if(num==2) { min++; if(min==60) min=0; } if(num==3) { sec++; if(sec==60) sec=0; } } while(!key1); delay(700); while(!key1); _led=1; } if(key3==0) { _led=0; delay(90); if(key3==0) { if(num==1) { hour--; if(hour==0) hour=24; } if(num==2) { if(min==0) { min=60; hour--; } min--; } if(num==3) { if(sec==0) { sec=60; min--; } sec--; } } while(!key1); delay(700); while(!key1); _led=1; } } /************* 闹钟 *****************/ void Alarm(uchar t) { uchar i,j; for(i=0;i<200;i++) { SPK=~SPK; //让蜂鸣器响 for(j=0;j