完成數字鐘系統的軟硬件設計與調試,系統主要功能要求如下:
1. 在給定電路圖基礎上,完成數字鐘系統設計;
2. 可以顯示時間、日期、定時時間,具有鬧鐘功能;
3. 設計按鍵校準并設置時間、日期、鬧鐘時間,切換顯示內容(時間、公歷日期、鬧鐘時間);
4. 鬧鐘時間到,數碼管做相應顯示,蜂鳴器響;
5. 萬年歷功能,重點是大月、小月的設置,平年、閏年2月份的設置;
51單片機程序圖:
#include<reg51.h>
#define uchar unsigned char
unsigned char duanma[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xa3,0xa1}; // 段碼
unsigned char weima[6]={0x01,0x02,0x04,0x08,0x10,0x20}; //位碼
unsigned char saomiao,jishu1,jishu2,shi,fen,miao,banmiao,jishu3,jishu22,nlmiao,Y1,Y2,Y3,nzs,nzf,nzm,year,month,day,jishu4;
unsigned char xianshi[6]={0,0,0,0,0,0};
unsigned char flag;
bit naoling;
bit kaiting=0;
sbit D1=P3^0;
sbit D2=P3^1;
sbit k1=P3^4; //停止 運行
sbit k2=P3^5; //時+1
sbit k3=P3^6; //分+1
sbit k4=P3^7; //秒+1
sbit k5=P0^1; //鬧鐘時+1
sbit k6=P0^2; //鬧鐘分+1
sbit k7=P0^3; //鬧鐘秒
sbit k8=P0^4; // 年+1
sbit k9=P0^5; // 月+1
sbit k10=P0^6; // 日+1
sbit sm=P3^2;
sbit QH=P0^0;
void chushihua (void)
{
TMOD=0x11;
EA=1;
ET0=1;TR0=1;ET1=1;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
Y1=shi;Y2=fen;Y3=miao;
}
void date(void)
{
day++;
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
{
if(day==32)day=1;
}
if((month==4)||(month==6)||(month==9)||(month==11))
{
if(day==31)day=1;
}
if(month==2)
{
if(((((year+2000)%4)==0)&&(((year+2000)%100)!=0))||(((year+2000)%400)==0))
{
if(day==30)day=1;
}
else if(day==29)day=1;
}
if(day==1)
{
month++;
if(month==13)
{
month=1;
year++;
if(year==100)year=0;
}
}
}
void yanshi (void)
{
unsigned char i,j,k;
for(i=250;i>0;i--)
for(j=100;j>0;j--);
for(k=100;k>0;k--);
}
void naol (void) interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
D1=~D1;
}
void shuzizhongduan (void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
if(flag==0)
{
Y1=shi;Y2=fen;Y3=miao;
}
if(flag==1)
{
Y1=nzs;Y2=nzf;Y3=nzm;
}
if(flag==2)
{
Y1=year;Y2=month;Y3=day;
}
xianshi[0]=duanma[Y1/10];
xianshi[1]=duanma[Y1%10];
xianshi[2]=duanma[Y2/10];
xianshi[3]=duanma[Y2%10];
xianshi[4]=duanma[Y3/10];
xianshi[5]=duanma[Y3%10];
jishu1++;
if(jishu1==6)
{
jishu1=0;
}
P2= weima[jishu1];//位碼
P1=xianshi[jishu1];//段碼
jishu2++;
if(jishu2==100)
{
if(naoling)
nlmiao++;
}
jishu2++;
banmiao++;
if(banmiao==100)
{
banmiao=0;
D1=~D1;
D2=~D2;
}
jishu3++;
if(jishu3==200)
{
jishu3=0;
if(kaiting==0)
{
miao++;
}
if(naoling)
{
sm=~sm;
}
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
date();
}
}
}
}
}
void main (void)
{
year=17;month=6;day=15;
shi=23;fen=58;miao=46;
chushihua();
while(1)
{
if(QH==0)
{
flag++;
if(flag==3) flag=0;
if(flag==0)
{
Y1=shi,Y2=fen,Y3=miao;
}
if(flag==1)
{
Y1=nzs;Y2=nzf;Y3=nzm;
}
if(flag==2)
{
Y1=year;Y2=month;Y3=day;
}
while(QH==0) ;
}
P0 = 0xff;
saomiao=P0;
if(saomiao!=0xff)
{
saomiao=P0;
yanshi();
if(saomiao!=0xff)
{
if(flag==1)
{
if(k5==0)
{
if(nzs==23)
{
nzs=0;
}
else
nzs++;
}
if(k6==0)
{
if(nzf==60)
{
nzf=0;
}
else
nzf++;
}
if(k7==0)
{
if(nzm==60)
{
nzm=0;
}
else
nzm++;
}
}
}
}
P0 = 0xff;
saomiao=P0;
if(saomiao!=0xff)
{
saomiao=P0;
yanshi();
if(saomiao!=0xff)
{
if(flag==2)
{
if(k8==0)
{
if(year==99)
{
year=17;
}
else
year++;
}
if(k9==0)
{
if(month==12)
{
month=1;
}
else
month++;
}
if(k10==0)
{
day++;
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
{
if(day==32)day=1;
}
if((month==4)||(month==6)||(month==9)||(month==11))
{
if(day==31)day=1;
}
if(month==2)
{
if(((((year+2000)%4)==0)&&(((year+2000)%100)!=0))||(((year+2000)%400)==0))
{
if(day==30)day=1;
}
else if(day==29)day=1;
}
}
}
}
}
if((shi==nzs)&&(fen==nzf)&&(miao==nzm))
{
TR1=1;
naoling=1;
}
if(nlmiao==5)
{
nlmiao=0;
TR1=0;
naoling=0;
}
P3 = 0xff;
saomiao=P3;
if(saomiao!=0xff)
{
saomiao=P3;
yanshi();
if(saomiao!=0xff)
{
if(k1==0)
{
kaiting=~kaiting;
}
if((k2==0)&&(kaiting==1))
{
if(shi==23)
{
shi=0;
}
else
shi ++;
}
if((k3==0)&&(kaiting==1))
{
if(fen==59)
{
fen=0;
}
else
fen ++;
}
if((k4==0)&&(kaiting==1))
{
if(miao==59)
{
miao=0;
}
else
miao ++;
}
while(P3!=0xff);
}
}
}
}