51单片机数码管显示时间代码 - 实现实时时钟功能
51单片机数码管显示时间代码
本代码使用51单片机控制数码管显示时间,实现了一个简单的实时时钟功能。
代码实现
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = { // 数码管0~9的编码表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
void delay(uint xms) { // 延时函数
uint i, j;
for (i = xms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display(uchar num, uchar pos) { // 数码管显示函数
P2 = 0xff; // 先关闭所有数码管
P0 = table[num]; // 显示数字
P2 = ~(1 << pos); // 打开对应位置的数码管
}
void main() {
uchar hour, minute, second;
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x3c; // 定时器0初值,1ms
TL0 = 0xb0;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许全局中断
hour = 12; // 初始时间为12:00:00
minute = 0;
second = 0;
while (1) {
display(hour / 10, 3); // 显示小时的十位数
delay(5); // 延时5ms,避免闪烁
display(hour % 10, 2); // 显示小时的个位数
delay(5);
display(minute / 10, 1); // 显示分钟的十位数
delay(5);
display(minute % 10, 0); // 显示分钟的个位数
delay(5);
}
}
void timer0() interrupt 1 { // 定时器0中断函数,1ms进一次中断
static uchar cnt = 0;
TH0 = 0x3c;
TL0 = 0xb0;
cnt++;
if (cnt >= 20) { // 每20ms进一次计数
cnt = 0;
second++; // 秒数加1
if (second >= 60) { // 如果秒数超过60,进位到分钟
second = 0;
minute++;
if (minute >= 60) { // 如果分钟超过60,进位到小时
minute = 0;
hour++;
if (hour >= 24) hour = 0; // 如果小时超过24,回到0
}
}
}
}
代码解释
- 定时器0中断:代码使用定时器0中断来实现时间计数,每20ms进一次中断,在中断函数
timer0()中进行秒数、分钟数、小时数的计数。 - 数码管显示函数:
display()函数用于控制数码管的显示,通过传入数字和数码管位置参数来控制显示内容。 - 延时函数:
delay()函数用于产生延时,避免数码管显示闪烁。
注意事项
- 代码中使用的数码管编码表需要根据实际使用的数码管类型进行调整。
- 代码中定时器的计数周期为1ms,可以根据实际需要进行调整,但计数周期越短,时间精度越高,同时对程序的实时性要求也更高。
- 代码中的
hour变量的初始值为12,可以根据实际需要进行修改。
应用场景
- 制作简单的时钟显示器
- 用于其他需要显示时间的项目中
扩展功能
- 可以添加显示日期的功能
- 可以添加闹钟功能
- 可以添加其他功能,例如温度显示、湿度显示等
代码下载
您可以在 GitHub 仓库 中下载本代码。
总结
本代码提供了一种使用51单片机控制数码管显示时间的简单实现方法,可以作为学习和参考。您可以在此基础上进行扩展和改进,制作出更丰富的功能。
原文地址: https://www.cveoy.top/t/topic/l3aC 著作权归作者所有。请勿转载和采集!