51微控制器計數/定時器設定
51微控制器內部一般有兩個計數/定時器,T0 T1,其框圖如下:
其中TH1 TL1用來設定T1的計數初值,TH0 TL0則用來設定T0的。
一、工作模式設定暫存器TMOD,地址為89H,格式如下圖:
1、GATE——門控位
GATE = 0時,僅由執行控制位TRX(X = 0,1) = 1 來啟動定時/計數器。
GATE = 1時,由TRX(X = 0 , 1) = 1 和 外中斷引腳(INT0 或 INT1)上的高電平共同來啟動
2、M1、M0——工作方式選擇位
0 0——方式0,為13位定時/計數器;
0 1——方式1,為16位定時/計數器;
1 0——方式2,8位初值自動重灌載,將TH和TL分開,TH自動重新裝入TL;
1 1——方式2,僅適用於T0,分成兩個8位計數器,T1停止工作。
3、C/-T——計數器模式和定時器模式選擇位
0——為定時器;1——為計數器,計數器對外部輸入引腳(P3.4和P3.5)的外部脈衝(負跳變)計數。
二、控制暫存器TCON,地址為88H~8FH
低四位與外部中斷有關。
1、TF1、TF0——T1、T0計數溢位標誌位
溢位時由硬體自動將其置1,可以由程式查詢,該位確定溢位。非中斷模式下,軟體清零;中斷方式時,此位為中斷源,
進入中斷服務函式後由硬體自動清零。
2、TR1、TR0——計數執行控制位
1——和GATE位配合(看GATE位設定),啟動計數定時器;
0——停止定時/計數器。該位有軟體置位或者清0。
工作方式1框圖:
三、初值計算
1、機器週期 = 具體晶振頻率 / 分頻數 的倒數
2、初值 = 溢位值 - 機器週期 * 定時時間
假設T0初值為5000,則應該這麼設定:
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
一個程式設計例子:
TMOD = 0X01; //設定t0為16位(01)計時模式,以TR0來啟動計時器
//計算初值
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
EA = 1; //開總中斷
ET0 = 1;//開定時器0中斷
TR0 = 1; //啟動T0
while (1);
定時器中斷服務函式;
void timer0_service(void) interrupt 1 (T1 時這裡應為3)
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256; //打算繼續定時下去時,進入中斷服務函式後,重新設定一下初值。
times++; //這可以產生更大的定時
if (times == 20) {
times = 0;
led = !led;
}
}