嵌入式系統 - 定時器/計數器



定時器是一種專門的時鐘,用於測量時間間隔。一個從零開始向上計數以測量經過時間的定時器通常稱為秒錶。它是一種從指定的時間間隔倒計時的裝置,用於生成時間延遲,例如,沙漏就是一個定時器。

計數器是一種儲存(有時還顯示)特定事件或過程發生的次數的裝置,相對於時鐘訊號而言。它用於計數微控制器外部發生的事件。在電子學中,可以使用暫存器型別的電路(如觸發器)非常容易地實現計數器。

定時器和計數器的區別

區分定時器和計數器的要點如下:

定時器 計數器
每個機器週期暫存器都會遞增。 暫存器遞增考慮其對應於外部輸入引腳(T0、T1)的 1 到 0 的轉換。
最大計數速率是振盪器頻率的 1/12。 最大計數速率是振盪器頻率的 1/24。
定時器使用內部時鐘的頻率並生成延遲。 計數器使用外部訊號來計數脈衝。

8051 的定時器及其相關暫存器

8051 具有兩個定時器,定時器 0 和定時器 1。它們可以用作定時器或事件計數器。定時器 0 和定時器 1 都是 16 位寬。由於 8051 遵循 8 位架構,因此每個 16 位都被訪問為兩個單獨的低位元組和高位元組暫存器。

定時器 0 暫存器

定時器 0 的 16 位暫存器被訪問為低位元組和高位元組。低位元組暫存器稱為 TL0(定時器 0 低位元組),高位元組暫存器稱為 TH0(定時器 0 高位元組)。這些暫存器可以像任何其他暫存器一樣訪問。例如,指令MOV TL0, #4H 將值移動到定時器 0 的低位元組中。

Timer 0

定時器 1 暫存器

定時器 1 的 16 位暫存器被訪問為低位元組和高位元組。低位元組暫存器稱為 TL1(定時器 1 低位元組),高位元組暫存器稱為 TH1(定時器 1 高位元組)。這些暫存器可以像任何其他暫存器一樣訪問。例如,指令MOV TL1, #4H 將值移動到定時器 1 的低位元組中。

Timer 1

TMOD(定時器模式)暫存器

定時器 0 和定時器 1 都使用相同的暫存器來設定各種定時器操作模式。它是一個 8 位暫存器,其中低 4 位留給定時器 0,高 4 位留給定時器。在每種情況下,低 2 位用於預先設定定時器模式,高 2 位用於指定位置。

TMOD Register

門控- 設定後,定時器僅在 INT(0,1) 為高電平時執行。

C/T- 計數器/定時器選擇位。

M1- 模式位 1。

M0- 模式位 0。

GATE

每個定時器都有啟動和停止的方法。一些定時器透過軟體進行此操作,一些透過硬體進行,還有一些同時具有軟體和硬體控制。8051 定時器同時具有軟體和硬體控制。定時器的啟動和停止由軟體使用指令SETB TR1CLR TR1(對於定時器 1)以及SETB TR0CLR TR0(對於定時器 0)控制。

SETB 指令用於啟動它,並由 CLR 指令停止。只要 TMOD 暫存器中的 GATE = 0,這些指令就會啟動和停止定時器。可以透過使 TMOD 暫存器中的 GATE = 1,由外部源啟動和停止定時器。

C/T(時鐘/定時器)

TMOD 暫存器中的此位用於確定定時器是作為延遲發生器還是事件管理器使用。如果 C/T = 0,則將其用作定時器以生成定時器延遲。建立時間延遲的時鐘源是 8051 的晶體頻率。如果 C/T = 0,則連線到 8051 的晶體頻率也決定了 8051 定時器以規則間隔滴答的速率。

定時器頻率始終是連線到 8051 的晶體頻率的 1/12。儘管各種基於 8051 的系統具有 10 MHz 至 40 MHz 的 XTAL 頻率,但我們通常使用 11.0592 MHz 的 XTAL 頻率。這是因為 8051 的序列通訊波特率。XTAL = 11.0592 允許 8051 系統與 PC 通訊而不會出現錯誤。

