跪求一个基于AT89S51单片机的万年历和电子时钟程序、电路原
刷积分下载文件
#include <REG52.H>
#include <STDIO.H>
#define unchar unsigned char
#define unint unsigned int
int code dispcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //数码管字形表,0-9
int timecnt=19; //定时0中断计数器
int delaycnt=15; //定时1中断计数器
int shift=0;
int timeadd1=0; //时间加1判断
int dateadd1=0; //日期加1
int p=0;
int q=0; //p设置位,q调整;
int data time[]={15,10,11};
int data date[]={2012,10,29};
#define yiwei 0Xfe //定义位选
#define erwei 0Xfd
#define sanwei 0Xfb
#define siwei 0Xf7
//////////////////////////////////////////////////////////////
void timeadd(int i) //时间加1函数
{
if(i)
{
timeadd1--;
if(time[2]==59) //秒加1
{time[2]=0;
time[1]=time[1]+1;
if(time[1]==60) //分加1
{time[1]=0;
time[0]=time[0]+1;
if(time[0]==24) //小时加1
{
time[0]=0;
dateadd1++;
}
}
}
else
time[2]=time[2]+1;
}
}
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
void dateadd(int i) //日期加1函数
{
if(i)
{
dateadd1--;
switch(date[1])
{
case 1: if( date[2]==31)
{
date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
case 2: if((date[0]%400==0)||(date[0]%4==0&&date[0]%100!=0))
{
if(date[2]==29)
{date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
}
else
{
if(date[2]==28)
{date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
}
case 3: if( date[2]==31)
{
date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
case 4: if( date[2]==30)
{
date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
case 5: if( date[2]==31)
{
date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
case 6: if( date[2]==30)
{
date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
case 7: if( date[2]==31)
{
date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
case 8: if( date[2]==31)
{
date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
case 9: if( date[2]==30)
{
date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
case 10: if( date[2]==31)
{
date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
case 11: if( date[2]==30)
{
date[1]=date[1]+1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
case 12: if( date[2]==31)
{
date[0]=date[0]+1;
date[1]=1;
date[2]=1;
break;
}
else date[2]=date[2]+1;
break;
default:break;
}
}
}
//延时函数
void delay(int i)
{
int j=0;
while(j<i)
j++;
}
//显示函数:
void display(int x,int y,int a,int b,int c)
{
switch(p)
{
case 0:
{
if(q!=0)
{ q=0;
do
{
P1=yiwei;
P2=dispcode[b/10];
delay(120);
P1=erwei;
P2=dispcode[b%10];
delay(120);
P1=sanwei;
P2=dispcode[c/10];
delay(120);
P1=siwei;
P2=dispcode[c%10];
delay(120);
}while(delaycnt>1) ;
}
else
{
P1=yiwei;
P2=dispcode[x/10];
delay(120);
P1=erwei;
P2=dispcode[x%10];
delay(120);
P1=sanwei;
P2=dispcode[y/10];
delay(120);
P1=siwei;
P2=dispcode[y%10];
delay(120);
}
break;
}
case 1: //调分钟
{
if(q!=0)
{
q=0;
if(time[1]==59)
time[1]=0;
else time[1]=time[1]+1;
}
if(delaycnt>=8)
{
P1=sanwei;
P2=dispcode[y/10];
delay(120);
P1=siwei;
P2=dispcode[y%10];
delay(120);
P1=yiwei;
P2=dispcode[x/10];
delay(120);
P1=erwei;
P2=dispcode[x%10];
delay(120);
}
P1=yiwei;
P2=dispcode[x/10];
delay(120);
P1=erwei;
P2=dispcode[x%10];
delay(120);
break;
}
case 2: //调小时
{
if(q!=0)
{
q=0;
if(time[0]==23)
time[0]=0;
else time[0]=time[0]+1;
}
if(delaycnt>=8)
{
P1=yiwei;
P2=dispcode[x/10];
delay(120);
P1=erwei;
P2=dispcode[x%10];
delay(120);
P1=sanwei;
P2=dispcode[y/10];
delay(120);
P1=siwei;
P2=dispcode[y%10];
delay(120);
}
P1=sanwei;
P2=dispcode[y/10];
delay(120);
P1=siwei;
P2=dispcode[y%10];
delay(120);
break;
}
case 3: //调日期-日
{
if(q!=0)
{
q=0;
if(date[1]==1||date[1]==3||date[1]==5||date[1]==7||date[1]==8||date[1]==10||date[1]==12)
{
if(date[2]==31)
date[2]=1;
else date[2]=date[2]+1;
}
else if(date[1]==4||date[1]==6||date[1]==9||date[1]==11)
{
if(date[2]>=30)
date[2]=1;
else date[2]=date[2]+1;
}
else if(date[1]==2)
{
if((date[0]%400==0)||(date[0]%4==0&&date[0]%100!=0))
{
if(date[2]>=29)
date[2]=1;
else date[2]=date[2]+1;
}
else if(date[2]>=28)
date[2]=1;
else date[2]=date[2]+1;
}
}
if(delaycnt>=8)
{
P1=sanwei;
P2=dispcode[c/10];
delay(120);
P1=siwei;
P2=dispcode[c%10];
delay(120);
P1=yiwei;
P2=dispcode[b/10];
delay(120);
P1=erwei;
P2=dispcode[b%10];
delay(120);
}
P1=yiwei;
P2=dispcode[b/10];
delay(120);
P1=erwei;
P2=dispcode[b%10];
delay(120);
break;
}
case 4: //调日期-月份
{
if(q!=0)
{
q=0;
if(date[1]==12)
date[1]=1;
else date[1]=date[1]+1;
if((date[2]==31)&&(date[1]==2||date[1]==4||date[1]==6||date[1]==9||date[1]==11))
date[2]=1;
if(date[2]==30&&date[1]==2)
date[2]=1;
if(date[2]==29&&date[1]==2)
if(!((date[0]%400==0)||(date[0]%4==0)&&(date[0]%100!=0)))
date[2]=1;
}
if(delaycnt>=8)
{
P1=yiwei;
P2=dispcode[b/10];
delay(120);
P1=erwei;
P2=dispcode[b%10];
delay(120);
P1=sanwei;
P2=dispcode[c/10];
delay(120);
P1=siwei;
P2=dispcode[c%10];
delay(120);
}
P1=sanwei;
P2=dispcode[c/10];
delay(120);
P1=siwei;
P2=dispcode[c%10];
delay(120);
break;
}
case 5: //调日期-年份
{
if(q!=0)
{
q=0;
date[0]=date[0]+1;
if(!((date[0]%400==0)||(date[0]%4==0)&&(date[0]%100!=0)))
if(date[1]==2&&date[2]==29)
date[2]=1;
}
if(delaycnt>=8)
{
P1=yiwei;
P2=dispcode[a/1000];
delay(300);
P1=erwei;
P2=dispcode[a/100%10];
delay(300);
P1=sanwei;
P2=dispcode[a/10%10];
delay(300);
P1=siwei;
P2=dispcode[a%10];
delay(300);
}
else P1=0xff;
break;
}
default:break;
}
}
void main(void) // 主函数
{
TMOD=0x11;
TH0=((65535-50000)/256); //定时器赋初值
TL0=((65535-50000)%256);
TH1=((65535-50000)/256); //定时器赋初值
TL1=((65535-50000)%256);
ET0=1;
ET1=1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
TR0=1;
TR1=1;
while(1)
{
timeadd(timeadd1);
dateadd(dateadd1);
display(time[0],time[1],date[0],date[1],date[2]);
}
}
//////////////////////////////////////////////////////////////////////////////////
void tiaozheng(void) interrupt 0 //中断0中断函数,设置位数
{
p++;
if(p==6)
p=0;
}
void shezhi(void) interrupt 2 //中断2中断函数,调整
{
q++;
}
//////////////////////////////////////////////////////////////////////////////////////
void t0(void) interrupt 1 using 0 //定时器0中断函数,实现秒
{
TH0+=((65536-50000)/256);
TL0+=((65536-50000)%256);
timecnt--;
if(timecnt==0)
{
timecnt=19;
timeadd1++;
}
}
void t1(void) interrupt 3 using 0 //定时器1中断函数,实现闪烁延时
{
TH0+=((65536-50000)/256);
TL0+=((65536-50000)%256);
delaycnt--;
if(delaycnt==0)
delaycnt=15;
}
谢谢您`````
学习
也想要!
看看
虽然我没写过 估计也不难吧
找同校的师兄问问!至少不会的地方能给你讲讲
为了积分
低调学习
挺长的
求图
oooooooooooooooooooooooooooooooooooooo
同求
这种自己一点都不动脑子,只想不劳而获的帖子就应该删了
