STC89C52RC利用单片机的定时器定时中断原理6个共阳极数码管显示时、分、秒,做成一个时钟C语言代码
时间: 2023-12-10 11:42:00 浏览: 83
STC89C52单片机实现C语言时钟
下面是STC89C52RC单片机利用定时器定时中断原理6个共阳极数码管显示时、分、秒的C语言代码。假设晶振频率为11.0592MHz,要求计时精度为1秒。
```c
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
uchar code table[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x00, // 空
};
uchar second = 0;
uchar minute = 0;
uchar hour = 0;
void delay(uint i) // 延时函数
{
while (i--);
}
void display(uchar num, uchar pos) // 数码管显示函数
{
LSA = LSB = LSC = 1;
P0 = table[num];
switch (pos) {
case 0: LSA = 0; break;
case 1: LSB = 0; break;
case 2: LSC = 0; break;
}
}
void timer0() interrupt 1 // 定时器0中断服务程序
{
TH0 = 0x3c; // 设置定时器初值,11.0592MHz晶振,50ms中断一次
TL0 = 0xb0;
second++; // 秒数加1
if (second == 60) { // 分钟加1
second = 0;
minute++;
if (minute == 60) { // 小时加1
minute = 0;
hour++;
if (hour == 24) { // 天数清零
hour = 0;
}
}
}
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1,16位
TH0 = 0x3c; // 设置定时器初值,11.0592MHz晶振,50ms中断一次
TL0 = 0xb0;
EA = 1; // 打开总中断
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
while (1) {
display(hour / 10, 0); // 显示小时的十位
delay(1000);
display(hour % 10, 1); // 显示小时的个位
delay(1000);
display(minute / 10, 2); // 显示分钟的十位
delay(1000);
display(minute % 10, 3); // 显示分钟的个位
delay(1000);
display(second / 10, 4); // 显示秒钟的十位
delay(1000);
display(second % 10, 5); // 显示秒钟的个位
delay(1000);
}
}
```
需要注意的是,定时器0的中断服务程序中,每50ms将秒数加1,如果秒数累加到60,就将分钟加1,并将秒数清零;如果分钟累加到60,就将小时加1,并将分钟清零;如果小时累加到24,就将小时清零。在主函数中,通过delay函数控制数码管每个位置的显示时间,从而实现时钟的功能。
阅读全文