1. 程式人生 > >51微控制器計數/定時器設定

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;
    }
}