|
80C51單片機內(nèi)部設(shè)有兩個16位的可編程定時器/計數(shù)器?删幊痰囊馑际侵钙涔δ埽ㄈ绻ぷ鞣绞健⒍〞r時間、量程、啟動方式等)均可由指令來確定和改變。在定時器/計數(shù)器中除了有兩個16位的計數(shù)器之外,還有兩個特殊功能寄存器(控制寄存器和方式寄存器)。 定時器/計數(shù)器的結(jié)構(gòu): 
從上面定時器/計數(shù)器的結(jié)構(gòu)圖中我們可以看出,16位的定時/計數(shù)器分別由兩個8位專用寄存器組成,即:T0由TH0和TL0構(gòu)成;T1由TH1和TL1構(gòu)成。其訪問地址依次為8AH-8DH。每個寄存器均可單獨訪問。這些寄存器是用于存放定時或計數(shù)初值的。此外,其內(nèi)部還有一個8位的定時器方式寄存器TMOD和一個8位的定時控制寄存器TCON。這些寄存器之間是通過內(nèi)部總線和控制邏輯電路連接起來的。TMOD主要是用于選定定時器的工作方式;TCON主要是用于控制定時器的啟動停止,此外TCON還可以保存T0、T1的溢出和中斷標(biāo)志。當(dāng)定時器工作在計數(shù)方式時,外部事件通過引腳T0(P3.4)和T1(P3.5)輸入。 定時計數(shù)器的原理: 16位的定時器/計數(shù)器實質(zhì)上就是一個加1計數(shù)器,其控制電路受軟件控制、切換。 當(dāng)定時器/計數(shù)器為定時工作方式時,計數(shù)器的加1信號由振蕩器的12分頻信號產(chǎn)生,即每過一個機器周期,計數(shù)器加1,直至計滿溢出為止。顯然,定時器的定時時間與系統(tǒng)的振蕩頻率有關(guān)。因一個機器周期等于12個振蕩周期,所以計數(shù)頻率fcount=1/12osc。如果晶振為12MHz,則計數(shù)周期為: T=1/(12×106)Hz×1/12=1μs 這是最短的定時周期。若要延長定時時間,則需要改變定時器的初值,并要適當(dāng)選擇定時器的長度(如8位、13位、16位等)。 當(dāng)定時器/計數(shù)器為計數(shù)工作方式時,通過引腳T0和T1對外部信號計數(shù),外部脈沖的下降沿將觸發(fā)計數(shù)。計數(shù)器在每個機器周期的S5P2期間采樣引腳輸入電平。若一個機器周期采樣值為1,下一個機器周期采樣值為0,則計數(shù)器加1。此后的機器周期S3P1期間,新的計數(shù)值裝入計數(shù)器。所以檢測一個由1至0的跳變需要兩個機器周期,故外部事年的最高計數(shù)頻率為振蕩頻率的1/24。例如,如果選用12MHz晶振,則最高計數(shù)頻率為0.5MHz。雖然對外部輸入信號的占空比無特殊要求,但為了確保某給定電平在變化前至少被采樣一次,外部計數(shù)脈沖的高電平與低電平保持時間均需在一個機器周期以上。 當(dāng)CPU用軟件給定時器設(shè)置了某種工作方式之后,定時器就會按設(shè)定的工作方式獨立運行,不再占用CPU的操作時間,除非定時器計滿溢出,才可能中斷CPU當(dāng)前操作。CPU也可以重新設(shè)置定時器工作方式,以改變定時器的操作。由此可見,定時器是單片機中效率高而且工作靈活的部件。 綜上所述,我們已知定時器/計數(shù)器是一種可編程部件,所以在定時器/計數(shù)器開始工作之前,CPU必須將一些命令(稱為控制字)寫入定時/計數(shù)器。將控制字寫入定時/計數(shù)器的過程叫定時器/計數(shù)器初始化。在初始化過程中,要將工作方式控制字寫入方式寄存器,工作狀態(tài)字(或相關(guān)位)寫入控制寄存器,賦定時/計數(shù)初值。下面我們就提出的控制字的格式及各位的主要功能與大家詳細(xì)的講解。 控制寄存器 定時器/計數(shù)器T0和T1有2個控制寄存器-TMOD和TCON,它們分別用來設(shè)置各個定時器/計數(shù)器的工作方式,選擇定時或計數(shù)功能,控制啟動運行,以及作為運行狀態(tài)的標(biāo)志等。其中,TCON寄存器中另有4位用于中斷系統(tǒng)。 定時器/計數(shù)器方式寄存器TMOD: 定時器方式控制寄存器TMOD在特殊功能寄存器中,字節(jié)地址為89H,無位地址。TMOD的格式如下圖所示。 
由圖可見,TMOD的高4位用于T1,低4使用于T0,4種符號的含義如下: GATE:門控制位。GATE和軟件控制位TR、外部引腳信號INT的狀態(tài),共同控制定時器/計數(shù)器的打開或關(guān)閉。 C/T:定時器/計數(shù)器選擇位。C/T=1,為計數(shù)器方式;C/T=0,為定時器方式。 M1M0:工作方式選擇位,定時器/計數(shù)器的4種工作方式由M1M0設(shè)定。 |
| 工作方式 | 功能描述 | 0 0 0 1 1 0 1 1 | 工作方式0 工作方式1 工作方式2 工作方式3 | 13位計數(shù)器 16位計數(shù)器 自動再裝入8位計數(shù)器 定時器0:分成兩個8位計數(shù)器 定時器1:停止計數(shù) | 定時器/計數(shù)器方式控制寄存器TMOD不能進行位尋址,只能用字節(jié)傳送指令設(shè)置定時器工作方式,低半字節(jié)定義為定時器0,高半字節(jié)定義為定時器1。復(fù)位時,TMOD所有位均為0。
例:設(shè)定定時器1為定時工作方式,要求軟件啟動定時器1按方式2工作。定時器0為計數(shù)方式,要求由軟件啟動定時器0,按方式1工作。
我們怎么來實現(xiàn)這個要求呢?
大家先看上面TMOD寄存器各位的分布圖
第一個問題:控制定時器1工作在定時方式或計數(shù)方式是哪個位?通過前面的學(xué)習(xí),我們已知道,C/T位(D6)是定時或計數(shù)功能選擇位,當(dāng)C/T=0時定時/計數(shù)器就為定時工作方式。所以要使定時/計數(shù)器1工作在定時器方式就必需使D6為0。
第二個問題:設(shè)定定時器1按方式2工作。上表中可以看出,要使定時/計數(shù)器1工作在方式2,M0(D4) M1(D5)的值必須是1 0。
第三個問題:設(shè)定定時器0為計數(shù)方式。與第一個問題一樣,定時/計數(shù)器0的工作方式選擇位也是C/T(D2),當(dāng)C/T=1時,就工作在計數(shù)器方式。
第四個問題:由軟件啟動定時器0,前面已講過,當(dāng)門控位GATE=0時,定時/計數(shù)器的啟停就由軟件控制。
第五個問題:設(shè)定定時/計數(shù)器工作在方式1,使定時/計數(shù)器0工作在方式1,M0(D0) M1(D1)的值必須是0 1。
從上面的分析我們可以知道,只要將TMOD的各位,按規(guī)定的要求設(shè)置好后,定時器/計靈敏器就會按我們預(yù)定的要求工作。我們分析的這個例子最后各位的情況如下:
D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 0 0 1 0 1
二進制數(shù)00100101=十六進制數(shù)25H。所以執(zhí)行MOV TMOD,#25H這條指令就可以實現(xiàn)上述要求。
定時器/計數(shù)器控制寄存器TCON:
TCON在特殊功能寄存器中,字節(jié)地址為88H,位地址(由低位到高位)為88H一8FH,由于有位地址,十分便于進行位操作。
TCON的作用是控制定時器的啟、停,標(biāo)志定時器溢出和中斷情況。
TCON的格式如下圖所示。其中,TFl,TRl,TF0和TR0位用于定時器/計數(shù)器;IEl,ITl,IE0和IT0位用于中斷系統(tǒng)。

