51单片机万年历代码
时间: 2023-07-02 19:05:26 浏览: 495
以下是一个简单的51单片机万年历代码,供您参考:
```
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 code table[] = {31,28,31,30,31,30,31,31,30,31,30,31}; // 每个月份的天数
u8 code week[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd}; // 数码管显示星期几
u8 year, month, day, w; // 年、月、日、星期几
u8 display[4]; // 数码管显示数组
void delay(u16 i) { // 延时函数
while(i--);
}
void displayDate(u8 year, u8 month, u8 day, u8 w) { // 显示日期
display[0] = year / 10;
display[1] = year % 10;
display[2] = month / 10;
display[3] = month % 10;
P0 = week[w]; // 显示星期几
P2 = 0xff;
P0 = 0x7f; // 清除星期几
P2 = 0xfe;
P0 = display[0];
P2 = 0xfd;
P0 = display[1];
P2 = 0xfb;
P0 = display[2];
P2 = 0xf7;
P0 = display[3];
P2 = 0xef;
P0 = 0x00; // 清空P0口
}
u8 isLeapYear(u8 year) { // 判断是否为闰年
if((year%4==0 && year%100!=0) || year%400==0)
return 1;
else
return 0;
}
void main() {
u8 i;
year = 21; // 2021年
month = 1; // 1月
day = 1; // 1日
w = 5; // 星期五
while(1) {
displayDate(year, month, day, w); // 显示日期
delay(10000); // 延时
day++; // 加一天
if(day > table[month-1]) { // 如果超过该月天数
if(month == 2 && isLeapYear(year)) // 如果是闰年二月
if(day > 29) { // 如果超过29天
day = 1; // 从1号开始
month++; // 进入下一个月
}
else // 不是闰年或者不是二月
day = 1; // 从1号开始
month++; // 进入下一个月
if(month > 12) { // 如果超过12月
month = 1; // 从1月开始
year++; // 进入下一年
}
}
w++; // 加一天
if(w > 6) // 如果超过星期六
w = 0; // 从星期天开始
}
}
```
该代码使用了数码管来显示日期和星期几,每隔一段时间(通过延时函数实现)更新一次日期。在更新日期时,首先判断是否超过该月的天数,如果超过,则进入下一个月或下一年,并且将日期从1号开始。同时,每次更新星期几时,也需要判断是否超过星期六,如果超过,则从星期天重新开始。