51单片机电子时钟年月日代码
时间: 2023-06-15 18:03:58 浏览: 146
51单片机电子时钟
以下是一个简单的基于51单片机的电子时钟年月日代码,可以参考:
```c
#include <reg52.h>
// 数码管段码定义
unsigned char code segCode[] = {
0x3f, // '0'
0x06, // '1'
0x5b, // '2'
0x4f, // '3'
0x66, // '4'
0x6d, // '5'
0x7d, // '6'
0x07, // '7'
0x7f, // '8'
0x6f, // '9'
0x77, // 'A'
0x7c, // 'B'
0x39, // 'C'
0x5e, // 'D'
0x79, // 'E'
0x71, // 'F'
0x00 // 空
};
// 时钟时间结构体
typedef struct {
unsigned char year; // 年
unsigned char month; // 月
unsigned char day; // 日
unsigned char hour; // 时
unsigned char minute; // 分
unsigned char second; // 秒
} Time;
// 时钟时间变量
Time time = {20, 5, 1, 0, 0, 0}; // 初始时间为 2020年5月1日 00:00:00
// 数码管位选和段选控制
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
sbit LED = P2^7;
// 按键控制
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
// 延时函数
void delay(unsigned int t) {
while (t--);
}
// 数码管显示函数
void display(unsigned char pos, unsigned char value) {
unsigned char i;
LSA = 1; LSB = 1; LSC = 1; // 数码管位选控制,关闭所有数码管
P0 = segCode[value]; // 数码管段选控制,设置显示的数字
for (i = 0; i < pos; i++) { // 数码管位选控制,选择要显示的数码管
switch (i) {
case 0: LSA = 0; break;
case 1: LSB = 0; break;
case 2: LSC = 0; break;
}
}
delay(100); // 延时一段时间,提高数码管显示效果
}
// 更新时钟时间
void updateTime() {
time.second++; // 秒加1
if (time.second >= 60) { // 如果秒数大于等于60,进位到分钟
time.second = 0;
time.minute++; // 分钟加1
if (time.minute >= 60) { // 如果分钟数大于等于60,进位到小时
time.minute = 0;
time.hour++; // 小时加1
if (time.hour >= 24) { // 如果小时数大于等于24,进位到下一天
time.hour = 0;
time.day++; // 日加1
switch (time.month) { // 根据月份判断天数
case 2: // 二月份
if ((time.year % 4 == 0 && time.year % 100 != 0) || time.year % 400 == 0) { // 闰年
if (time.day > 29) { // 超过29天,进位到下一个月
time.day = 1;
time.month++;
}
} else { // 非闰年
if (time.day > 28) { // 超过28天,进位到下一个月
time.day = 1;
time.month++;
}
}
break;
case 4: // 四月份、六月份、九月份、十一月份
case 6:
case 9:
case 11:
if (time.day > 30) { // 超过30天,进位到下一个月
time.day = 1;
time.month++;
}
break;
default: // 其他月份
if (time.day > 31) { // 超过31天,进位到下一个月
time.day = 1;
time.month++;
}
break;
}
if (time.month > 12) { // 如果月份大于12,进位到下一年
time.month = 1;
time.year++;
}
}
}
}
}
// 主函数
void main() {
unsigned char i;
unsigned char value[6]; // 存储要显示的值,年月日时分秒
while (1) {
// 更新时间
updateTime();
// 获取要显示的值
value[0] = time.year / 10; // 年的十位
value[1] = time.year % 10; // 年的个位
value[2] = time.month / 10; // 月的十位
value[3] = time.month % 10; // 月的个位
value[4] = time.day / 10; // 日的十位
value[5] = time.day % 10; // 日的个位
if (LED == 0) { // LED 灯亮时,显示时分秒
value[0] = time.hour / 10; // 时的十位
value[1] = time.hour % 10; // 时的个位
value[2] = time.minute / 10; // 分的十位
value[3] = time.minute % 10; // 分的个位
value[4] = time.second / 10; // 秒的十位
value[5] = time.second % 10; // 秒的个位
}
// 显示值
for (i = 0; i < 6; i++) {
display(i, value[i]);
}
// 按键控制
if (KEY1 == 0) { // KEY1 按下,切换年月日和时分秒的显示
while (KEY1 == 0); // 等待按键释放
LED = !LED;
}
if (KEY2 == 0) { // KEY2 按下,时间清零
while (KEY2 == 0); // 等待按键释放
time.year = 20;
time.month = 5;
time.day = 1;
time.hour = 0;
time.minute = 0;
time.second = 0;
}
}
}
```
需要注意的是,该代码只是一个简单的示例,实际应用中还需要添加更多的功能和异常处理。
阅读全文