STC89C52RC利用单片机的定时器定时中断原理6个共阳极数码管显示时、分、秒,做成一个时钟C语言代码
时间: 2023-12-10 22:41:58 浏览: 92
以下是一个基本的STC89C52RC利用定时器定时中断实现的时钟代码,可以显示时、分、秒。代码中使用了6个共阳极数码管进行显示。
```c
#include <reg52.h>
unsigned char code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示表
unsigned char second = 0, minute = 0, hour = 0; // 秒、分、小时
void delay(int x) // 延时函数
{
int i, j;
for(i = x; i > 0; i--)
for(j = 110; j > 0; j--);
}
void dis_num() // 数码管显示函数
{
unsigned char a, b, c, d;
a = hour / 10; // 十位小时
b = hour % 10; // 个位小时
c = minute / 10; // 十位分钟
d = minute % 10; // 个位分钟
P2 = 0x80; // 第一位数码管
P0 = table[a];
delay(5);
P2 = 0x40; // 第二位数码管
P0 = table[b];
delay(5);
P2 = 0x20; // 第三位数码管
P0 = table[c];
delay(5);
P2 = 0x10; // 第四位数码管
P0 = table[d];
delay(5);
}
void timer0() interrupt 1 // 定时器0中断函数
{
TH0 = (65536 - 50000) / 256; // 50ms计时
TL0 = (65536 - 50000) % 256;
second++; // 秒加1
if(second == 60) // 秒满60进位
{
second = 0;
minute++;
if(minute == 60) // 分满60进位
{
minute = 0;
hour++;
if(hour == 24) // 时满24归零
{
hour = 0;
}
}
}
dis_num(); // 数码管显示
}
void init() // 初始化函数
{
TMOD = 0x01; // 设置为定时器0模式1
TH0 = (65536 - 50000) / 256; // 50ms计时
TL0 = (65536 - 50000) % 256;
EA = 1; // 总中断允许
ET0 = 1; // 定时器0中断允许
TR0 = 1; // 定时器0启动
}
void main()
{
init(); // 初始化
while(1); // 循环等待中断
}
```
需要注意的是,定时器的中断时间和数码管显示的延时时间需要根据具体硬件情况进行调整,以保证实际效果正确。
阅读全文