代码是这些,麻烦看一下
- #include"reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define XIANSHI shi,fen,miao
- #define SHISHE shi,99,99 //99是任意一个数,用于后面条件检测
- #define FENSHE 99,fen,99
- #define MIAOSHE 99,99,miao
- #define NAO_S nao_s,99,99 //闹钟的宏
- #define NAO_F 99,nao_f,99
- #define NAO_M 99,99,nao_m //宏定义结束
- sbit key1=P3^0; //定义按键所连51单片机的引脚
- sbit key2=P3^1;
- sbit key3=P3^2;
- sbit duan_1 =P2^0; //虽然声明是duan但是其实是用来位选的
- sbit duan_2 =P2^1;
- sbit duan_3 =P2^2;
- sbit duan_4 =P2^3;
- sbit duan_5 =P2^4;
- sbit duan_6 =P2^5;
- sbit huxiled=P2^6; //呼吸灯
- sbit nzled=P3^3; //D2灯用来指示设置的闹钟时间到
- sbit BEEP=P1^5;
- uchar shijian[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
- uchar shi,fen,miao,nao_s=0,nao_f=0,nao_m=15,num_1=0,num_2=0,b=1,c=0;
- uchar a=0,n=0;
-
-
- void delayms(uint x)
- {
- uint a,b;
- for(a=x;a>0;a--)
- for(b=110;b>0;b--); //延时1ms
- }
- void xianshi(uchar S,F,M) //时间和闹钟显示函数
- {
- uchar shi_1,shi_2,fen_1,fen_2,miao_1,miao_2;
- shi_1=S/10;shi_2=S%10;
- fen_1=F/10;fen_2=F%10;
- miao_1=M/10;miao_2=M%10;
-
- if(S==99) {shi_1=10;shi_2=10;}//和设置按键有关,为了单独显示某一时或者分、秒。
- if(F==99) {fen_1=10;fen_2=10;}
- if(M==99) {miao_1=10;miao_2=10;}
- duan_1=1;P0=shijian[shi_1];delayms(5);duan_1=0; //位选
- duan_2=1;P0=shijian[shi_2];delayms(5);duan_2=0;
- duan_3=1;P0=shijian[fen_1];delayms(5);duan_3=0;
- duan_4=1;P0=shijian[fen_2];delayms(5);duan_4=0;
- duan_5=1;P0=shijian[miao_1];delayms(5);duan_5=0;
- duan_6=1;P0=shijian[miao_2];delayms(5);duan_6=0;
- }
- void keyscan()
- {
- uint time=0;
- if(key1==0)
- {
- while(!key1)
- {
- time++;
- if(time>40000){a=5;break;} //这是一个长按进入闹钟模式设置键
- }
- if(time<39999)
- a++;
- }
- if(key2==0) //key2控制时间加
- {
- delayms(90);
- if(key2==0)
- {
- if(a==1) {delayms(90);shi++;if(shi==24) shi=0;}
- if(a==2) {delayms(90);fen++;if(fen==60) fen=0;}
- if(a==3) {delayms(90);miao++;if(miao==60) miao=0;}
- if(a==6) {delayms(90);nao_s++;if(nao_s==24) nao_s=0;}
- if(a==7) {delayms(90);nao_f++;if(nao_f==60) nao_f=0;}
- if(a==8) {delayms(90);nao_m++;if(nao_m==60) nao_m=0;}
- }while(!key2);
- }
- if(key3==0) //key3控制时间减
- {
- delayms(90);
- if(key3==0)
- {
- if(a==1) {delayms(90);shi--;if(shi>=0&&shi<24);else shi=23;}
- if(a==2) {delayms(90);fen--;if(fen>=0&&fen<60);else fen=59;}
- if(a==3) {delayms(90);miao--;if(miao>=0&&miao<60);else miao=59;}
- if(a==6) {delayms(90);nao_s--;if(nao_s>=0&&nao_s<24);else nao_s=23;}
- if(a==7) {delayms(90);nao_f--;if(nao_f>=0&&nao_f<60);else nao_f=59;}
- if(a==8) {delayms(90);nao_m--;if(nao_m>=0&&nao_m<60);else nao_m=59;}
- }while(!key3);
- }
- if(a==4||a==9){a=0;} //归零
- }
- void init()
- {
- nzled=0; //给D2灯一个预设熄灭
- TMOD=0x01; //工作方式1
- TH0=0x4C; //定时器T0 定时19ms
- TL0=0x00;
- ET0=1;
- ET1=1;
- TH1=0xc0; //定时器T1 定时56ms
- TL1=0x00;
- ET0=1;
- ET1=1;
- TR1=1;
- EA=1; //总中断
- }
- void nzhongled() //闹钟和时间一致时让数码管和D2一起在将近10秒内频闪不断
- {
- uint g;
- for(g=0;g<23;g++)
- {
- nzled=1; //闹钟显示灯开始闪烁
- delayms(200);
- xianshi(XIANSHI);
- nzled=0;
- delayms(200);
- xianshi(XIANSHI);
- BEEP=~BEEP; //取反输出到喇叭的信号
-
-
- }
- }
- void main()
- {
-
- init();
- while(1)
- {
- switch(a)
- {
- case 0:TR0=1;keyscan();xianshi(XIANSHI);break;
- case 1:TR0=0;keyscan();xianshi(SHISHE);break;//中断关闭,时间停止
- case 2:keyscan();xianshi(FENSHE);break;
- case 3:keyscan();xianshi(MIAOSHE);break;
- case 5:;
- case 6:keyscan();xianshi(NAO_S);break;
- case 7:keyscan();xianshi(NAO_F);break;
- case 8:keyscan();xianshi(NAO_M);break;
- }
- if(a==0&&(nao_s==shi&&nao_f==fen&&nao_m==miao))
- {
- nzhongled(); //闹钟与时间一致进入nzhongled函数
-
- }
- }
- }
- void zhongduan1() interrupt 1 //精确计时 定时器中断T0
- {
- TH0=0x4C;
- TL0=0x00;
- num_1++;
- if(num_1==20)
- {
- num_1=0;
- miao++;
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24) shi=0;
- }
- }
- }
- }
- void zhongduan2() interrupt 3
- //呼吸灯程序,具体体现为D1灯,
- //在proteus中无呼吸效果猜测是因为proteus模拟时每次刷新每帧是0.05秒太久
- {
- TH1=0xc0;
- TL1=0x00;
- num_2++;
- if(b<=6)
- {
- if(num_2<b) huxiled=1;
- else huxiled=0;
- }
- else
- {
- if((num_2+6)<b) huxiled=0;
- else huxiled=1;
- }
- if(num_2==6)
- {
- num_2=0;c++;
- if(c==4)
- {
- b++;c=0;
- if(b==13) b=0;
- }
- }
- }
复制代码 |