|
|
原來(lái)的程序,設(shè)置調(diào)整的時(shí)候數(shù)碼管不閃爍,我在原來(lái)的程序上修改了一下,現(xiàn)在調(diào)整的時(shí)候?qū)?yīng)的數(shù)碼管閃爍,這樣比較直觀的知道調(diào)整的是時(shí)、分、秒。仿真通過(guò)
/**************************/
/**************************/
/**** 電子時(shí)鐘 ****/
/**************************/
/**************************/
#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)整時(shí)鐘的指示燈
sbit led4=P1^3; //鬧鐘設(shè)置指示燈
sbit BUZZ =P1^4; //報(bào)警
sbit wei0=P2^0; //定義8個(gè)數(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í)函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void start() //定時(shí)器初始化
{
TMOD=0x11;
TH0=(65536-50000)/256; //時(shí)間累加
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)閉定時(shí)器
}
void display(char miao,char fen, char shi) //顯示子程序,分別顯示時(shí),分,秒
{
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)整時(shí),秒閃爍
{
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)整時(shí),分鐘閃爍
{
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)整時(shí),小時(shí)閃爍
{
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; //開(kāi)定時(shí)器
else
TR0=0; //關(guān)閉定時(shí)器
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;
}
|
|