各位定義如下:
TF1:定時器1溢出標(biāo)志位。當(dāng)字時器1計滿溢出時,由硬件使TF1置“1”,并且申請中斷。進入中斷服務(wù)程序后,由硬件自動清“0”,在查詢方式下用軟件清“0”。
TR1:定時器1運行控制位。由軟件清“0”關(guān)閉定時器1。當(dāng)GATE=1,且INT1為高電平時,TR1置“1”啟動定時器1;當(dāng)GATE=0,TR1置“1”啟動定時器1。
TF0:定時器0溢出標(biāo)志。其功能及操作情況同TF1。
TR0:定時器0運行控制位。其功能及操作情況同TR1。
IE1:外部中斷1請求標(biāo)志。
IT1:外部中斷1觸發(fā)方式選擇位。
IE0:外部中斷0請求標(biāo)志。
IT0:外部中斷0觸發(fā)方式選擇位。
TCON中低4位與中斷有關(guān),我們將在下節(jié)課講中斷時再給予講解。由于TCON是可以位尋址的,因而如果只清溢出或啟動定時器工作,可以用位操作命令。例如:執(zhí)行“CLR TF0”后則清定時器0的溢出;執(zhí)行“SETB TR1”后可啟動定時器1開始工作(當(dāng)然前面還要設(shè)置方式定)。
定時器/計數(shù)器的初始化:
由于定時器/計數(shù)器的功能是由軟件編程確定的,所以一般在使用定時/計數(shù)器前都要對其進行初始化,使其按設(shè)定的功能工作。初始貨的步驟一般如下:
1、確定工作方式(即對TMOD賦值);
2、預(yù)置定時或計數(shù)的初值(可直接將初值寫入TH0、TL0或TH1、TL1);
3、根據(jù)需要開放定時器/計數(shù)器的中斷(直接對IE位賦值);
4、啟動定時器/計數(shù)器(若已規(guī)定用軟件啟動,則可把TR0或TR1置“1”;若已規(guī)定由外中斷引腳電平啟動,則需給外引腳步加啟動電平。當(dāng)實現(xiàn)了啟動要求后,定時器即按規(guī)定的工作方式和初值開始計數(shù)或定時)。
下面介紹一下確定時時/計數(shù)器初值的具體方法。
因為在不同工作方式下計數(shù)器位數(shù)不同,因而最大計數(shù)值也不同。
現(xiàn)假設(shè)最大計數(shù)值為M,那么各方式下的最大值M值如下:
方式0:M=213=8 192
方式1:M=216=65 536
方式2:M=28=256
方式3:定時器0分成兩個8位計數(shù)器,所以兩個M均為256。
因為定時器/計數(shù)器是作“加1”計數(shù),并在計數(shù)滿溢出時產(chǎn)生中斷,因此初值X可以這樣計算:
X=M-計數(shù)值
下面舉例說明初值的確定方法。
例1、選擇T1方式0用于定時,在P1.1輸出周期為1ms方波,晶振fosc=6MHz。
解:根據(jù)題意,只要使P1.1每隔500us取反一次即可得到1ms的方波,因而T1的定時時間為500us,因定時時間不長,取方式0即可。則M1 M0=0;因是定時器方式,所以C/T=0;在此用軟件啟動T1,所以GATE=0。T0不用,方式字可任意設(shè)置,只要不使其進入方式3即可,一般取0,故TMOD=00H。系統(tǒng)復(fù)位后TMOD為0,可不對TMOD重新清0。
下面計算500us定時T1初始值:
機器周期T=12/fosc=12/(6×106)Hz=2μs
設(shè)初值為X,則:
(1013-X)×2×10-6s=500×10-6s
X=7942D=1111100000110B=1F06H
因為在作13位計數(shù)器用時,TL1的高3位未用,應(yīng)填寫0,TH1占用高8位,所以X的實際填寫應(yīng)為:
X=111100000000110B=F806H
結(jié)果:TH1=F8H,TL1=06H
源程序如下:
ORG 2000H
MOV TL1,#06H ;給TL1置初值
MOV TH1,#0F8H ;給TH1置初值
SETB TR1 ;啟動T1
LP1:JBC TF1,LP2 ;查詢計數(shù)溢出否?
AJMP LP1
LP2:MOV TL1,#06H ;重新設(shè)置計數(shù)初值
MOV TH1,#0F8H
CPL P1.1 ;輸出取反
AJMP LP1 ;重復(fù)循環(huán)
定時器/計數(shù)器的四種工作方式:
定T0或T1無論用作定時器或計數(shù)器都有4種工作方式:方式0、方式1、方式2和方式3。除方式3外,T0和T1有完全相同的工作狀態(tài)。下面以T1為例,分述各種工作方式的特點和用法。
工作方式0: 13位方式由TL1的低5位和TH1的8位構(gòu)成13位計數(shù)器(TL1的高3位無效)。工作方式0的結(jié)構(gòu)見下圖:

