|
原來的程序,設(shè)置調(diào)整的時候數(shù)碼管不閃爍,我在原來的程序上修改了一下,現(xiàn)在調(diào)整的時候?qū)?yīng)的數(shù)碼管閃爍,這樣比較直觀的知道調(diào)整的是時、分、秒。仿真通過
/**************************/
/**************************/
/**** 電子時鐘 ****/
/**************************/
/**************************/
#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; //鬧鐘設(shè)置
sbit led1=P1^0; //調(diào)整秒鐘的指示燈
sbit led2=P1^1; //調(diào)整分鐘的指示燈
sbit led3=P1^2; //調(diào)整時鐘的指示燈
sbit led4=P1^3; //鬧鐘設(shè)置指示燈
sbit BUZZ =P1^4; //報警
sbit wei0=P2^0; //定義8個數(shù)碼管段選
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}; //共陰數(shù)碼管編碼
void delay(uint z) //延時函數(shù)
{
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; //鬧鐘設(shè)置
TH1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0; //關(guān)閉定時器
}
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) //調(diào)整時,秒閃爍
{
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) //調(diào)整時,分鐘閃爍
{
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) //調(diào)整時,小時閃爍
{
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) //確認(rèn)功能按下
{
while(!s1);
slnum++; //功能鍵按下次數(shù)記錄
if(slnum==1) //功能鍵第一次按下調(diào)整“秒鐘”
{
if(flag)
TR0=1; //開定時器
else
TR0=0; //關(guān)閉定時器
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;
}
|
|