单片机日历代码
时间: 2023-07-09 15:15:01 浏览: 58
以下是一个基于8051单片机的简单日历代码:
```
#include<reg51.h>
unsigned char code month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; // 月份天数数组
unsigned char code week[7]={"SunMonTueWedThuFriSat"}; // 星期数组
unsigned char year=2021,month=1,day=1,weekday=0; // 初始时间为2021年1月1日
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
void display(unsigned char num)
{
P2=num;
delay(5);
}
void main()
{
unsigned char i,j;
TMOD=0x01; // 定时器0工作在方式1
TH0=(65536-50000)/256; // 定时50ms
TL0=(65536-50000)%256;
IE=0x82; // 允许定时器0中断,允许全局中断
TR0=1; // 启动定时器0
while(1)
{
for(i=1;i<=12;i++)
{
for(j=1;j<=month[i];j++)
{
weekday++;
if(weekday==7) weekday=0;
if(year%400==0||(year%4==0&&year%100!=0))
if(i==2&&j==29) // 闰年2月29日
break;
display(i/10); // 显示月份十位数
display(i%10); // 显示月份个位数
display(j/10); // 显示日期十位数
display(j%10); // 显示日期个位数
display(weekday*3); // 显示星期
delay(1000); // 延时1秒
}
if(year%400==0||(year%4==0&&year%100!=0))
if(i==2) month[2]=29; // 闰年
month[2]=28; // 平年
}
year++; // 年份加1
}
}
void timer0() interrupt 1
{
static unsigned char cnt=0;
TH0=(65536-50000)/256; // 定时50ms
TL0=(65536-50000)%256;
cnt++;
if(cnt>=20) // 每1秒钟更新一次时间
{
cnt=0;
weekday++;
if(weekday==7) weekday=0;
day++;
if(day>month[month])
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
}
}
}
}
```
这个程序通过定时器0来产生时钟节拍,每1秒钟更新一次时间。在主循环中,程序循环遍历当年的每个月份和日期,并在数码管上显示出来。同时,根据计算出来的星期数,在数码管上显示出来。