為定時/計數(shù)選擇:C/T=0,T1為定時器,定時信號為振蕩周期12分頻后的脈沖;C/T=l,T1為計數(shù)器,計數(shù)信號來自引腳T1的外部信號。
定時器T1能否啟動工作,還受到了R1、GATE和引腳信號INT1的控制。由圖中的邏輯電路可知,當(dāng)GATE=0時,只要TR1=1就可打開控制門,使定時器工作;當(dāng)GATE=1時,只有TR1=1且INT1=1,才可打開控制門。GATE,TR1,C/T的狀態(tài)選擇由定時器的控制寄存器TMOD,TCON中相應(yīng)位狀態(tài)確定,INT1則是外部引腳上的信號。
在一般的應(yīng)用中,通常使GATE=0,從而由TRl的狀態(tài)控制Tl的開閉:TRl=1,打開T1;TRl=0,關(guān)閉T1。在特殊的應(yīng)用場合,例如利用定時器測量接于INT1引腳上的外部脈沖高電平的寬度時,可使GATE=1,TRl=1。當(dāng)外部脈沖出現(xiàn)上升沿,亦即INT1由0變1電平時,啟動T1定時,測量開始;一旦外部脈沖出現(xiàn)下降沿,亦即INT1由l變O時就關(guān)閉了T1。
定時器啟動后,定時或計數(shù)脈沖加到TLl的低5位,從預(yù)先設(shè)置的初值(時間常數(shù))開始不斷增1。TL1計滿后,向THl進位。當(dāng)TL1和THl都計滿之后,置位T1的定時器回零標(biāo)志TFl,以此表明定時時間或計數(shù)次數(shù)已到,以供查詢或在打開中斷的條件下,可向CPU請求中斷。如需進一步定時/計數(shù),需用指令重置時間常數(shù)。
方式0是13位計數(shù)結(jié)構(gòu)的工作方式,其計數(shù)器由TH0全部8位和TL0的低5位構(gòu)成。當(dāng)TL0的低5
位計數(shù)溢出時,向TH0進位,而全部13位計數(shù)溢出時,則向計數(shù)溢出標(biāo)志位TF0進位。
在方式0下,當(dāng)為計數(shù)工作方式時,計數(shù)值的范圍是: 1~8192(213)
當(dāng)為定時工作方式時,定時時間的計算公式為:
(213-計數(shù)初值)×晶振周期×12 或 (213-計數(shù)初值)×機器周期
其時間單位與晶振周期或機器周期相同(ms)。
例題1:當(dāng)某單片機系統(tǒng)的外接晶振頻率為6MHz,該系統(tǒng)的最小定時時間為:
[213-(213-1)]×[1/(6×106)]×12=2×10-6=2(ms)
最大定時時間為:
(213-0)×[1/(6×106)]×12=16384×10-6=16384(ms)
或:最小定時單位×1013=16384(ms)
例題2: 設(shè)某單片機系統(tǒng)的外接晶振頻率為6MHz,使用定時器1以方式0產(chǎn)生周期為500ms的等寬正方波連續(xù)脈沖,并由P1.0輸出。
以查詢方式完成。
⑴ 計算計數(shù)初值
欲產(chǎn)生500ms的等寬正方波脈沖,只需在P1.0端以250ms為周期交替輸出高低電平即可實現(xiàn),為此定時時間應(yīng)為250ms。使用6MHz晶振,根據(jù)上例的計算,可知一個機器周期為2ms。方式0為13位計數(shù)結(jié)構(gòu)。設(shè)待求的計數(shù)初值為X,則:
(213-X)×2×10-6=250×10-6
求解得:
X=213-(250÷2)=8067。
二進制數(shù)表示為1111110000011。十六進制表示,高8位為FCH,放入TH1,即TH1=FCH;低5位為03H。放入TL1,即TL1=03H。
⑵ TMOD寄存器初始化
為把定時器/計數(shù)器1設(shè)定為方式0,則M1M0=00;為實現(xiàn)定時功能,應(yīng)使C/T=0;為實現(xiàn)定時器/計數(shù)器1的運行控制,則GATE=0。定時器/計數(shù)器0不用,有關(guān)位設(shè)定為0。因此TMOD寄存器應(yīng)初始化為00H。
⑶ 由定時器控制寄存器TCON中的TR1位控制定時的啟動和停止 TR1=1啟動,TR1=0停止。
⑷ 程序設(shè)計:
MOV TMOD,#00H ;設(shè)置T1為工作方式0
MOV TH1,#OFCH ;設(shè)置計數(shù)初值
MOV TL1,#03H
MOV IE,#00H ;禁止中斷
LOOP:
SETB TR1 ;啟動定時
JBC TF1,LOOP1 ;查詢計數(shù)溢出
AJMP LOOP
LOOP1:
MOV TH1,#FCH ;重新設(shè)置計數(shù)初值
MOV TL1,#03H
CLR TF1 ;計數(shù)溢出標(biāo)志位清0
CPL P1.0 ;輸出取反
AJMP LOOP ;重復(fù)循環(huán)
工作方式1:
方式1是16位計數(shù)結(jié)構(gòu)的工作方式,計數(shù)器由TH0全部8位和TL0全部8位構(gòu)成。與工作方式0基本相同,區(qū)別僅在于工作方式1的計數(shù)器TL1和TH1組成16位計數(shù)器,從而比工作方式0有更寬的定時/計數(shù)范圍。
當(dāng)為計數(shù)工作方式時,計數(shù)值的范圍是:
1~65536(216)
當(dāng)為定時工作方式時,定時時間計算公式為:
(216-計數(shù)初值)×晶振周期×12 或 (216-計數(shù)初值)×機器周期
例題1:當(dāng)某單片機系統(tǒng)的外部晶振頻率為6MHz,則最小定時時間為:
[216-(216-1)]×1/6×10-6×12=2×10-6=2(ms)
最大定時時間為:
(216-0)×1/6×10-6×12=131072×10-6(s)=131072(ms)≈131(ms)
例題2: 某單片機系統(tǒng)外接晶振頻率為6MHz,使用定時器1以工作方式1產(chǎn)生周期為500ms的等寬連續(xù)正方波脈沖,并在P1.0端輸出。,但以中斷方式完成。
⑴ 計算計數(shù)初值
TH1=FFH TL1=83H
⑵ TMOD寄存器初始化
TMOD=10H
⑶ 程序設(shè)計
主程序:
MOV TMOD,#10H ;定時器1工作方式1
MOV TH1,#0FFH ;設(shè)置計數(shù)初值
MOV TL1,#0A1H
SETB EA ;開中斷
SETB ET1 ;定時器1允許中斷
LOOP:
SETB TR1 ;定時開始
HERE:
SJMP $ ;等待中斷
中斷服務(wù)程序:
MOV TH1,#0FFH ;重新設(shè)置計數(shù)初值
MOV TL1,#0A1H
CPL P1.0 ;輸出取反
RETI ;中斷返回
工作方式2
8位自動裝入時間常數(shù)方式。由TLl構(gòu)成8位計數(shù)器,THl僅用來存放時間常數(shù)。啟動T1前,TLl和THl裝入相同的時間常數(shù),當(dāng)TL1計滿后,除定時器回零標(biāo)志TFl置位,具有向CPU請求中斷的條件外,THl中的時間常數(shù)還會自動地裝入TLl,并重新開始定時或計數(shù)。所以,工作方式2是一種自動裝入時間常數(shù)的8位計數(shù)器方式。由于這種方式不需要指令重裝時間常數(shù),因而操作方便,在允許的條件下,應(yīng)盡量使用這種工作方式。當(dāng)然,這種方式的定時/計數(shù)范圍要小于方式0和方式1。工作方式2的結(jié)構(gòu)見下圖.

