采用外部中断控制定时器,用两位数数码管显示60秒计时代码,
时间: 2023-06-16 22:07:35 浏览: 202
这里提供基于51单片机的代码,使用中断控制定时器0,并通过两位数码管显示计时器的值。
```
#include <reg51.h> // 引入51单片机头文件
// 定义端口和控制信号
sbit led1 = P0^0; // LED1 为 P0.0 引脚
sbit led2 = P0^1; // LED2 为 P0.1 引脚
sbit latch = P2^5; // Latch 为 P2.5 引脚
sbit clock = P2^6; // Clock 为 P2.6 引脚
sbit data = P2^7; // Data 为 P2.7 引脚
// 定义变量
unsigned char cnt = 0; // 计数器,初始化为0
// 数码管段码表
unsigned char code seg_tab[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
};
// 中断函数
void timer0_isr() interrupt 1 {
cnt++; // 计数器加1
TH0 = (65536 - 10000) / 256; // 重新设置定时器初值
TL0 = (65536 - 10000) % 256;
}
// 数码管显示函数
void disp(unsigned char dat) {
data = 0; // 置位数字位
latch = 0; // 置位锁存器
latch = 1; // 拉高锁存器
data = 1; // 拉高数字位
data = 0; // 置位数字位
latch = 0; // 置位锁存器
latch = 1; // 拉高锁存器
P0 = seg_tab[dat / 10]; // 显示十位数
data = 0; // 置位数字位
latch = 0; // 置位锁存器
latch = 1; // 拉高锁存器
data = 1; // 拉高数字位
data = 0; // 置位数字位
latch = 0; // 置位锁存器
latch = 1; // 拉高锁存器
P0 = seg_tab[dat % 10]; // 显示个位数
}
// 主函数
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 10000) / 256; // 定时器初值
TL0 = (65536 - 10000) % 256;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开中断
EA = 1; // 开总中断
while (1) {
disp(cnt); // 显示计数器数值
if (cnt >= 60) { // 如果计数器超过60,停止定时器
TR0 = 0;
led1 = 1; // 控制LED1亮
led2 = 0; // 控制LED2灭
}
}
}
```
代码中使用定时器0来进行计时,每次中断计数器加1,同时重新设置定时器初值,以保证定时器可以一直工作下去。在主函数中,通过调用`disp()`函数来显示计数器的值,并在计数器超过60后停止定时器并控制LED1亮、LED2灭。
阅读全文