定时器中断-帮助自己理解
最近复习51单片机(主要是为了上手stm32做准备),学习到定时器中断这块突然思虑迷乱,搞不懂了。经过一番折腾终于搞明白,特地备份提醒自己。
以定时器中断T1为例:
① 定时器中断的逻辑是先让定时器工作,给定时器一个初值,然后这个定时器从初值一直加加加,当这个数值被加的超过定时器的可容纳范围(也就是数值溢出的时候)的时候,这时候发生中断,去做中断程序中的事儿。
② 也就是说主线任务是定时器的定时工作,也就是从初始值一直加加加,当数值溢出的时候,才去干中断的活。
③ 所以打开定时器的定时开关(TR1=1)并不是意味着打开了中断!!!!只有当数值溢出的时候才去干中断的活儿。
#例子:用定时器T1去使LED隔1S进行闪烁
# include <reg52.h>
# include <math.h>
# include <intrins.h>
# include <string.h>
void main()
{
P0 = 0xfe; //P0口赋初值,P0口与LED的排母相连
TMOD = 0x10; //设置中断模式:T1以工作方式1工作
TH1 = (65536-50000) / 256; //设置定时器的初始值,TH1是高八位
TL1 = (65536-50000) % 256; //低八位
EA = 1; //中断总开关打开
ET1 = 1; //T1的溢出中断允许位开关打开
TF0 = 0; //清除TF0标志位
TR1 = 1; //打开定时器
//注意:当TR1=1时,定时器就开始工作了,也就是前面说的加数
while(1) //开完定时器后,程序进入while(1)中进行死循环
{
}
//注意:如果定时器一直不中断,那么程序就一直在while(1)里面,而不去处理中断程序里面的事儿
}
//当定时器里面的数值溢出时,就发生了定时器触发的中断,这时候程度从while(1)来到了中断程序Timer1()
void Timer1() interrupt 3
{
static int NumberInterrupt = 0;
TH1 = (65536-50000) / 256; //因为数值溢出时定时器的初始数值就清零了,所以这时候再赋值一次
TL1 = (65536-50000) % 256;
NumberInterrupt++; //来一次中断程序就代表发生了一次定时器中断,也就代表数值溢出一次
if(NumberInterrupt==20)
{
NumberInterrupt=0;
P0 = _crol_(P0,1);
}
}
//注意:当定时器数了50000个数的时候,数值才会溢出;也就是说运行50000个机器周期才触发一次定时器中断;
//当中断不到20的时候,因为上面又给定时器赋了初始值,而定时器一直打开着,所以程序又回到while(1)中并且定时器也在工作。
//当中断到20的时候,这时候触发了20次中断,程序就利用这个来给P0口循环移位来控制LED。