可以實現(xiàn)萬年歷的基本功能,基于八位數(shù)碼管的程序,可切屏,內(nèi)含功能鍵。C語言小白,多有不成熟之處,望諒解。
以下是電路圖:
1
3
以下是所需元器件:
單片機源程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint);
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;
sbit beep=P3^7;
uint nian;
uchar count=0;
uchar zhou,yue,ri,shi,fen,miao,anao,bnao,cnao;
uchar s1num=0;
uchar s2num=1;
uchar nian1,nian2,nian3,nian4,yue1,yue2,ri1,ri2;
uchar nao1,nao2,nao3,nao4,nao5,nao6;
uchar shi1,shi2,fen1,fen2,miao1,miao2;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void di()
{
beep=0;
delay(1);
beep=1;
}
void rili() //顯示日歷
{
nian1=nian/1000;
nian2=nian%1000/100;
nian3=nian%100/10;
nian4=nian%10;
yue1=yue/10;
yue2=yue%10;
ri1=ri/10;
ri2=ri%10;
P2=0x1c;
P0=table[nian1];
delay(1);
P2=0x18;
P0=table[nian2];
delay(1);
P2=0x14;
P0=table[nian3];
delay(1);
P2=0x10;
P0=table[nian4];
delay(1);
P2=0x0c;
P0=table[yue1];
delay(1);
P2=0x08;
P0=table[yue2];
delay(1);
P2=0x04;
P0=table[ri1];
delay(1);
P2=0x00;
P0=table[ri2];
delay(1);
}
void shijian() //顯示時間
{
shi1=shi/10;
shi2=shi%10;
fen1=fen/10;
fen2=fen%10;
miao1=miao/10;
miao2=miao%10;
P2=0x1c;
P0=table[shi1];
delay(1);
P2=0x18;
P0=table[shi2];
delay(1);
P2=0x14;
P0=0x80;
delay(1);
P2=0x10;
P0=table[fen1];
delay(1);
P2=0x0c;
P0=table[fen2];
delay(1);
P2=0x08;
P0=0x80;
delay(1);
P2=0x04;
P0=table[miao1];
delay(1);
P2=0x00;
P0=table[miao2];
delay(1);
}
void nao() //顯示鬧鐘
{
nao1=anao/10;
nao2=anao%10;
nao3=bnao/10;
nao4=bnao%10;
nao5=cnao/10;
nao6=cnao%10;
P2=0x1c;
P0=table[nao1];
delay(1);
P2=0x18;
P0=table[nao2];
delay(1);
P2=0x14;
P0=0x80;
delay(1);
P2=0x10;
P0=table[nao3];
delay(1);
P2=0x0c;
P0=table[nao4];
delay(1);
P2=0x08;
P0=0x80;
delay(1);
P2=0x04;
P0=table[nao5];
delay(1);
P2=0x00;
P0=table[nao6];
delay(1);
}
void xingqi() //顯示星期
{
P2=0x1c;
P0=table[zhou];
}
void run()
{
if(nian%400==0||nian%100!=0&&nian%4==0)
{
if(yue==2)
{
ri++;
{
if(ri==30)
{
ri=1;
yue++;
}
}
}
}
}
void zhoubian()
{
uint yue1,nian1; /星期數(shù)隨著年月日的變化自行改變
yue1=yue;
nian1=nian;
if(yue==1||yue==2)
{
yue1=yue+12;
nian1=nian-1;
}
zhou=(ri+2*yue1+3*(yue1+1)/5+nian1+nian1/4-nian1/100+nian1/400)%7+1;
}
void timer0()interrupt 1 //中斷
{
TH0=(65534-50000)/256;
TL0=(65534-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
zhou++;
{
if(zhou==8)
{
zhou=1;
}
}
if(yue==4||yue==6||yue==9||yue==11) //在小月的前提
{
ri++;
if(ri==31)
{
ri=1;
yue++;
}
}
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) //在大月的前提
{
ri++;
if(ri==32)
{
ri=1;
yue++;
}
}
run();
if(nian%4!=0||nian%400==0)
{
if(yue==2)
{
ri++;
if(ri==29)
{
ri=1;
yue++;
}
}
if(yue==13)
{
yue=1;
nian++;
}
}
}
}
if(zhou==7)
{
zhou=0;
}
}
}
if(shi==anao&&fen==bnao&&miao>=cnao)
{
di();
}
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)/256;
EA=1;
ET0=1;
TR0=1; //開啟定時器
nian=2019;
yue=11;
ri=27;
shi=0;
fen=0;
miao=0;
anao=0;
bnao=0;
cnao=0;
}
void tiaobnao()
{
if(s3==0)
{
delay(5);
if(s3==0)
{
bnao++;
while(!s3);
if(bnao==60)
{
bnao=0;
}
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
bnao--;
while(!s4);
if(bnao==-1)
{
bnao=59;
}
}
}
}
void tiaoanao()
{
if(s3==0)
{
delay(5);
if(s3==0)
{
anao++;
while(!s3);
if(anao==24)
{
anao=0;
}
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
anao--;
while(!s4);
if(anao==-1)
{
anao=23;
}
}
}
}
void tiaofen()
{
if(s3==0)
{
delay(5);
if(s3==0)
{
fen++;
while(!s3);
if(fen==60)
{
fen=0;
}
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
fen--;
while(!s4);
if(fen==-1)
{
fen=59;
}
}
}
}
void tiaoshi()
{
if(s3==0)
{
delay(5);
if(s3==0)
{
shi++;
while(!s3);
if(shi==24)
{
shi=0;
}
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
shi--;
while(!s4);
if(shi==-1)
{
shi=23;
}
}
}
}
void dzhx() //大月轉(zhuǎn)小月
{
if(ri==31)
{
if(yue==4||yue==6||yue==9||yue==11)
{
ri=30;
}
}
}
void dxtpr() //大小月調(diào)平潤 月
{
if(ri==30||ri==31)
{
if(yue==2)
{
if(nian%4!=0||nian%400==0)
{
ri=28;
}
if(nian%400==0||nian%100!=0&&nian%4==0)
{
ri=29;
}
}
}
}
void rzhp() //特殊年份調(diào)整
{
if(ri==29)
{
if(yue==2)
{
if(nian%4!=0||nian%400==0) //當是平年時
{
ri=28;
}
}
}
}
void tiaori()
{
if(s3==0)
{
delay(5);
if(s3==0)
{
if(yue==4||yue==6||yue==9||yue==11)
{
ri++;
while(!s3);
if(ri==31)
{
ri=1;
}
}
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
{
ri++;
while(!s3);
if(ri==32)
{
ri=1;
}
}
if(nian%400==0||nian%100!=0&&nian%4==0) //當是閏年時二月運行
{
if(yue==2)
{
ri++;
{
while(!s3);
if(ri==30)
{
ri=1;
}
}
}
}
if(nian%4!=0||nian%400==0)
{
if(yue==2) //當是平年時二月運行
{
ri++;
while(!s3);
if(ri==29)
{
ri=1;
}
}
}
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
if(yue==4||yue==6||yue==9||yue==11)
{
ri--;
while(!s4);
if(ri==-1)
{
ri=30;
}
}
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
{
ri--;
while(!s4);
if(ri==-1)
{
ri=31;
}
}
if(nian%400==0||nian%100!=0&&nian%4==0) //當是閏年時二月運行
{
if(yue==2)
{
ri--;
{
while(!s4);
if(ri==-1)
{
ri=29;
}
}
}
}
if(nian%4!=0||nian%400==0)
{
if(yue==2) //當是平年時二月運行
{
ri--;
while(!s4);
if(ri==-1)
{
ri=28;
}
}
}
}
}
}
void tiaozhou()
{
zhoubian();
if(s3==0)
{
delay(5);
if(s3==0)
{
zhou++;
if(zhou==8)
{
zhou=1;
}
while(!s3);
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
zhou--;
if(zhou==0)
{
zhou=7;
}
while(!s4);
}
}
}
void tiaoyue()
{
if(s3==0)
{
delay(5);
if(s3==0)
{
yue++;
if(yue==13)
{
yue=1;
}
while(!s3);
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
yue--;
if(yue==0)
{
yue=12;
}
while(!s4);
}
}
dxtpr();
dzhx();
}
void tiaonian()
{
if(s3==0)
{
delay(5);
if(s3==0)
{
nian++;
while(!s3);
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
nian--;
while(!s4);
}
}
rzhp();
}
void keyscan() //按鍵
{
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
while(!s1);
}
}
switch(s1num)
{
case 0:
shijian();
break;
case 1:
rili();
break;
case 2:
xingqi();
break;
case 3:
nao();
break;
case 4:
s1num=0;
break;
}
}
void qie()
{
if(s2==0)
{
delay(5);
if(s2==0)
{
s2num++;
while(!s2);
}}
if(s1num==0)
{
switch(s2num)
{
case 1:
tiaofen();
break;
case 2:
tiaoshi();
break;
case 3:
s2num=0;
break;
}}
if(s1num==1)
{
switch(s2num)
{
case 1:
tiaori();
break;
case 2:
tiaoyue();
break;
case 3:
tiaonian();
break;
case 4:
s2num=0;
break;
}}
if(s1num==2)
{
tiaozhou();
}
if(s1num==3)
{
switch(s2num)
{
case 1:
tiaoanao();
break;
case 2:
tiaobnao();
break;
case 3:
s2num=0;
break;
}
}
}
void main() //新作
{
init();
while(1)
{
keyscan();
qie();
}
}
|