定时器中断(解析)

代码中注释为解释思路,基于教程中提供的知识步骤(不理解欢迎留言)

# include"reg51.h"

typedef unsigned int u16;
sbit led=P1^0;

void timer0init()
{
    TMOD=0X01;//选择16位定时器,或一下来防止干扰定时器T1的设置(高四位)
	TH0=0Xfc;
	TL0=0X18; /*初值为64536,计数1000个溢出,精确计算时间为1ms	
	          计数够了才会溢出去申请中断,然后就会CPU响应中断
			  TF1硬件自动清0,寄存器中定时器T0的8位自动清零*/
	ET0=1;
	EA=1;
	TR0=1; /*为什么TMOD = 0X01不用管高四位全是0会不会影响T1的设置,
	          因为有TR0,所以也只有T0才会开启计数 */
}

void main()
{
	timer0init();//满足中断条件进入中断服务函数
	while(1);
}

void timer0() interrupt 1 //中断号为1
{
	static u16 i;/*设置一个静态局部变量i,初始化i为0,
	              然后函数执行完一次会保留上次的值*/
	TH0=0Xfc;
	TL0=0X18;/*定时器溢出才申请中断,方式1不能自动重装载,
	          所以需要重新设置初值,同时在中断函数中设置
			  定时器初值,*/
	++i;
	if(i==1000)	 
	{
	   i=0;
	   led=~led;
	}  /*函数执行过程:当i不满足1000时,就会退出中断服务函数,
	但是定时器和CPU是相互独立并且它是开启的,所以就会一直计数
	(在设定初值基础上),直到8位溢出再次申请中断,CPU响应中断
	进入中断服务函数,之后CPU进入死循环也没事,因为满足中断条件
	响应后,CPU就会转而去执行中断服务函数,所以中断函数被一次次调用
	i的值在没达到1000时不能初始化,需要保存之前的值*/

}

在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章