在本文中,我們對51單片機的定時器2的功能進行測試。包含兩個實驗,一個是定時器2遞增計數功能的測試,另一個是定時器2遞減計數功能的測試。
實驗1:遞增計數
這個實驗使用了定時器2的16位自動重裝模式的遞增計數功能。RCAP2H和RCAP2L寄存器内的值是重新加載的值。當TH2和TL2的計數值溢出時,将RCAP2H和RCAP2L寄存器内的值裝載到TH2和TL2中重新計數。定時器2的初始化代碼如下所示
void init_T2(void)
{
T2MOD= 0x00; //定時器2遞增計數,禁止輸出
CP_RL2=0; //16位自動重裝模式
RCAP2H=(65536-50000)/256; //給RCAP2H和RCAP2L賦初值,
//計數器由15536開始計數,到65535溢出
RCAP2L=(65536-50000)%256; //外部晶振為12MHz,對應的延時時間為50ms
EA=1; //總中斷打開
ET2=1; //定時器中斷打開
TR2=1; //定時器開關打開
}
計時周期為50000個周期,每個周期為1us,是以溢出周期為50ms,中斷處理函數如下所示。
void T2_ISR(void) interrupt 5
{
TF2=0; //清除标志位
i+=1;
if(i>=10) //計時10次改變一次燈的狀态,燈閃的頻率為1Hz
{
i=0;
LED=~LED; //LED的值取反,改變燈的狀态。
}
}
在中斷中,清除TF2中斷标志位,并使用i來計數,每10次中斷改變一次LED狀态。
将程式燒寫到單片機中,看到實驗現象,LED1以1秒一次的頻率閃爍。
實驗2:遞減計數
這個實驗使用了定時器2的16位自動重裝模式的遞減計數功能。定時器2的T2EX引腳與P1.1引腳複用。将T2MOD寄存器中的DCEN位置1,并且将T2EX引腳接地,則定時器2為遞減計數功能。定時器2由0xffff計數,當與計數器TH2和TL2與RCAP2H和RCAP2L的值相同是,産生中斷。定時器2初始化代碼如下所示
void init_T2(void)
{
T2MOD= 0x01; //定時器2遞減計數,禁止輸出
CP_RL2=0; //16位自動重裝模式
RCAP2H=(65535-50000)/256; //給RCAP2H和RCAP2L賦初值,
//計數器由65535開始遞減計數,到15535産生中斷
RCAP2L=(65535-50000)%256; //外部晶振為12MHz,對應的延時時間為50ms
EA=1; //總中斷打開
ET2=1; //定時器中斷打開
TR2=1; //定時器開關打開
}
中斷處理代碼與實驗1是相同的,将程式燒寫到單片機中,看到實驗現象,LED1以1秒一次的頻率閃爍。