使用定时器T1的方式2制作电子时钟,并在led数码管上显示
时间: 2024-03-03 22:47:56 浏览: 18
好的,下面是使用定时器T1的方式2编写的电子时钟程序,可以在8051单片机上运行,并在led数码管上显示时间:
```
#include <reg52.h>
// 数码管段码定义
unsigned char code SegTable[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
// 定时器T1中断处理函数
void T1_ISR() interrupt 3
{
static unsigned char cnt = 0; // 用于计数
static unsigned char sec = 0; // 秒数
static unsigned char min = 0; // 分钟数
static unsigned char hour = 0; // 小时数
TH1 = 0xFC; // 计时器初值
TL1 = 0x18;
cnt++; // 计数器加一
if (cnt == 20) // 20次中断为1秒
{
cnt = 0; // 计数器清零
sec++; // 秒数加1
if (sec == 60) // 60秒为1分钟
{
sec = 0;
min++; // 分钟数加1
if (min == 60) // 60分钟为1小时
{
min = 0;
hour++; // 小时数加1
if (hour == 24) // 24小时为1天
{
hour = 0;
}
}
}
}
}
// 主函数
void main()
{
unsigned char i, j, k;
TMOD = 0x10; // 定时器T1方式2,工作模式1
TH1 = 0xFC; // 计时器初值
TL1 = 0x18;
TR1 = 1; // 启动定时器T1
ET1 = 1; // 允许定时器T1中断
EA = 1; // 允许总中断
while (1)
{
// 将小时数转换成BCD码并显示在数码管的第1和第2位
i = hour / 10;
j = hour % 10;
P2 = 0x01; // 数码管选择第1位
P0 = SegTable[i];
delay(1);
P2 = 0x02; // 数码管选择第2位
P0 = SegTable[j];
delay(1);
// 将分钟数转换成BCD码并显示在数码管的第3和第4位
i = min / 10;
j = min % 10;
P2 = 0x04; // 数码管选择第3位
P0 = SegTable[i];
delay(1);
P2 = 0x08; // 数码管选择第4位
P0 = SegTable[j];
delay(1);
// 将秒数转换成BCD码并显示在数码管的第5和第6位
i = sec / 10;
j = sec % 10;
P2 = 0x10; // 数码管选择第5位
P0 = SegTable[i];
delay(1);
P2 = 0x20; // 数码管选择第6位
P0 = SegTable[j];
delay(1);
}
}
// 延时函数
void delay(unsigned int i)
{
unsigned int j, k;
for (j = i; j > 0; j--)
{
for (k = 125; k > 0; k--);
}
}
```
在这个程序中,我们使用定时器T1的方式2,工作模式1,每20次中断为1秒。在定时器T1的中断处理函数中,我们用一个计数器cnt来计数,当计数器达到20时,说明已经过去1秒,我们就将秒数sec加1,然后根据秒数、分钟数和小时数来更新时间。在主函数中,我们将小时数、分钟数和秒数转换成BCD码并依次显示在数码管的第1~6位上,然后通过延时来控制显示的时间。