當(dāng)計數(shù)溢出后,不是像前兩種工作方式那樣通過軟件方法,而是由預(yù)置寄存器TH以硬件方法自動給計數(shù)器TL重新加載。變軟件加載為硬件加載。
初始化時,8位計數(shù)初值同時裝入TL0和TH0中。當(dāng)TL0計數(shù)溢出時,置位TF0,同時把保存在預(yù)置寄存器TH0中的計數(shù)初值自動加載TL0,然后TL0重新計數(shù)。如此重復(fù)不止。這不但省去了用戶程序中的重裝指令,而且也有利于提高定時精度。但這種工作方式下是8位計數(shù)結(jié)構(gòu),計數(shù)值有限,最大只能到255。
這種自動重新加載工作方式非常適用于循環(huán)定時或循環(huán)計數(shù)應(yīng)用,例如用于產(chǎn)生固定脈寬的脈沖,此外還可以作串行數(shù)據(jù)通信的波特率發(fā)送器使用。
例題1: 使用定時器0以工作方式2產(chǎn)生100ms定時,在P1.0輸出周期為200ms的連續(xù)正方波脈沖。已知晶振頻率fosc=6MHz。
⑴ 計算計數(shù)初值
6MHz晶振下,一個機器周期為2ms,以TH0作重裝載的預(yù)置寄存器,TL0作8位計數(shù)器,假設(shè)計數(shù)初值為X,則:
(28-X)×2×10-6=100×10-6
求解得:
X=206D=11001110B=0CEH
把0CEH分別裝入TH0和TL0中:
TH0=0CEH,TL0=0CEH
⑵ TMOD寄存器初始化
定時器/計數(shù)器0為工式方式2,M1M0=10;為實現(xiàn)定時功能 C/T=0;為實現(xiàn)定時器/計數(shù)器0的運行 GATE=0;定時器/計數(shù)器1不用,有關(guān)位設(shè)定為0。
綜上情況TMOD寄存器的狀態(tài)應(yīng)為02H。
⑶ 程序設(shè)計(查詢方式)
MOV IE,#00H ;禁止中斷
MOV TMOD,#02H ;設(shè)置定時器0為方式2
MOV TH0,#0CEH ;保存計數(shù)初值
MOV TL0,#0CEH ;設(shè)置計數(shù)初值
SETB TR0 ;啟動定時
LOOP:
JBC TF0,LOOP1 ;查詢計數(shù)溢出
AJMP LOOP
LOOP1:
CPL P1.0 ;輸出方波
AJMP LOOP ;重復(fù)循環(huán)
由于方式2具有自動重裝載功能,因此計數(shù)初值只需設(shè)置一次,以后不再需要軟件重置。
⑷ 程序設(shè)計(中斷方式)
主程序:
MOV TMOD,#02H ;定時器0工作方式2
MOV TH0,#0CEH ;保存計數(shù)初值
MOV TL0,#0CEH ;設(shè)置計數(shù)初值
SETB EA ;開中斷
SETB ET0 ;定時器0允許中斷
LOOP:
SETB TR0 ;開始定時
HERE:
SJMP $ ;等待中斷
CLP TF0 ;計數(shù)溢出標(biāo)志位清0
AJMP LOOP
中斷服務(wù)中斷:
CPL P1.0 ;輸出方波
RETI ;中斷返回
例題2: 用定時器1以工作方式2實現(xiàn)計數(shù),每計100次進行累加器加1操作。
⑴ 計算計數(shù)初值
28-100=156D=09CH 則
TH1=09CH,TL1=09CH
⑵ TMOD寄存器初始化
M1M0=10,C/T=1,GATE=0 因此
TMOD=60H
⑶ 程序設(shè)計
MOV IE, #00H ;禁止中斷
MOV TMOD, #60H ;設(shè)置計數(shù)器1為方式2
MOV TH1, #9CH ;保存計數(shù)初值
MOV TL1, #9CH ;設(shè)置計數(shù)初值
SETB TR1 ;啟動計數(shù)
DEL:
JBC TF1, LOOP ;查詢計數(shù)溢出
AJMP DEL
LOOP:
INC A ;累加器加1
AJMP DEL ;循環(huán)返回
工作方式3
2個8位方式。工作方式3只適用于定時器0。如果使定時器1為工作方式3,則定時器1將處于關(guān)閉狀態(tài)。
當(dāng)T0為工作方式3時,THo和TL0分成2個獨立的8位計數(shù)器。其中,TL0既可用作定時器,又可用作計數(shù)器,并使用原T0的所有控制位及其定時器回零標(biāo)志和中斷源。TH0只能用作定時器,并使用T1的控制位TRl、回零標(biāo)志TFl和中斷源,見下圖。
通常情況下,T0不運行于工作方式3,只有在T1處于工作方式2,并不要求中斷的條件下才可能使用。這時,T1往往用作串行口波特率發(fā)生器(見1.4),TH0用作定時器,TL0作為定時器或計數(shù)器。所以,方式3是為了使單片機有1個獨立的定時器/計數(shù)器、1個定時器以及1個串行口波特率發(fā)生器的應(yīng)用場合而特地提供的。這時,可把定時器l用于工作方式2,把定時器0用于工作方式3。

