基于51单片机和数码管的万年历程序
时间: 2023-08-11 08:06:07 浏览: 114
下面是一个基于S51单片机和数码管的简单万年历程序,供您参考:
```c
#include <reg52.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
sbit DSPORT=P1^0; // 数码管数据口
sbit DSCLK=P1^1; // 数码管时钟口
sbit RCLK=P1^2; // 数码管锁存口
uchar code LED_TBL[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f // 数码管显示表
};
uchar code LED_ADDR_TBL[]={ // 数码管显示地址表
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
};
uchar code WEEK_TBL[][4]={
"Sun","Mon","Tue","Wed","Thu","Fri","Sat"
};
uchar code MONTH_TBL[]={ // 月份天数表
31,28,31,30,31,30,31,31,30,31,30,31
};
uchar g_time[7]; // 存储时间的数组
// 数码管显示函数
void LED_Show(uchar addr, uchar dat)
{
uchar i;
DSPORT=1;
DSCLK=0;
RCLK=0;
for(i=0;i<8;i++)
{
DSCLK=0;
DSPORT=(addr&0x01);
addr>>=1;
DSCLK=1;
}
for(i=0;i<8;i++)
{
DSCLK=0;
DSPORT=(dat&0x01);
dat>>=1;
DSCLK=1;
}
RCLK=1;
RCLK=0;
}
// 数码管显示时间函数
void LED_ShowTime(void)
{
uchar i;
for(i=0;i<8;i++)
{
LED_Show(LED_ADDR_TBL[i], LED_TBL[g_time[i]]);
}
}
// 判断是否为闰年函数
bit IsLeapYear(uchar year)
{
if(year%4==0)
{
if(year%100==0)
{
if(year%400==0)
{
return 1;
}
else
{
return 0;
}
}
else
{
return 1;
}
}
else
{
return 0;
}
}
// 获取当前月份的天数函数
uchar GetMonthDays(uchar year, uchar month)
{
if(month==2 && IsLeapYear(year))
{
return 29;
}
else
{
return MONTH_TBL[month-1];
}
}
// 获取当前日期的星期函数
uchar GetWeekday(uchar year, uchar month, uchar day)
{
uchar century_code, year_code, month_code, weekday;
uchar century, last_two_digits;
century=year/100;
last_two_digits=year%100;
century_code=century%4*2;
year_code=last_two_digits/4;
month_code=0;
switch(month)
{
case 1: case 10: month_code=0; break;
case 2: case 3: case 11: month_code=3; break;
case 4: case 7: month_code=6; break;
case 5: month_code=1; break;
case 6: month_code=4; break;
case 8: month_code=2; break;
case 9: case 12: month_code=5; break;
}
weekday=(century_code+year_code+month_code+day)%7;
return weekday;
}
// 主函数
void main(void)
{
uchar year, month, day, weekday;
uchar i;
ReadTime(); // 读取时间
while(1)
{
year=g_time[6];
month=g_time[4];
day=g_time[3];
weekday=GetWeekday(year, month, day); // 获取星期
LED_ShowTime(); // 显示时间
// 显示日期
LED_Show(LED_ADDR_TBL[7], LED_TBL[10]); // 显示"日"字
LED_Show(LED_ADDR_TBL[6], LED_TBL[day/10]); // 显示日的十位
LED_Show(LED_ADDR_TBL[5], LED_TBL[day%10]); // 显示日的个位
// 显示月份
LED_Show(LED_ADDR_TBL[4], LED_TBL[11]); // 显示"月"字
LED_Show(LED_ADDR_TBL[3], LED_TBL[month/10]); // 显示月的十位
LED_Show(LED_ADDR_TBL[2], LED_TBL[month%10]); // 显示月的个位
// 显示星期
LED_Show(LED_ADDR_TBL[1], LED_TBL[12]); // 显示"周"字
for(i=0;i<3;i++)
{
LED_Show(LED_ADDR_TBL[0]+i, LED_TBL[WEEK_TBL[weekday][i]-'A'+10]); // 显示星期
}
}
}
```
以上程序实现了基本的万年历功能,包括时间、日期、星期的显示。具体实现过程中,您需要根据自己的硬件设备和开发环境进行修改。
阅读全文