新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STC89C52定時器使用方法

STC89C52定時器使用方法

作者: 時間:2016-11-28 來源:網絡 收藏

定時器/計數器0 和定時器/計數器1 都可以在方式0、方式1、方式2 工作,而方式3 只有前者才能
工作。
1. 方式 0
當TMOD 中M1、M0 都為0 時,T/C 工作在方式0。
方式0 為13 位的T/C,由TH 提供高8 位,TL 提供低5 位,注意TL 的高3 位是無效的,計數溢出
值為2 的13 次方=8192,啟動該計數器需要設置好計數初值。
當C/-- T該位為0 時,T/C 為定時器,振蕩源12 分頻的信號作為計數脈沖;當C/-- T該位為1 時,T/C
為計數器,對外部脈沖輸入端的T0 或T1 引腳進行脈沖計數。
計數脈沖能否加到計數器上,受啟動信號的控制。當GATE=0 時,只要TR=1,則T/C 啟動;當GATE=1
時,啟動信號受到TR 與INT 的雙重控制。
T/C 啟動后立即加1 計數,當13 位計數滿時,TH 向高位進位。此進位將中斷溢出標志TF 置位即
TF=1,產生中斷請求,表示定時時間或計數次數到達。若T/C 開中斷(ET=1)且CPU 開中斷(EA=1),

本文引用地址:http://m.butianyuan.cn/article/201611/323027.htm

則當CPU 自動轉向中斷服務函數時,TF 自動清零,不需要人工軟件清零。
2. 方式 1
當TMOD 中M1、M0 為0、1 時,T/C 工作在方式1。
方式1 與方式0 基本相同,唯一不同的是方式0 是13 位計數方式,方式1 是16 位計數方式,TH 和
TL 都同時提供8 位(方式0 時TL 只提供低5 位,高3 位無效),計數溢出值為2 的16 次方=65536。
3. 方式 2
當TMOD 中M1、M0 為1、0 時,T/C 工作在方式2。
方式2 是8 位的可自動重裝載的T/C,滿計數值為2 的8 次方=256。在方式0 和方式1 中,當計數
滿后,若要進行下一次定時/計數,必須通過軟件向TH 和TL 重新裝載預置計數值。方式2 中TH 和TL 被
當作兩個8 位計數器。技術過程中,TH 寄存8 位初值并保持不變,由TL 進行8 位計數。計數溢出時,除
產生溢出中斷請求外,還自動將TH 中初值重裝到TL,即重裝載。除此之外,方式2 也同方式0。
4. 方式 3
方式3 只適合于T/C0。當T/C0 工作在方式3 時,TH0 和TL0 成為兩個獨立的計數器。這時,TL0
可作定時器/計數器,占用T/C0 在TCON 和TMOD 寄存器中的控制位和標志位;而TH0 只能作定時器使用,
占用T/C1 的資源TR1 和TF1。在這種情況下,T/C1 仍可用于方式0/1/2,當不能夠使用中斷方式。
只有將T/C1 用作串行口的波特率方式器時,T/C0 才工作在方式3,以便增加一個定時器。

5. T/C2的工作方式
定時器/計數器2 包含一個16 位重載方式,T/C2 在計數溢出后,自動在瞬間重裝載(像8 位自動重
載方式2)。自動重載可由外部引腳T2EX 的負跳變開始,這樣外部引腳用于產生和其他硬件計數器的同步
信號。T/C2 可以看作看門狗或定時溢出的定時器。
T/C2 還有捕獲方式。把瞬時計數值傳到另外的CPU 可讀取的寄存器對(RCAP2H、RCAP2L)。這樣,
在讀的過程中,兩個字節(jié)的計數值無波動的危險。對于快速變化的計數,比如計數值在讀取高字節(jié)時是16FF
時,到讀取低字節(jié)時已變到1700,結果卻得到1600。若16FF 瞬間捕獲到另外的寄存器,則可以在CPU
空閑的時候取到16 和FF。

#include "stc.h" //加載stc.h 頭文件
unsigned char i=0; //聲明變量i

void main(void) //主函數,程序是在這里運行的
{

TH0=(65536-50000)/256; //計數寄存器高8 位
TL0=(65536-50000)%6; //計數寄存器低8 位
TMOD=0x01; //工作方式為16 位定時器
ET0=0x01; //允許T/C0 中斷
EA=1; // 全部中斷允許
TR0=1; // 啟動T/C0 運行
while(1) // 進入死循環(huán)
{
if(i>7)i=0; //若i>7,則i=0
}
}

void Timer0IRQ(void) interrupt 1 //中斷服務函數
{
TH0=(65536-50000)/256; //計數寄存器高8 位重新載入
TL0=(65536-50000)%6; //計數寄存器低8 位重新載入

84
P2=1<LED
i++; //i 自加1
}

分析:

T/C0 的初始化在main 函數中進行,在while(1)死循環(huán)當中,只有對i 變量檢測,對LED 燈進行
操作主要放置在T/C0 的中斷服務函數Timer0IRQ,即P2=1<很奇怪,main()函數里面基本對單片機的操作什么都沒有,只有對變量i 的檢測操作,幾乎是空載
運作,但是為什么流水燈還是能夠運行呢?那么答案只能有一個,Timer0IRQ()中斷服務函數能夠脫離主
函數獨立運行。
大家很自然地想到為什么Timer0IRQ()函數獨立于main()函數還能夠運行,聯(lián)系到在PC 機的C 語
言的編程是根本不可能的事,因為所有的運行都必選在main()函數體中運行。
只能告訴大家不同的平臺自然有所不同,它們之間的不同必然會有各自的優(yōu)點,還有例如AVR、ARM
單片機編程同樣是“主程序+中斷服務函數”組合的架構,更何況是8051 系列單片機編程。當然我們學會
了8051 系列單片機的編程,自然而然在AVR、ARM 或者更加多的單片機中的編程中得心應手,感覺就是
以不變應萬變



關鍵詞: STC89C52定時

評論


技術專區(qū)

關閉