51单片机数码管时钟代码
时间: 2023-07-02 14:04:59 浏览: 157
51单片机数码管时钟
5星 · 资源好评率100%
以下是一个简单的51单片机数码管时钟代码,使用了定时器中断和数码管动态扫描技术:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = { // 数码管显示0-9的编码表
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
uchar count = 0; // 计数器
uchar sec = 0, min = 0, hour = 0; // 秒、分、时
void main()
{
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0x3c; // 定时器0初值,1ms
TL0 = 0xb0;
ET0 = 1; // 允许定时器0中断
EA = 1; // 全局中断使能
P2 = 0xff; // 数码管初始值
while (1) {} // 循环等待中断
}
void timer0() interrupt 1 // 定时器0中断处理函数
{
TH0 = 0x3c; // 重新赋值定时器0初值
TL0 = 0xb0;
count++; // 计数器加1
if (count == 100) { // 100ms后执行一次
count = 0;
sec++; // 秒加1
if (sec == 60) { // 一分钟
sec = 0;
min++; // 分加1
if (min == 60) { // 一小时
min = 0;
hour++; // 时加1
if (hour == 24) { // 一天结束
hour = 0;
}
}
}
}
}
void display() // 显示函数
{
uchar i;
uchar code pos[] = { // 数码管位选编码表
0xef, // 第1位,从左往右数
0xdf, // 第2位
0xbf, // 第3位
0x7f // 第4位
};
uchar num[] = { // 数码管显示数据
table[hour / 10], table[hour % 10],
table[min / 10], table[min % 10],
table[sec / 10], table[sec % 10]
};
for (i = 0; i < 4; i++) { // 循环显示4位数码管
P2 = pos[i];
P0 = num[i * 2];
P2 = pos[i];
P0 = num[i * 2 + 1] | 0x80; // 显示小数点
for (count = 0; count < 100; count++) {} // 延时,使数码管亮度更均匀
}
}
```
在程序中,定时器0用于产生1ms的定时中断,每100个定时中断表示经过了1秒钟,然后更新秒、分、时的值,并调用显示函数`display()`进行数码管显示。`display()`函数使用了数码管动态扫描技术,通过循环显示4个数码管的不同位来达到显示6位数字的效果。其中,`pos`数组和`num`数组分别存储了数码管位选和显示数据。
阅读全文