以下是一个使用定时器中断切换任务的示例代码:
//```c
#include <reg52.h>
sbit LED1 = P0^0; // 定义LED1连接的引脚
sbit LED2 = P0^1; // 定义LED2连接的引脚
sbit KEY = P3^2; // 定义按键连接的引脚
unsigned char task_flag = 0; // 标志位,用于指示当前应该执行哪个任务
void delay(unsigned int time) {
unsigned int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 120; j++);
}
void main() {
TMOD = 0x01; // 设置定时器模式为模式1(16位定时器)
TH0 = 0xFC; // 设置定时器的初始值
TL0 = 0x67;
EA = 1; // 开启总中断
ET0 = 1; // 开启定时器中断
TR0 = 1; // 启动定时器
while (1) {
if (task_flag == 0) { // 如果标志位为0,则执行任务1
LED1 = ~LED1; // 切换LED1的状态
delay(1000); // 延时一段时间,控制流水灯的速度
} else { // 如果标志位为1,则执行任务2
LED2 = ~LED2; // 切换LED2的状态
delay(500); // 延时一段时间,控制流水灯的速度
}
}
}
void timer0_isr() interrupt 1 {
TH0 = 0xFC; // 重新加载定时器的初始值
TL0 = 0x67;
task_flag = ~task_flag; // 切换标志位的值
}
```
这段代码使用了51单片机的P0口来控制两个LED灯的亮灭,P3口的第2位作为按键输入。主循环中根据标志位`task_flag`的值来选择执行不同的任务。当标志位为0时,执行任务1,即切换LED1的状态;当标志位为1时,执行任务2,即切换LED2的状态。在定时器中断服务程序中,每次中断都会切换标志位的值,从而实现任务的切换。