1. 程式人生 > >51微控制器定時器

51微控制器定時器

sTC微控制器定時器的使用可以說非常簡單,只要掌握原理,有一點的C語言基礎就行了。要點有以下幾個:

1.      一定要知道英文縮寫的原形,這樣暫存器的名字就不用記了。

理解是最好的記憶方法。好的教材一定會給出所有英文縮寫的原形。

2.      儘量用形像的方法記憶。

比如TCONTMOD兩個暫存器各位上的功能,教程一般有個圖表,你就在學習中不斷回憶那個圖表的形像。

3.      TMOD:定時器/計數器模式控制暫存器(TIMER/COUNTERMODE CONTROL REGISTER

定時器/計數器模式控制暫存器TMOD是一個逐位定義的8位暫存器,但只能使用位元組定址,其位元組地址為

89H。其格式為:其中低四位定義定時器/計數器C/T0,高四位定義定時器/計數器C/T1,各位的說明:

(1)GATE
——門控制。
GATE=1
時,由外部中斷引腳INT0INT1來啟動定時器T0T1INT0引腳為高電平時TR0置位,啟動定時器T0INT1引腳為高電平時TR1置位,啟動定時器T1
GATE=0
時,僅由TR0,TR1置位分別啟動定時器T0T1

(2)C/T
——功能選擇位
C/T=0
時為定時功能,C/T=1時為計數功能。置位時選擇計數功能,清零時選擇定時功能。

(3)M0
M1——方式選擇功能由於有2位,因此有4種工作方式:
M1M0
工作方式計數器模式 TMOD(設定定時器模式)
0 0
方式0 13位計數器 TMOD=0x00
0 1
方式1 16位計數器 TMOD=0x01
1 0
方式2 自動重灌8位計數器 TMOD=0x02
1 1
方式3 T0分為28位獨立計數器,T1為無中斷重灌8位計數器 TMOD=0x03
微控制器定時器0設定為工作方式1TMOD=0x01                   
這裡我們一定要知道,TMODTTIMER/COUNTER的意思,MODMODE的意思。至於每位上的功能,你只要記住圖表,並知道每個英文縮寫的原型就可以了。在程式中用到TMOD時,先立即回憶圖表,並根據縮寫的單詞原形理出每位的意義,如果意義不是很清楚,就查下手冊,幾次下來,TMOD的圖表就已經在腦子裡了。

8
GATE位,本身是門的意思。

7
C/T    Counter/Timer
6
M1         Mode 1
5
M0         Mode 0

4.     TCON:定時器/計數器控制暫存器(TIMER/COUNTER CONTROL REGISTER
TMOD
分成2段,TCON控制更加精細,分成四段,在本文中只要用到高四段。
TF0(TF1)
——計數溢位標誌位,當計數器計數溢位時,該位置11TR0TR1)——定時器執行控制位TR0TR1)=0  停止定時器/計數器工作TR0TR1)=1  啟動定時器/計數器工作2IE0IE1)——外中斷請求標誌位

CPU取樣到P3.2P3.3)出現有效中斷請求時,此位由硬體置1。在中斷響應完成後轉向中斷服務時,再由硬體自動清03IT0IT1)——外中斷請求訊號方式控制位IT0IT1=1脈衝方式(後沿負跳有效)IT0IT1)=0電平方式(低電平有效)此位由軟體置1或清04TF0TF1)——計數溢位標誌位當計數器產生計數溢位時,此位由硬體置1。當轉向中斷服務時,再有硬體自動清0。計數溢位的標誌位的使用有兩種情況:採用中斷方式時,作中斷請求標誌位來使用;採用查詢方式時,作查詢狀態位來使用。注意記憶方法,理解單詞原形,就絕對不會把TFTR搞混。TFF也就是溢位OverFlowFTRR就是執行Run。預設是0不執行,當然要置1才執行。

5.     STC微控制器STC89C52RC定時器延時時間的計算

延時時間要根據晶振頻率計算,不同板子可能有所不同。時鐘週期:
1/
時鐘源,在我現在這塊板子上,晶振頻率是11.0592M,也就是時鐘週期是1/11059200機器週期:一般51微控制器12個時鐘週期,我的板子也就是12/11059200單次定時最長時間:如果是16位的計數器16位最大值是65535,共可計數65536次。基本的常數一定要記住,還要記住8位最大值是255,共可計數256次,還要記住8位上每位代表的數值。
12 * 65536/11059200 = 0.0711 s,
也就是,71 ms內的定時可以單次定時就完成。如果定時時間超過71ms,就要迴圈了。一次定時需要幾次機器週期:計算公式:定時秒數/機器週期比如我要定時1秒, 1/12/11059200= 921600次,16位計數器最大可計數65536次,921600次早就益出了。我們可以每次定時10ms,迴圈100次就可以定時1秒了,1 s縮小100百倍就是10 ms,也就是每次需要計數9216次。

確實計數器初始值:定時10 ms時,如果計數器從0開始計數,我們就不知道什麼時候到了9216次。所以應該計數了9216次,16位計數器最多計數95536次,然後就溢位,一溢位TCONTF位就會置1,我們只要經常檢測TF位就可以知道什麼時候完成10ms的定時了。計算公式:計數器初始值=最大計數次數 -需要計數次數如果定時10 ms,計數器的初始值就是65536 - 9216計算計數器的高位和低位:
16
位的計數器,也就是兩個8位組成,8位的最大計數次數是256。所以:計數器高位 =初始值/256計數器低位 = 初始值%6

6.     STC89C52RC微控制器定時器示例程式碼:

#include

//
如果你的微控制器沒用74hc138擴充套件IO口,下面程式碼可略
sbit enableG1 = P1^3;
sbit enableG2 = P1^4;
sbit selectC  = P1^2;
sbit selectB  = P1^1;
sbit selectA  = P1^0;
void hc138()
{
         enableG1= 1;
         enableG2= 0;
         selectC  =1;
         selectB  =1;
         selectA  =0;
}


typedef unsigned char uint8;
typedef unsigned int uint16;

void main(void)
{    
    uint16 counter;

    hc138();

    TMOD = 0X01;
    TH0  =(65536 - 922) / 256;
    TL0  =(65536 - 922) % 256;
    TR0  =1;

    while(1)
    {
         if(TF0== 1)
        {
            TF0= 0;
            TH0  =(65536 - 922) / 256;
            TL0  =(65536 - 922) % 256;
            counter++;
        }

        if(counter== 64)
        {
             counter= 0;
            P0= ~P0;
        }
    }
}

中斷允許控制暫存器

中斷優先順序控制暫存器