下才可能使用。這時,T1往往用作串行口波特率發(fā)生器,TH0用作定時器,TL0作為定時器或計數(shù)器。所以,方式3是為了使單片機有1個獨立的定時器/計數(shù)器、1個定時器以及1個串行口波特率發(fā)生器的應(yīng)用場合而特地提供的。這時,可把定時器l用于工作方式2,把定時器0用于工作方式3。
理解內(nèi)容
定時器/計數(shù)器的應(yīng)用
例1、設(shè)fosc = 6MHz,利用單片機內(nèi)定時/計數(shù)器及P10口線輸出1000個脈沖,脈沖周期為2ms,試編程。
解:

T = 12×1/fosc = 2us
選取T0定時;T1計數(shù)。
設(shè)T0采用中斷方式產(chǎn)生周期為2ms方波,T1對該方波計數(shù),當(dāng)輸出至第1000個脈沖時,使TF1置1。
在主程序中用查詢方法,檢測到TF1變1時,關(guān)掉T0,停止輸出方波。
T0、T1參數(shù)的確定:
T0模式0、定時:脈寬為脈沖周期的一半
所以,X = 213-1ms / 2us = 0001 1110 0000 1100B
TH0 = 0F0H
TL0 = 0CH
T1模式1、計數(shù):N = 1000
則 X = 65536-1000 = 64536 = 0FC18H
(若選模式0也可以,此時X = 7192=1C18H)
程序:
MAIN:
WAIT:
TOS:
| ORG 0000H LJMP MAIN ORG 000BH LJMP TOS ORG 1000H MOV TMOD,#50H;T0定時,模式0;T1計數(shù),模式1 MOV TL0,#0CH MOV TH0,#0F0H MOV TL1,#18H MOV TH1,#0FCH SETB TR1 SETB TR0 SETB ET0 SETB EA JNB TF1,WAIT;查詢1000個脈沖計夠沒有?沒有等待。 CLR EA CLR ET0 ANL TCON,#0FH ; 停T0、T1 SJMP $ MOV TL0,#0CH MOV TH0,#0F0H CPL P10 RETI END | 例2、脈沖參數(shù)測量——GATE功能的使用。
電路連接如下圖所示。
脈沖高電平(計數(shù))長度值存于21H、20H中,
脈沖低電平長度存于23H、22H中。
解: 復(fù)習(xí)GATE的用法:
GATE = 0時,TRi = 1,即可啟動Ti定時 / 計數(shù)
GATE = 1時,TRi = 1,且/INTi =1,才啟動定時 / 計數(shù)。
MAIN :
TEST0:
TEST1:
TEST2:
TEST3:
| ORG 0000H LJMP MAIN ORG 2000H MOV TMOD,#99H
MOV A,#00H
MOV TL0,A MOV TH0,A MOV TL1,A MOV TH1,A JB P32,TEST0 SETB TR0 JNB P32,TEST1 SETB TR1 JB P32,TEST2 CLR TR0 MOV 20H,TH0 MOV 21H,TL0 JB P33,TEST3 CLR TR1 MOV 22H,TH1 MOV 23H,TL1 LCALL DISP SJMP $
|
;T0、T1均工作在定時, ; 模式1,GATE=1 ;T0、T1賦計數(shù)初值00H,定時最長時間 ;為0000 ~ 65536
;檢測是否到a點 ;到a點,TR0 = 1,做好取計時值準(zhǔn)備。 ;檢測是否到1點 ;到1點T0計時;TR1 = 1,做好T1計時準(zhǔn)備。 ;檢測是否到2點 ;到2點,停止T0計時,T1開始計時。 ;保存T0計時結(jié)果
;檢測是否到3點 ;到3點,停止T1計數(shù) ;保存T1計數(shù)結(jié)果 |