定時器中斷(解析)

代碼中註釋爲解釋思路,基於教程中提供的知識步驟(不理解歡迎留言)

# 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時不能初始化,需要保存之前的值*/

}

在這裏插入圖片描述
在這裏插入圖片描述

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