以下是一个使用定时器中断切换任务的示例代码:
//```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的状态。在定时器中断服务程序中,每次中断都会切换标志位的值,从而实现任务的切换。