天天看點

51單片機(十八)—— 定時器0執行個體測試

        在本文中,我們對51單片機的定時器0進行測試。用定時器0來定時,并用來控制LED閃爍。定時器0的初始化代碼如下所示。

void init_T0(void)
{
	TMOD|= 0x01;	  //使用方式1,16位定時器		     
	TH0=0x00;	      //給TH0和TL0賦初值,計數器由0開始計數,到65535溢出
	TL0=0x00;
	EA=1;            //總中斷打開
	ET0=1;           //定時器中斷打開
	TR0=1;           //定時器開關打開
}
           

        在這個實驗中,采用定時器0的方式1進行定時。方式1為16位定時器方式。TH0和TL0的初始值都設定為0x00,則定時器0的計數為由0計數到65535之後溢出,及需要65536個機器周期溢出。采用12MHz的外部晶振,機器周期為1us。則定時器0的溢出周期為65.536ms。每兩個周期LED燈閃一次,是以,LED的閃爍頻率為1/(2*65.536ms)≈7.6Hz。

        在程式中,TMOD|= 0x01;這個語句對TMOD寄存器進行指派。TMOD|= 0x01;這一句是TMOD= TMOD| 0x01;的簡寫。“|”為按位或的運算。0x01的二進制值為00000001,它與TMOD進行按位或的運算結果為TMOD的bit0位強制置為1,其它位保持不變。

       EA=1;          

       ET0=1;         

       TR0=1;

這三句分别對IE寄存器的EA位和ET0位以及TCON寄存器的TR0位進行指派。可以看出對TMOD和IE、TCON的指派方式是不一樣的。原因在于TMOD這個寄存器不能進行位尋址,指派時必須對整個寄存器進行指派。而IE和TCON這兩個寄存器是可以進行位尋址的,程式設計時可以對其中的位直接進行指派。

        在這個程式中,以中斷方式處理定時器0的溢出事件,中斷處理代碼如下所示。在中斷處理函數中将LED的狀态改變。

void T0_ISR(void) interrupt 1 using 1
{
	TH0=0x00;		  //給TH0和TL0重新指派
	TL0=0x00;
	LED=~LED;        //LED的值取反,改變燈的狀态。
}
           

        中斷服務程式的标準格式為:

    void 函數名() interrupt 中斷号 using 工作組

         中斷函數不能傳回任何值,是以最前面用void;後邊緊跟着函數名,名字可以由使用者自己決定,但不要違反C語言的标準;中斷函數不帶任何參數,是以函數名後邊的括号内為空或者寫void;中斷号是指中斷源的編号,這個編号是編譯器識别不同中斷的唯一辨別,是以在寫中斷服務程式時務必要寫正确;“using 工作組”是指這個中斷函數使用單片機記憶體中4組工作寄存器中的哪一組,編譯器在編譯程式時會自動配置設定工作組,是以最後這句通常可以省略不寫,比如源程式可以寫成:void T0_ISR(void) interrupt 1。

        将程式燒寫到單片機中,并運作,可以看到LED連續閃爍。