計時器是一種專門用來測量時間間隔的時鐘。從零開始向上計數以測量所用時間的計時器通常稱爲秒表。它是一種從指定的時間間隔開始倒計時並用來產生時間延遲的設備,例如,沙漏就是計時器。
A計數器是存儲(有時顯示)與時鐘信號有關的特定事件或過程發生的次數的設備。它用於統計微控制器外部發生的事件。在電子學中,計數器可以很容易地使用寄存器型電路(如觸發器)來實現。
Difference between a Timer and a Counter
計時器和計數器的區別點如下所示;
Timer | Counter |
---|---|
The register incremented for every machine cycle. | The register is incremented considering 1 to 0 transition at its corresponding to an external input pin (T0, T1). |
Maximum count rate is 1/12 of the oscillator frequency. | Maximum count rate is 1/24 of the oscillator frequency. |
A timer uses the frequency of the internal clock, and generates delay. | A counter uses an external signal to count pulses. |
Timers of 8051 and their Associated Registers
8051有兩個定時器,定時器0和定時器1。它們可以用作計時器或事件計數器。計時器0和計時器1都是16位寬。由於8051遵循8位體系結構,因此每16位作爲低字節和高字節的兩個獨立寄存器被訪問。
Timer 0 Register
定時器0的16位寄存器作爲低字節和高字節訪問。低字節寄存器稱爲TL0(定時器0低字節),高字節寄存器稱爲TH0(定時器0高字節)。這些寄存器可以像任何其他寄存器一樣訪問。例如,指令MOV TL0,#4H將值移到計時器0的低位字節。
Timer 1 Register
定時器1的16位寄存器作爲低字節和高字節訪問。低字節寄存器稱爲TL1(定時器1低字節),高字節寄存器稱爲TH1(定時器1高字節)。這些寄存器可以像任何其他寄存器一樣訪問。例如,指令MOV TL1,#4H將值移到計時器1的低位字節。
TMOD (Timer Mode) Register
定時器0和定時器1使用相同的寄存器來設置各種定時器操作模式。它是一個8位寄存器,其中低4位留給定時器0,高4位留給定時器。在每種情況下,低2位用於預先設置定時器模式,高2位用於指定位置。
Gate−設置時,計時器僅在INT(0,1)高時運行。
C/T−計數器/定時器選擇位。
M1−模式位1。
M0−模式位0。
GATE
每一個計時器都有啓動和停止的方法。有些計時器是通過軟體來完成的,有些計時器是通過硬體來完成的,有些計時器同時具有軟體和硬體控制。8051定時器有軟體和硬體控制。定時器的啓動和停止由軟體控制,對於定時器1使用指令SETB TR1和CLR TR1,對於定時器0使用指令SETB TR0和CLR TR0。
SETB指令用於啓動它,它被CLR指令停止。只要TMOD寄存器中的GATE=0,這些指令就會啓動和停止計時器。通過在TMOD寄存器中設置GATE=1,定時器可以由外部源啓動和停止。
C/T (CLOCK / TIMER)
TMOD寄存器中的該位用於確定計時器是用作延遲生成器還是用作事件管理器。如果C/T=0,則用作產生計時器延遲的計時器。產生時間延遲的時鐘源是8051的晶體頻率。如果C/T=0,附著在8051上的晶體頻率也決定了8051定時器以固定間隔計時的速度。
定時器頻率始終是連接到8051的晶體頻率的1/12。雖然各種基於8051的系統的XTAL頻率爲10兆赫到40兆赫,但我們通常使用的XTAL頻率爲11.0592兆赫。這是因爲8051.XTAL=11.0592的串行通信波特率允許8051系統與PC進行無錯誤通信。
M1 / M2
M1 | M2 | Mode |
---|---|---|
0 | 0 | 13-bit timer mode. |
0 | 1 | 16-bit timer mode. |
1 | 0 | 8-bit auto reload mode. |
1 | 1 | Spilt mode. |
Different Modes of Timers
Mode 0 (13-Bit Timer Mode)
模式0中的定時器1和定時器0都作爲8位計數器(帶32分頻器)工作。定時器寄存器被配置爲13位寄存器,由TH1的所有8位和TL1的較低5位組成。TL1的高位3位不確定,應忽略。設置運行標誌(TR1)不會清除寄存器。當計數從所有1s轉爲所有0s時,定時器中斷標誌TF1被設置。定時器0的模式0操作與定時器1的相同。
Mode 1 (16-Bit Timer Mode)
定時器模式「1」是16位定時器,是一種常用模式。它的工作方式與13位模式相同,只是使用了所有16位。TLx從0開始遞增,最大爲255。一旦達到值255,TLx重置爲0,然後THx增加1。作爲一個完整的16位計時器,該計時器最多可包含65536個不同的值,並且在65536個機器周期後將溢出回0。
Mode 2 (8 Bit Auto Reload)
這兩個定時器寄存器都配置爲8位計數器(TL1和TL0),具有自動重新加載功能。從TL1(TL0)溢出設置TF1(TF0),並用軟體預設的Th1(TH0)的內容重新加載TL1(TL0)。重新加載保持TH1(TH0)不變。
自動重新加載模式的好處是,您可以讓計時器始終包含200到255之間的值。如果使用模式0或1,則必須簽入代碼以查看溢出,在這種情況下,將計時器重置爲200。在這種情況下,寶貴的指令檢查值和/或重新加載。在模式2中,微控制器負責處理這個問題。一旦你在模式2中配置了一個定時器,你就不必擔心檢查定時器是否溢出,也不必擔心重置值,因爲微控制器硬體會爲你做所有的事情。自動重新加載模式用於建立公共波特率。
Mode 3 (Split Timer Mode)
定時器模式「3」被稱爲分割定時器模式。當定時器0處於模式3時,它變成兩個獨立的8位定時器。定時器0是TL0,定時器1是TH0。兩個計時器的計數範圍爲0到255,如果溢出,則重置回0。計時器1的所有位現在都將綁定到TH0。
當定時器0處於分割模式時,實際定時器1(即TH1和TL1)可以在模式0、1或2中設置,但不能啓動/停止,因爲這樣做的位現在連結到TH0。實際定時器1將隨著每一個機器周期遞增。
Initializing a Timer
決定定時器模式。考慮一個連續運行的16位定時器,它獨立於任何外部引腳。
初始化TMOD SFR。使用TMOD的最低4位並考慮計時器0。保持兩位,門0和C/T 0爲0,因爲我們希望計時器獨立於外部引腳。由於16位模式是定時器模式1,清除T0M1並設置T0M0。實際上,唯一要打開的位是TMOD的位0。現在執行以下指令−
MOV TMOD,#01h
現在,計時器0處於16位計時器模式,但計時器未運行。要在運行模式下啓動計時器,請執行以下指令設置TR0位−
SETB TR0
現在,定時器0將立即開始計數,每一個機器周期遞增一次。
Reading a Timer
16位計時器可以通過兩種方式讀取。要麼將計時器的實際值讀取爲16位數字,要麼檢測計時器何時溢出。
Detecting Timer Overflow
當定時器從其最高值溢出到0時,微控制器自動在TCON寄存器中設置TFx位。因此,可以檢查TFx位,而不是檢查計時器的確切值。如果設置了TF0,則計時器0溢出;如果設置了TF1,則計時器1溢出。