STC89C52RC利用单片机的定时器定时中断原理6个共阳极数码管显示时、分、秒,做成一个时钟C语言代码
时间: 2023-12-10 15:42:02 浏览: 35
下面是一个基于STC89C52RC单片机的时钟程序,使用6个共阳极数码管显示时、分、秒。
```c
#include <reg52.h> // 引入51单片机头文件
typedef unsigned char uchar; // 定义无符号字符型
typedef unsigned int uint; // 定义无符号整型
sbit LSA = P2^2; // 定义共阳极数码管LSA引脚
sbit LSB = P2^3; // 定义共阳极数码管LSB引脚
sbit LSC = P2^4; // 定义共阳极数码管LSC引脚
uchar code table[] = { // 数码管显示0-9和空格的编码表
0xC0, // '0'
0xF9, // '1'
0xA4, // '2'
0xB0, // '3'
0x99, // '4'
0x92, // '5'
0x82, // '6'
0xF8, // '7'
0x80, // '8'
0x90, // '9'
0xBF // 空格
};
uchar display[6]; // 定义用于显示的数组
uint second, minute, hour; // 定义秒、分、时变量
uint t; // 定义定时器计数变量
// 定时器0中断服务函数
void Timer0() interrupt 1 {
TH0 = (65536 - 50000) / 256; // 重新赋值计时器初值
TL0 = (65536 - 50000) % 256;
t++; // 定时器计数器加1
if (t >= 20) { // 如果计数器到20,即1秒
t = 0; // 计数器清零
second++; // 秒加1
if (second >= 60) { // 如果秒到60,即1分钟
second = 0; // 秒清零
minute++; // 分钟加1
if (minute >= 60) { // 如果分钟到60,即1小时
minute = 0; // 分钟清零
hour++; // 小时加1
if (hour >= 24) { // 如果小时到24,即1天
hour = 0; // 小时清零
}
}
}
}
}
// 数码管显示函数
void Display() {
uchar i;
for (i = 0; i < 6; i++) { // 循环6次,分别显示时、分、秒
switch (i) {
case 0: // 第1个数码管显示小时的十位
P0 = 0; // 关闭所有数码管
LSA = 1; LSB = 1; LSC = 0; // 选择第1个数码管
P0 = table[hour / 10]; // 显示
break;
case 1: // 第2个数码管显示小时的个位
P0 = 0;
LSA = 1; LSB = 1; LSC = 1;
P0 = table[hour % 10];
break;
case 2: // 第3个数码管显示分钟的十位
P0 = 0;
LSA = 1; LSB = 0; LSC = 0;
P0 = table[minute / 10];
break;
case 3: // 第4个数码管显示分钟的个位
P0 = 0;
LSA = 1; LSB = 0; LSC = 1;
P0 = table[minute % 10];
break;
case 4: // 第5个数码管显示秒钟的十位
P0 = 0;
LSA = 0; LSB = 1; LSC = 0;
P0 = table[second / 10];
break;
case 5: // 第6个数码管显示秒钟的个位
P0 = 0;
LSA = 0; LSB = 1; LSC = 1;
P0 = table[second % 10];
break;
}
delay(5); // 延时一段时间,等待数码管扫描
}
}
// 主函数
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 50000) / 256; // 计时器初值
TL0 = (65536 - 50000) % 256;
ET0 = 1; // 打开定时器0中断
EA = 1; // 打开总中断开关
TR0 = 1; // 启动定时器0
while (1) {
Display(); // 数码管显示函数
}
}
```
在上面的程序中,我们使用定时器0中断来实现时钟的计时功能。计时器每50ms中断一次,当计时器计数器到20时,即1秒,我们就将秒加1。如果秒到60,即1分钟,我们就将分钟加1;如果分钟到60,即1小时,我们就将小时加1;如果小时到24,即1天,我们就将小时清零。
在数码管显示函数中,我们使用一个6个元素的数组来存储时、分、秒,并使用一个for循环来循环显示每个数码管。在循环中,我们使用switch语句来分别显示时、分、秒的十位和个位数。我们使用LSA、LSB和LSC三个引脚来控制选择哪个数码管,并使用delay函数来延时一段时间,等待数码管扫描。
这是一个简单的时钟程序,你可以根据自己的需要进行修改和扩展。