M1 / M2

M1 M2 模式
0 0 13 位定時器模式。
0 1 16 位定時器模式。
1 0 8 位自動過載模式。
1 1 分時模式。

定時器的不同模式

模式 0(13 位定時器模式)

模式 0 下的定時器 1 和定時器 0 都作為 8 位計數器工作(帶 32 分頻預分頻器)。定時器暫存器配置為一個 13 位暫存器,由 TH1 的所有 8 位和 TL1 的低 5 位組成。TL1 的高 3 位是不確定的,應忽略。設定執行標誌 (TR1) 不會清除暫存器。當計數從全 1 滾動到全 0 時,設定定時器中斷標誌 TF1。模式 0 操作對於定時器 0 與定時器 1 相同。

模式 1(16 位定時器模式)

定時器模式“1”是一個 16 位定時器,是一種常用模式。它的功能與 13 位模式相同,只是使用了所有 16 位。TLx 從 0 開始遞增到最大 255。一旦達到值 255,TLx 重置為 0,然後 THx 遞增 1。作為完整的 16 位定時器,定時器最多可以包含 65536 個不同的值,並且在 65,536 個機器週期後將溢位回 0。

模式 2(8 位自動過載)

兩個定時器暫存器都配置為 8 位計數器(TL1 和 TL0),並具有自動過載功能。TL1(TL0)的溢位設定 TF1(TF0),並將 TL1(TL0)重新載入為 Th1(TH0)的內容,後者由軟體預設。過載使 TH1(TH0)保持不變。

自動過載模式的好處是您可以使定時器始終包含從 200 到 255 的值。如果您使用模式 0 或 1,則必須在程式碼中檢查以檢視溢位,在這種情況下,將定時器重置為 200。在這種情況下,寶貴的指令會檢查值和/或重新載入。在模式 2 中,微控制器負責此操作。一旦您在模式 2 中配置了定時器,您就不必擔心檢查定時器是否已溢位,也不必擔心重置值,因為微控制器硬體將為您完成所有操作。自動過載模式用於建立常見的波特率。

模式 3(分時模式)

定時器模式“3”稱為分時模式。當定時器 0 置於模式 3 時,它變成兩個獨立的 8 位定時器。定時器 0 是 TL0,定時器 1 是 TH0。這兩個定時器都從 0 計數到 255,並在溢位時重置回 0。定時器 1 的所有位現在都將繫結到 TH0。

當定時器 0 處於分時模式時,真正的定時器 1(即 TH1 和 TL1)可以設定為模式 0、1 或 2,但不能啟動/停止,因為執行此操作的位現在已連結到 TH0。真正的定時器 1 將在每個機器週期遞增。

初始化定時器

確定定時器模式。考慮一個連續執行且獨立於任何外部引腳的 16 位定時器。

初始化 TMOD SFR。使用 TMOD 的最低 4 位並考慮定時器 0。保持兩個位 GATE 0 和 C/T 0 為 0,因為我們希望定時器獨立於外部引腳。由於 16 位模式是定時器模式 1,因此清除 T0M1 並設定 T0M0。實際上,唯一需要開啟的位是 TMOD 的位 0。現在執行以下指令:

MOV TMOD,#01h

現在,定時器 0 處於 16 位定時器模式,但定時器未執行。要以執行模式啟動定時器,請透過執行以下指令設定 TR0 位:

SETB TR0

現在,定時器 0 將立即開始計數,每個機器週期遞增一次。

讀取定時器

16 位定時器可以透過兩種方式讀取。要麼讀取定時器的實際值作為 16 位數字,要麼檢測定時器何時溢位。

檢測定時器溢位

當定時器從其最高值溢位到 0 時,微控制器會自動在 TCON 暫存器中設定 TFx 位。因此,無需檢查定時器的精確值,可以檢查 TFx 位。如果設定了 TF0,則表示定時器 0 已溢位;如果設定了 TF1,則表示定時器 1 已溢位。

廣告