STC89C52RC利用单片机的定时器定时中断原理6个共阳极数码管显示时、分、秒,做成一个时钟C语言代码
时间: 2023-12-10 09:41:54 浏览: 26
以下是利用STC89C52RC单片机定时器定时中断原理实现6个共阳极数码管显示时分秒的C语言代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = { // 共阳极数码管0~9编码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar hour, minute, second; // 定义时、分、秒变量
bit flag = 0; // 定义标志位,用于区分闪烁状态
void delay(uint xms) // 延时函数
{
uint i, j;
for(i=xms; i>0; i--)
for(j=110; j>0; j--);
}
void display() // 数码管显示函数
{
uchar i;
uchar num[6] = { // 定义6个数码管显示内容的数组
hour / 10, hour % 10, minute / 10, minute % 10, second / 10, second % 10
};
for(i=0; i<6; i++) // 循环显示6个数码管
{
if(flag && i == 5) // 如果是闪烁状态下的个位数码管,则不显示
P2 = 0xff;
else
P2 = table[num[i]]; // 显示对应数字
P0 = 0xfe >> i; // 选择对应的数码管
delay(5); // 延时
P0 = 0xff; // 关闭所有数码管
}
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
TH0 = (65536 - 50000) / 256; // 重新赋初值
TL0 = (65536 - 50000) % 256;
second++; // 秒加1
if(second == 60) // 如果秒数等于60,则分加1,秒归零
{
second = 0;
minute++;
if(minute == 60) // 如果分钟等于60,则小时加1,分钟归零
{
minute = 0;
hour++;
if(hour == 24) // 如果小时等于24,则小时归零
hour = 0;
}
}
flag = ~flag; // 每1秒将标志位取反,用于闪烁显示
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1(16位自动重载)下
TH0 = (65536 - 50000) / 256; // 定时器0初值为50ms
TL0 = (65536 - 50000) % 256;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
hour = 0;
minute = 0;
second = 0;
while(1)
{
display(); // 显示函数
}
}
```
注:上述代码中的时钟计时精度为50ms,可根据需要进行调整。