原来的程序,设置调整的时候数码管不闪烁,我在原来的程序上修改了一下,现在调整的时候对应的数码管闪烁,这样比较直观的知道调整的是时、分、秒。仿真通过
/**************************/
/**************************/
/**** 电子时钟 ****/
/**************************/
/**************************/
#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;
}
|