51單片機(二十)—— 定時器產生方波信號

         在本文中,我們用定時器0來產生方波信號,包含兩個實驗,實驗1產生一個頻率爲10kHz的方波信號,實驗2產生一個頻率爲100Hz的方波信號。

實驗1

        實驗1 中定時器0的初始化代碼如下所示。

void init_T0(void)
{
	TMOD|= 0x02;	  //使用方式2,8位自動重裝載定時器		     
	TH0=256-50;	      //給TH0和TL0賦初值,計數週期爲50個機器週期
	TL0=256-50;       //採用12MHz的晶振,計時時長爲50us
	EA=1;            //總中斷打開
	ET0=1;           //定時器中斷打開
	TR0=1;           //定時器開關打開
}

代碼中將定時器0設置爲方式2,8位自動重裝載定時器,TL0用來計數,TL0的溢出,不僅置位TF0,而且將TH0的內容重新裝入TL0,TH0內容由初始化時預置爲256-50,即計數週期爲50個機器週期,外部晶振爲12MHz,機器週期爲1us,則計數週期爲50us,採用中斷對定時器0的溢出事件進行處理,中斷代碼如下所示。

void T0_ISR(void) interrupt 1 using 1
{
	PULSE=~PULSE;        //輸出的值取反
}

在中斷函數中只改變了PULSE的狀態,程序中PULSE是P10引腳的宏定義。

        燒寫之後可以看到實驗現象,用示波器測量P10的輸出信號,從示波器中可以看出P10輸出週期爲100us的方波,即頻率爲10KHz的方波。

實驗2

        實驗2中定時器的初始化代碼如下所示

void init_T0(void)
{
	TMOD = 0x00;	  //使用方式0,13位定時器		     
	TH0=(8192-5000)/32;	 //給TH0和TL0賦初值,計數器由3192開始計數,到8191溢出
	TL0=(8192-5000)%32;
	EA=1;            //總中斷打開
	ET0=1;           //定時器中斷打開
	TR0=1;           //定時器開關打開
}

        在這個實驗中,採用定時器0的方式0進行定時。方式0爲13位計數器,由TL0的低5位和TH0的8位構成。TL0的低5位溢出時向TH0進位。TH0計數溢出置位TCON中的溢出標誌位TF0。程序中由3192開始計數,計數到8191溢出。計數週期爲5000個機器週期,即爲5ms。因此產生脈衝的週期爲10ms,脈衝頻率爲100Hz。溢出中斷代碼如下所示。

void T0_ISR(void) interrupt 1 using 1
{
	TH0=(8192-5000)/32;		  //給TH0和TL0重新賦值
	TL0=(8192-5000)%32;
	PULSE=~PULSE;        //PULSE的值取反
}

在中斷中,重新賦值TH0和TL0,並改變PULSE的狀態。

        燒寫之後可以看到實驗現象,用示波器測量JP1上的P10的輸出信號,從示波器中可以看出P10輸出週期爲10ms的方波,即頻率爲100Hz的方波。

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