通过对定时器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() 函数进行初始化。由于程序运行在中断中,因此不需要在主函数中添加其他代码。