用51单片机的中断计时系统和两个静态数码管写一个0-59秒的计时器
时间: 2024-05-13 07:15:30 浏览: 89
好的,首先我们需要了解一下51单片机的定时器和中断系统。
51单片机有两个定时器,分别为定时器0(T0)和定时器1(T1)。每个定时器都有一个16位的计数器,可以用来产生中断信号。当定时器计数器溢出时,会触发定时器中断,并执行中断服务程序。
我们可以利用定时器中断来实现计时器的功能。具体实现步骤如下:
1. 初始化定时器1为工作模式1,即16位定时器模式。
2. 设置定时器1的初值为65536-50000=15536,即定时1秒。
3. 打开定时器1中断,并允许总中断开关。
4. 在定时器1中断服务程序中,将计数器加1,如果计数器达到60,则清零并将秒数加1。
5. 将秒数转换为BCD码,并显示在两个静态数码管上。
下面是代码实现:
```c
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = { // 数码管显示表
0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x00
};
uchar second = 0; // 秒数
uint count = 0; // 计数器
void timer1_init() // 定时器1初始化
{
TMOD |= 0x10; // 工作模式1
TH1 = 0x3c; // 初值为15536
TL1 = 0xaf;
ET1 = 1; // 打开定时器1中断
EA = 1; // 允许总中断开关
TR1 = 1; // 启动定时器1
}
void timer1_isr() interrupt 3 // 定时器1中断服务程序
{
TH1 = 0x3c; // 重置初值
TL1 = 0xaf;
count++; // 计数器加1
if (count == 60000) { // 如果计数器达到60秒
count = 0; // 清零计数器
second++; // 秒数加1
if (second == 60) { // 如果秒数达到60秒
second = 0; // 秒数清零
}
}
}
void display(uchar num) // 数码管显示函数
{
P0 = table[num / 10]; // 显示十位数
P2 = 0xfe; // 打开第一位数码管
P2 = 0xff; // 关闭数码管
P0 = table[num % 10]; // 显示个位数
P2 = 0xfd; // 打开第二位数码管
P2 = 0xff; // 关闭数码管
}
void main()
{
timer1_init(); // 定时器1初始化
while (1) {
display(second); // 显示秒数
}
}
```
这样就实现了一个简单的0-59秒计时器。每秒钟数码管上的数字会加1,当达到60秒时会自动清零。
阅读全文