感谢楼主分享 |
不错功能比较多 |
显示函数修改一下,调整时相应的数码管闪烁 void display(char miao,char fen, char shi) //显示子程序,分别显示时,分,秒 { if(slnum==0) { snum=30; fnum=30; mnum=30; } if(slnum==1) { snum=30; fnum=30; mnum++; } if(slnum==2) { snum=30; fnum++; mnum=30; } if(slnum==3) { snum++; fnum=30; mnum=30; } if(mnum>=30) //调整时,秒闪烁 { P0=table[miao%10]; wei7=0; delay(1); wei7=1; P0=0xff; P0=table[miao/10]; wei6=0; delay(1); wei6=1; P0=0xff; if(mnum==60) mnum=0; } P0=table[16]; wei5=0; delay(1); wei5=1; P0=0xff; if(fnum>=30) //调整时,分钟闪烁 { P0=table[fen%10]; wei4=0; delay(1); wei4=1; P0=0xff; P0=table[fen/10]; wei3=0; delay(1); wei3=1; P0=0xff; if(fnum==60) fnum=0; } P0=table[16]; wei2=0; delay(1); wei2=1; P0=0xff; if(snum>=30) //调整时,小时闪烁 { P0=table[shi%10]; wei1=0; delay(1); wei1=1; P0=0xff; P0=table[shi/10]; wei0=0; delay(1); wei0=1; P0=0xff; if(snum==60) snum=0; } } |
原来的程序,设置调整的时候数码管不闪烁,我在原来的程序上修改了一下,现在调整的时候对应的数码管闪烁,这样比较直观的知道调整的是时、分、秒。仿真通过 /**************************/ /**************************/ /**** 电子时钟 ****/ /**************************/ /**************************/ #include<reg52.h> #define uint unsigned int #define uchar unsigned char char miao,fen,shi; bit flag, flag_time; char set_miao=0,set_fen=0;set_shi=12; //闹钟初始化 uchar slnum,snum,fnum,mnum; sbit s1=P3^0; //功能键 sbit s2=P3^1; //加键 sbit s3=P3^2; //减键 sbit s4=P3^3; //闹钟设置 sbit led1=P1^0; //调整秒钟的指示灯 sbit led2=P1^1; //调整分钟的指示灯 sbit led3=P1^2; //调整时钟的指示灯 sbit led4=P1^3; //闹钟设置指示灯 sbit BUZZ =P1^4; //报警 sbit wei0=P2^0; //定义8个数码管段选 sbit wei1=P2^1; sbit wei2=P2^2; sbit wei3=P2^3; sbit wei4=P2^4; sbit wei5=P2^5; sbit wei6=P2^6; sbit wei7=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}; //共阴数码管编码 void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=125;y>0;y--); } void start() //定时器初始化 { TMOD=0x11; TH0=(65536-50000)/256; //时间累加 TH0=(65536-50000)%256; TH1=(65536-50000)/256; //闹钟设置 TH1=(65536-50000)%256; EA=1; ET0=1; ET1=1; TR0=1; TR1=0; //关闭定时器 } void display(char miao,char fen, char shi) //显示子程序,分别显示时,分,秒 { if(slnum==0) { snum=30; fnum=30; mnum=30; } if(slnum==1) { snum=30; fnum=30; mnum++; } if(slnum==2) { snum=30; fnum++; mnum=30; } if(slnum==3) { snum++; fnum=30; mnum=30; } if(mnum>=30) //调整时,秒闪烁 { P0=table[miao%10]; wei7=0; delay(1); wei7=1; P0=0xff; P0=table[miao/10]; wei6=0; delay(1); wei6=1; P0=0xff; if(mnum==60) mnum=0; } P0=table[16]; wei5=0; delay(1); wei5=1; P0=0xff; if(fnum>=30) //调整时,分钟闪烁 { P0=table[fen%10]; wei4=0; delay(1); wei4=1; P0=0xff; P0=table[fen/10]; wei3=0; delay(1); wei3=1; P0=0xff; if(fnum==60) fnum=0; } P0=table[16]; wei2=0; delay(1); wei2=1; P0=0xff; if(snum>=30) //调整时,小时闪烁 { P0=table[shi%10]; wei1=0; delay(1); wei1=1; P0=0xff; P0=table[shi/10]; wei0=0; delay(1); wei0=1; P0=0xff; if(snum==60) snum=0; } } void keyscan() //功能键 { if(s1==0) { delay(5); if(s1==0) //确认功能按下 { while(!s1); slnum++; //功能键按下次数记录 if(slnum==1) //功能键第一次按下调整“秒钟” { if(flag) TR0=1; //开定时器 else TR0=0; //关闭定时器 led1=0; } if(slnum==2) { led2=0; led1=1; } if(slnum==3) { led3=0; led2=1; led1=1; } if(slnum==4) { led3=1; led2=1; led1=1; slnum=0; TR0=1; } } } } void time() { if(slnum!=0) { if(s2==0) { delay(5); if(s2==0) { while(!s2); switch(slnum) { case 1: miao++; if(miao==60) miao=0; break; case 2: fen++; if(fen==60) fen=0; break; case 3: shi++; if(shi==24) shi=0; break; } } } if(s3==0) { delay(5); if(s3==0) { while(!s3); switch(slnum) { case 1: miao--; if(miao<0) miao=59; break; case 2: fen--; if(fen<0) fen=59; break; case 3: shi--; if(shi<0) shi=23; break; } } } } } void set_time() { if(slnum==0) { if(s4==0) { delay(5); if(s4==0) { while(!s4); led4=~led4; flag=~flag; } } } if(flag) { if(slnum!=0) { if(s2==0) { delay(5); if(s2==0) { while(!s2); switch(slnum) { case 1: set_miao++; if(set_miao==60) set_miao=0; break; case 2: set_fen++; if(set_fen==60) set_fen=0; break; case 3: set_shi++; if(set_shi==24) set_shi=0; break; } } } if(s3==0) { delay(5); if(s3==0) { while(!s3); switch(slnum) { case 1: set_miao--; if(set_miao<0) set_miao=59; break; case 2: set_fen++; if(set_fen<0) set_fen=59; break; case 3: set_shi--; if(set_shi<0) set_shi=23; break; } } } } } } void main() { start(); while(1) { keyscan(); time(); if(!flag) { display(miao,fen,shi); } else { display(set_miao,set_fen,set_shi); } if(miao==set_miao&&fen==set_fen&&shi==set_shi) { TR1=1; } if(flag_time) { TR1=0; BUZZ=1; flag_time=0; } set_time(); } } void time_0()interrupt 1 { uchar aa; TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; if(aa==20) { aa=0; miao++; if(miao>=60) { miao=0; fen++; if(fen>=60) { fen=0; shi++; if(shi>=24) { shi=0; } } } } } void time_1()interrupt 3 { uchar bz_time; TH1=(65536-50000)/256; TL1=(65536-50000)%256; bz_time++; if(bz_time==200) { bz_time=0; flag_time=1; } BUZZ=~BUZZ; } |
不错功能比较多 |