单片机:利用定时器0中断编程

通过对定时器0编制程序使定时器0每隔60ms中断一次,并对P1.0端口的输出状态取反一次。单片机系统主频为12MHz。利用定时器0中断编程。


#include <reg52.h>

sbit LED = P1^0;  // 定义LED连接的IO口

void InitTimer0(void);

void main(void)
{
    InitTimer0();  // 初始化定时器0

    while(1) {
        // 程序运行在中断中,不需要在主函数中添加其他代码
    }
}

void InitTimer0(void)
{
    TMOD |= 0x01;  // 定时器0工作在模式1(16位自动重装载)

    TH0 = (65536 - 12000/1000*60) / 256;  // 设置定时器0初值高位
    TL0 = (65536 - 12000/1000*60) % 256;  // 设置定时器0初值低位

    ET0 = 1;       // 开启定时器0中断
    EA = 1;        // 开启总中断

    TR0 = 1;       // 启动定时器0
}

void Timer0_ISR(void) interrupt 1
{
    static unsigned int count = 0;

    count++;

    if (count == 50) {  // 50次中断后约等于60ms
        count = 0;
        LED = ~LED;    // 取反LED的状态
    }

    TH0 = (65536 - 12000/1000*60) / 256;  // 重新设置定时器0初值高位
    TL0 = (65536 - 12000/1000*60) % 256;  // 重新设置定时器0初值低位
}

解释:

在程序开始处定义了一个 sbit 类型的变量 LED,用于指定 LED 灯所连接的 IO 口(本程序中为 P1.0)。
定义了一个 InitTimer0() 函数,用于初始化定时器0。在该函数中,设置了定时器0的工作模式为模式1(16位自动重装载),设置了定时器0的初值为 (65536 - 12000/1000*60),即每隔 60ms 中断一次。此外,开启了定时器0中断和总中断,启动了定时器0。
定义了一个 Timer0_ISR() 函数,用于处理定时器0中断。在该函数中,定义了一个静态变量 count,每次中断 count 加 1,当 count 等于 50 时(约等于 60ms),取反 LED 的状态,然后将 count 重置为 0。最后,重新设置定时器0的初值,使其继续工作。
在主函数中,调用 InitTimer0() 函数进行初始化。由于程序运行在中断中,因此不需要在主函数中添加其他代码。