使用STC89C52RC的定时器实现四位数码管累加
时间: 2024-05-05 22:16:52 浏览: 146
以下是使用STC89C52RC的定时器实现四位数码管累加的示例代码:
```c
#include <reg52.h> // STC89C52RC 头文件
sbit LSA = P2^2; // 数码管 A 选择
sbit LSB = P2^3; // 数码管 B 选择
sbit LSC = P2^4; // 数码管 C 选择
unsigned char code table[] = { // 数码管段选编码表
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
};
unsigned char num[4] = {0, 0, 0, 0}; // 四位数码管显示的数值
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 125; j++);
}
void display() // 数码管显示函数
{
unsigned char i;
for(i = 0; i < 4; i++) // 依次选择每个数码管
{
switch(i) // 根据数码管的位置选择不同的选择引脚
{
case 0: LSA = 0; LSB = 0; LSC = 0; break; // 第一位数码管
case 1: LSA = 1; LSB = 0; LSC = 0; break; // 第二位数码管
case 2: LSA = 0; LSB = 1; LSC = 0; break; // 第三位数码管
case 3: LSA = 1; LSB = 1; LSC = 0; break; // 第四位数码管
}
P0 = table[num[i]]; // 数码管段选
delay(1); // 延时一段时间,使数码管显示出来
P0 = 0x00; // 关闭数码管
}
}
void timer0() interrupt 1 // 定时器 0 中断函数
{
TH0 = 0x3C; // 重新设置定时器 0 的初值
TL0 = 0xAF;
num[0]++; // 数码管最低位加 1
if(num[0] == 10) // 如果最低位加到 10
{
num[0] = 0; // 最低位归零
num[1]++; // 次低位加 1
if(num[1] == 10) // 如果次低位加到 10
{
num[1] = 0; // 次低位归零
num[2]++; // 更高位加 1
if(num[2] == 10) // 如果更高位加到 10
{
num[2] = 0; // 更高位归零
num[3]++; // 最高位加 1
if(num[3] == 10) // 如果最高位加到 10
{
num[3] = 0; // 最高位归零
}
}
}
}
}
void main()
{
TMOD = 0x01; // 设置定时器 0 为模式 1
TH0 = 0x3C; // 设置定时器 0 的初值
TL0 = 0xAF;
EA = 1; // 打开总中断开关
ET0 = 1; // 打开定时器 0 中断开关
TR0 = 1; // 启动定时器 0
while(1) // 主循环
{
display(); // 数码管显示函数
}
}
```
这段代码的主要思路是:使用定时器 0 每隔一段时间触发一次中断,中断函数中将四位数码管显示的数值累加 1。数码管显示函数则是根据当前累加的数值依次选择每个数码管,并将相应的数码管段选编码输出到数码管。主循环中不断调用数码管显示函数实现数码管的动态显示。
阅读全文