51单片机:定时器中断的理解

定时器中断-帮助自己理解

最近复习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。	
  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值