利用定时器实现60秒计时,从0计时至59s后,重新回到0开始计时,要求采用定时中断方式动态扫描实现
时间: 2023-12-09 08:03:08 浏览: 41
好的,以下是一个基于C51单片机的60秒计时系统,采用定时中断方式动态扫描实现:
```c
#include <reg52.h> // 导入单片机头文件
sbit LED1 = P1^0; // 定义数码管1的控制引脚
sbit LED2 = P1^1; // 定义数码管2的控制引脚
unsigned char code LED_DuanMa[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; // LED数码管段码表,用于显示数字
unsigned char code LED_WeiMa[2] = {0xfe, 0xfd}; // LED数码管位码表,用于选择控制哪个数码管
unsigned char cnt = 0; // 初始计时0秒
void main() {
TMOD = 0x01; // 设置定时器T0为模式1
TH0 = 0x4c; // 设置定时器T0的初值高位为0x4c
TL0 = 0x00; // 设置定时器T0的初值低位为0x00
TR0 = 1; // 打开定时器T0
ET0 = 1; // 打开定时器T0中断
EA = 1; // 打开总中断开关
while(1) {
P0 = LED_DuanMa[cnt / 10]; // 显示计时的十位数
LED1 = 0; // 选择控制数码管1
LED2 = 1; // 不控制数码管2
P0 = LED_DuanMa[cnt % 10]; // 显示计时的个位数
LED2 = 0; // 选择控制数码管2
LED1 = 1; // 不控制数码管1
}
}
void InterruptTimer0() interrupt 1 {
TH0 = 0x4c; // 重新设置定时器T0的初值高位为0x4c
TL0 = 0x00; // 重新设置定时器T0的初值低位为0x00
cnt++; // 每秒钟计时加一
if (cnt == 60) {
cnt = 0; // 计时达到60秒,重置为0秒
}
}
```
上述代码中,我们使用了单片机的定时器T0来实现每秒钟的中断,然后在中断处理函数中将计时的秒数加一,并在主循环中通过数码管显示出来。在计时达到60秒后,将计时重置为0秒。同时,我们也根据计时的秒数通过数码管显示出相应的数字。这样就实现了一个基于C51单片机的60秒计时系统,采用定时中断方式动态扫描实现。