目标:利用定时器中断,每隔1s开启/熄灭LED1灯。
外部中断结构图如下图所示,要使用定时器中断T0,须开启TE0、ET0。:
系统中断号如下图所示:定时器0的中断号为1。
定时器0的工作方式1原理图如下图所示:GATE低电平且TR0为1时,定时器中断即可生效,无需INT0给信号。
通过M0、M1可设置定时器的工作方式,如下图所示:
定时器的初始值:定时器的寄存器为TH0和TL0,在工作方式1下,值累加至65536时溢出,触发定时器中断。因此,设定初值应为: 65536-机器周期的计数。
例如:
振荡周期=1/12us;
状态周期=1/6us;
机器周期=1us;
定时1ms就是1000个机器周期,初值为:65536-1000=64536=0xfc18。
上述步骤可以通过一个小工具软件来计算:
代码如下所示:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED1 = P2^0;//LED对应的端口
//定时器中断初始配置
void time0_init(){
TMOD = 0x01;//工作方式为1
TH0 = 0xFC;//初始值高字节
TL0 = 0x18;//初始值低字节
ET0 = 1;//定时器0中断允许
EA = 1;//打开总中断。
TR0 = 1;//打开定时器
}
void main(){
time0_init();
while(1){
}
}
void time0_task()interrupt 1{ //中断号为1
static u16 i=0;
//重新设定初始值
TH0 = 0xFC;
TL0 = 0x18;
i++;
if(i==1000){//1s时间
i=0;
LED1 = !LED1;//点亮/熄灭LED1灯。
}
}