定時(shí)器/計(jì)數(shù)器是一種計(jì)數(shù)裝置,若對內(nèi)部時(shí)鐘脈沖計(jì)數(shù),可視為定時(shí)器;若對外部時(shí)鐘脈沖計(jì)數(shù),可視為計(jì)數(shù)器。
定時(shí)器/計(jì)數(shù)器的應(yīng)用可以采用中斷的方式當(dāng)定時(shí)或計(jì)數(shù)達(dá)到時(shí)產(chǎn)生中斷,另外也可以采用詢問的方式,不斷詢問計(jì)數(shù)狀態(tài),以控制程序流程。
8051計(jì)數(shù)寄存器是THx和TLx兩個(gè)8位的寄存器,x=1或x=0。
8051的定時(shí)器/計(jì)數(shù)器
8051單片機(jī)有2個(gè)16位定時(shí)器/計(jì)數(shù)器:定時(shí)器0(Timer0)和定時(shí)器1(Timer1)簡稱T0和T1,8052在包含了T0、T1還有一個(gè)Timer 2(T2)。這三個(gè)定時(shí)器/計(jì)數(shù)器都可作為內(nèi)部定時(shí)器或外部計(jì)數(shù)器。
若是作為內(nèi)部定時(shí)器時(shí),是計(jì)數(shù)內(nèi)部的脈沖。以12MHz的計(jì)數(shù)時(shí)鐘脈沖系統(tǒng)為例,將12MHz/12送入定時(shí)器,此時(shí)定時(shí)器所計(jì)數(shù)的脈沖周期為1us。若采用16位的定時(shí)模式,則最多可計(jì)數(shù)65536個(gè)脈沖(即2^16),約0.0655s。
若作為外部計(jì)數(shù)器時(shí),則是計(jì)數(shù)由T0或T1引腳送入的脈沖。同樣的,若采用16位的定時(shí)模式,最多可計(jì)數(shù)65536(即2^16)個(gè)計(jì)數(shù)量。
定時(shí)器/計(jì)數(shù)器模式寄存器TMOD
定時(shí)器/計(jì)數(shù)器模式寄存器TMOD主要設(shè)定定時(shí)器/計(jì)數(shù)器的工作模式、計(jì)數(shù)信號來源及啟動(dòng)方式等。
TMOD模式寄存器的低四位T0(0-3)配置定時(shí)器/計(jì)數(shù)器0(Timer0)的工作模式,高四位T1(4-7)配置定時(shí)器/計(jì)數(shù)器1(Timer1)的工作模式,這兩部分的結(jié)構(gòu)類似,只是控制的對象不同。
我們以高四位為例來了解TMOD模式寄存器的使用,即使用T 1,(T0一樣的用法):
GATE為Timer的門控開關(guān),用來決定Timer 1(T 1)的啟動(dòng)方式。
若GATE = 0,則只要 TR1 = 1,即可啟動(dòng)Timer 1,稱為內(nèi)部啟動(dòng)或軟件啟動(dòng);
若GATE = 1,則需要 TR1 = 1,還要等待外部中斷引腳INT1為高電平,Timer 1才能啟動(dòng)工作,稱為外部啟動(dòng)或硬件啟動(dòng)。
C/T(Count/Timer)定時(shí)器/計(jì)數(shù)器切換開關(guān):C/T=0為內(nèi)部定時(shí)器,用來計(jì)數(shù)OSC/12的脈沖;C/T=1為外部計(jì)數(shù)模式,用來計(jì)數(shù)由T 1(P3.5)引腳輸入的脈沖;
M0,M1定時(shí)/計(jì)數(shù)模式選擇開關(guān):
Mode0(M1 = 0,M0 = 0):
提供兩個(gè)13位定時(shí)器/計(jì)數(shù)器(Timer 0/Timer 1),如前所述,計(jì)數(shù)量分別存放在TH1和TL1兩個(gè)8位計(jì)數(shù)寄存器里。其中TH1放置8位,TL1放置5。
如前所述,若要執(zhí)行定時(shí)功能,則C/T設(shè)定為0,計(jì)數(shù)內(nèi)部脈沖;若要執(zhí)行計(jì)數(shù)功能,設(shè)置C/T為1,計(jì)數(shù)外部脈沖信號。
啟動(dòng)方式為外部啟動(dòng)時(shí):設(shè)定GATE = 1,TR1=1,再等待外部中斷引腳INT1輸入高電平,即可啟動(dòng) Timer 1;
啟動(dòng)方式為內(nèi)部啟動(dòng)時(shí):設(shè)定GATE = 0,TR1=1,即可啟動(dòng) Timer 1;
Mode1(M1 = 0,M0 = 1):
提供兩個(gè)16位定時(shí)/計(jì)數(shù)器,計(jì)數(shù)量分別存放在THx和TLx兩個(gè)8位計(jì)數(shù)寄存器里。
Mode 1下的定時(shí)器/計(jì)數(shù)器的工作模式切換、啟動(dòng)方式等與Mode 0 完全一樣,Mode 1計(jì)數(shù)量更大,所以完全可以替代Mode 0。
Mode 2(M1 = 1,M0 = 0):
提供兩個(gè)8位可自動(dòng)加載的定時(shí)器/計(jì)數(shù)器(Timer 0和 Timer 1),其計(jì)數(shù)寄存器里的計(jì)數(shù)量放置在TLx里,當(dāng)改定時(shí)器/計(jì)數(shù)器中斷時(shí),會(huì)自動(dòng)將THx計(jì)數(shù)寄存器里的計(jì)數(shù)量載入到TLx里。由于計(jì)數(shù)只用了8位,所以其最大計(jì)數(shù)為256。
Mode 2下的定時(shí)器/計(jì)數(shù)器的工作模式切換、啟動(dòng)方式等與Mode 0 完全一樣。
Mode 3(M1 = 1,M0 = 1):
此工作模式是一種特殊的模式,提供一個(gè)8位的定時(shí)器/計(jì)數(shù)器 Timer 0和一個(gè)8位的定時(shí)器Timer 1。
其中Timer 0除了不具有自動(dòng)加載功能外,與Mode 2的Timer0幾乎完全一樣。
而Timer 1定時(shí)器也幾乎可以被Mode 2的Timer 1所取代。
定時(shí)器/計(jì)數(shù)器控制寄存器TCON
寄存器TCON的高四位一共定時(shí)器/計(jì)數(shù)器的啟動(dòng)開關(guān)和中斷時(shí)的標(biāo)志位,低四位為外部中斷觸發(fā)控制位和外部中斷請求標(biāo)志位,如下圖:
TF1:定時(shí)器Timer 1中斷(溢出)標(biāo)志位。當(dāng)Timer 1時(shí),由硬件自動(dòng)設(shè)定TF1= 1,并向CPU申請中斷。Timer 1中斷結(jié)束時(shí),CPU自動(dòng)對TF1清零。TF1也可以用軟件清零。
TR1:定時(shí)器Timer 1啟動(dòng)開關(guān)。TR=1,Timer 1啟動(dòng),TR1=0關(guān)閉Timer 1。
TF0:定時(shí)器T0溢出標(biāo)志位。其功能與TF1相同。
TR0:定時(shí)器T0運(yùn)行控制位。其功能與TR1相同。
IE1:外部中斷1(INT1)標(biāo)志位。
IT1:外部中斷1(INT1)觸發(fā)方式控制位。
IE0:外部中斷0(INT0)標(biāo)志位。
IT0:外部中斷0(INT0)觸發(fā)方式控制位。
計(jì)數(shù)寄存器:
8051的計(jì)數(shù)寄存器是THx和TLx兩個(gè)8位寄存器,除了Mode 3之外,TH0和TL0是Timer 0所使用的計(jì)數(shù)寄存器,TH1和TL1是Timer 1所使用的的計(jì)數(shù)寄存器。若是8052還有Timer 2所使用的TH2和TL2。
8051定時(shí)器/計(jì)數(shù)器是一種正數(shù)計(jì)數(shù)器。當(dāng)計(jì)數(shù)到滿(溢出)時(shí),即產(chǎn)生中斷。我們計(jì)數(shù)時(shí)用該模式下的最大計(jì)數(shù)量減去所需計(jì)數(shù),即從終點(diǎn)往前推,比如最大計(jì)數(shù)量為100,需要計(jì)數(shù)40,則從60處開始計(jì)數(shù)。
不同模式下的最大計(jì)數(shù)量不同,設(shè)定方式也有差異。
下面對各個(gè)模式下計(jì)數(shù)寄存器分別做說明:
Mode 0
由于Mode 0 TLx計(jì)數(shù)寄存器只使用5位,2^5 = 32,我們要把計(jì)數(shù)起點(diǎn)的值除以32,其余數(shù)放入TLx計(jì)數(shù)寄存器;其商放入THx計(jì)數(shù)寄存器。例如要使用Timer 0計(jì)數(shù)6000,則:
TL0 = (8192 - 6000)% 32;//取低5位
TH0 = (8192 - 6000)/ 32;//取高8位
Mode 1
在此模式下,TLx和THx計(jì)數(shù)寄存器都是8位,而2^8=256,同樣使用Timer 0計(jì)數(shù)6000則
TL0 = (65536 - 6000)% 256;
TH0 = (65536 - 6000)/ 256;
Mode 3
在此模式下,使用TL0計(jì)數(shù)寄存器作為第一個(gè)定時(shí)器/計(jì)數(shù)器的計(jì)數(shù)量,而TH0計(jì)數(shù)寄存器作為第二個(gè)定時(shí)器的計(jì)數(shù)量,用到哪個(gè)就填入哪個(gè)。兩個(gè)都用到就對TL0、TH0分別填入對應(yīng)的值。填入方法與Mode 2一樣。
定時(shí)器/計(jì)數(shù)器的使用
定時(shí)器/計(jì)數(shù)器有兩種使用方式:中斷和查詢
中斷:包括定時(shí)器/計(jì)數(shù)器中斷的設(shè)定、計(jì)數(shù)量的設(shè)定、啟動(dòng)設(shè)定及中斷子程序的編寫
查詢:只要設(shè)定計(jì)數(shù)量及啟動(dòng),然后判斷定時(shí)器/計(jì)數(shù)器的標(biāo)志位(TFx)是否動(dòng)作,接著程序流程的跳轉(zhuǎn)。
中斷設(shè)定(關(guān)于8051的中斷就不展開了):
中斷的設(shè)定包括開啟開關(guān)(IE寄存器的設(shè)定)、中斷優(yōu)先級的設(shè)定(即IP寄存器的設(shè)定)、中斷信號的設(shè)定(TCON寄存器的設(shè)定)等。例如要開啟中斷總開關(guān)及T0開關(guān)(IE為中斷啟用寄存器,IP為中斷優(yōu)先級寄存器):
IE=0x82;//打開中斷總開關(guān)及啟用T0中斷
把T0中斷設(shè)定高優(yōu)先級,并設(shè)定為內(nèi)部定時(shí)器,軟件啟動(dòng)方式,采用Mode 1:
IP=0x02;//T0中斷高優(yōu)先級
TMOD = 0x01;//設(shè)定為內(nèi)部定時(shí)器、軟件啟動(dòng)和Mode 1
計(jì)數(shù)量設(shè)定(略,見上文)
定時(shí)器/計(jì)數(shù)器啟動(dòng)
TRx=1;// 啟動(dòng)Timer x
中斷子程序
中斷程序格式:void +函數(shù)名+interrupt +數(shù)字0—5
0 外部中斷INT0
1 定時(shí)器/計(jì)數(shù)器TF0
2外部中斷INT1
3定時(shí)器/計(jì)數(shù)器TF1
4串行口TI/RI
5定時(shí)器/計(jì)數(shù)器TF2/EXF2(8052才有)
注意區(qū)分定時(shí)器/計(jì)數(shù)器的中斷編號與外部中斷編號,定時(shí)器 0的中斷編號為 1,定時(shí)器 1的中斷編號為 3,定時(shí)器 2的中斷編號為 5。
如:
void my_INT (void) interrupt 3 //Timer 1溢出中斷子程序
{
…….//中斷子程序邏輯代碼
}
評論