使用STC89C52RC的定时器每一秒让四位数码管加一
时间: 2024-05-09 10:20:08 浏览: 92
51单片机AT89C52控制八个数码管计秒/次
以下是使用STC89C52RC的定时器每一秒让四位数码管加一的代码示例:
```c
#include <reg52.h>
sbit D1 = P2^0; // 数码管位选引脚
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;
unsigned int cnt = 0; // 计数器
void delay(unsigned int n) // 延时函数
{
unsigned int i, j;
for (i = n; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void display(unsigned int num) // 数码管显示函数
{
unsigned char code table[] = { // 数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
D1 = 1; // 显示第一位
P0 = table[num / 1000 % 10];
delay(2);
D1 = 0;
D2 = 1; // 显示第二位
P0 = table[num / 100 % 10];
delay(2);
D2 = 0;
D3 = 1; // 显示第三位
P0 = table[num / 10 % 10];
delay(2);
D3 = 0;
D4 = 1; // 显示第四位
P0 = table[num % 10];
delay(2);
D4 = 0;
}
void timer1_init() // 定时器1初始化函数
{
TMOD |= 0x10; // 定时器1工作在模式1
TH1 = 0xfc; // 计数初值,定时1s
TL1 = 0x18;
TR1 = 1; // 启动定时器1
ET1 = 1; // 允许定时器1中断
EA = 1; // 允许总中断
}
void timer1_isr() interrupt 3 // 定时器1中断服务函数
{
TH1 = 0xfc; // 重新设置计数初值
TL1 = 0x18;
cnt++; // 计数器加1
if (cnt > 9999) {
cnt = 0;
}
}
int main()
{
timer1_init(); // 初始化定时器1
while (1) {
display(cnt); // 数码管显示计数器值
}
return 0;
}
```
这段代码通过定时器1中断每一秒让计数器加一,同时在主函数中不断调用数码管显示函数显示计数器的值。数码管显示函数中使用了延时函数来控制数码管刷新频率。需要注意的是,定时器1工作在模式1,计数初值为0xfc18,这样可以定时1秒。同时,在定时器1中断服务函数中需要重新设置计数初值。
阅读全文