用c51写一个数码管时钟的程序
时间: 2023-04-05 21:01:39 浏览: 161
有小数点的C51时钟程序
好的,我可以回答这个问题。以下是一个简单的用 C51 编写的数码管时钟程序:
```c
#include <reg51.h>
// 数码管显示的数字
unsigned char code digit[10] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
};
// 定时器中断处理函数
void timer0_isr() interrupt 1 {
static unsigned char cnt = 0;
static unsigned char sec = 0;
static unsigned char min = 0;
static unsigned char hour = 0;
// 计数器加 1
cnt++;
// 每 100ms 更新一次数码管显示
if (cnt == 10) {
cnt = 0;
// 显示秒
P2 = 0x01;
P0 = digit[sec % 10];
P2 = 0x02;
P0 = digit[sec / 10];
// 显示分
P2 = 0x04;
P0 = digit[min % 10];
P2 = 0x08;
P0 = digit[min / 10];
// 显示时
P2 = 0x10;
P0 = digit[hour % 10];
P2 = 0x20;
P0 = digit[hour / 10];
}
// 每秒钟更新一次时间
if (++sec == 60) {
sec = 0;
if (++min == 60) {
min = 0;
if (++hour == 24) {
hour = 0;
}
}
}
}
// 主函数
void main() {
// 定时器初始化
TMOD = 0x01; // 定时器 0 工作在模式 1
TH0 = 0xfc; // 定时器初值为 65536 - 50000 = 15536
TL0 = 0x67;
ET0 = 1; // 允许定时器 0 中断
EA = 1; // 允许总中断
// 数码管初始化
P2 = 0x00;
P0 = 0x00;
// 启动定时器
TR0 = 1;
// 主循环
while (1) {}
}
```
这个程序使用定时器 0 来产生 100ms 的中断,然后在中断处理函数中更新数码管的显示。同时,每秒钟更新一次时间。
阅读全文