帮我写一个c语言的代码用来使动态数码管计时,并用到定时器
时间: 2024-04-30 09:19:01 浏览: 69
好的,以下是一个简单的计时器代码,使用定时器1和动态数码管进行计时显示:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = { // 数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar num1, num2, num3, num4;
uchar cnt1, cnt2, cnt3, cnt4;
void delay(uint t) { // 延时函数
while (t--);
}
void init_timer1() { // 定时器1初始化
TMOD |= 0x10; // 定时器1工作在模式1
TH1 = 0xFC; // 设置定时器1的初值,1ms
TL1 = 0x66;
ET1 = 1; // 允许定时器1中断
TR1 = 1; // 启动定时器1
}
void display() { // 数码管显示函数
P0 = 0xff; // 选择位全灭
P2 = table[num1]; // 显示第1位
P0 = 0xfe; // 选择第1位,其他位全灭
delay(10);
P0 = 0xff; // 选择位全灭
P2 = table[num2]; // 显示第2位
P0 = 0xfd; // 选择第2位,其他位全灭
delay(10);
P0 = 0xff; // 选择位全灭
P2 = table[num3]; // 显示第3位
P0 = 0xfb; // 选择第3位,其他位全灭
delay(10);
P0 = 0xff; // 选择位全灭
P2 = table[num4]; // 显示第4位
P0 = 0xf7; // 选择第4位,其他位全灭
delay(10);
}
void timer1_isr() interrupt 3 { // 定时器1中断服务函数
TH1 = 0xFC; // 重新设置定时器1的初值
TL1 = 0x66;
cnt1++; // 计时器加1
if (cnt1 == 10) { // 经过1秒
cnt1 = 0; // 计数器清零
cnt2++; // 分钟加1
if (cnt2 == 60) { // 经过1分钟
cnt2 = 0; // 计数器清零
cnt3++; // 小时加1
if (cnt3 == 24) { // 经过1小时
cnt3 = 0; // 计数器清零
cnt4++; // 天数加1
}
}
}
num1 = cnt1 % 10; // 计算个位数
num2 = cnt1 / 10;
num3 = cnt2 % 10;
num4 = cnt2 / 10;
display(); // 显示计时数据
}
void main() {
init_timer1(); // 定时器1初始化
while (1);
}
```
这个代码可以计时并且每经过1秒钟就会将计时数据显示在动态数码管上。你可以根据需要进行修改,例如增加按钮控制等功能。
阅读全文