51單片機(jī)內(nèi)部定時器/計數(shù)器應(yīng)用
M1M0工作方式功能描述00工作方式013位計數(shù)器01工作方式116位計數(shù)器10工作方式2自動再裝入8位計數(shù)器11工作方式3定時器0:分成兩個8位計數(shù)器;
定時器1:停止計數(shù)
定時器/計數(shù)器方式控制寄存器TMOD不能進(jìn)行位尋址,只能用字節(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
二進(jìn)制數(shù)00100101=十六進(jìn)制數(shù)25H。所以執(zhí)行MOV TMOD,#25H這條指令就可以實現(xiàn)上述要求。
TCON定時器/計數(shù)器控制寄存器TCON在特殊功能寄存器中,字節(jié)地址為88H,位地址(由低位到高位)為88H一8FH,由于有位地址,十分便于進(jìn)行位操作。
TCON的作用是控制定時器的啟、停,標(biāo)志定時器溢出和中斷情況。
TCON的格式如下圖所示。其中,TFl,TRl,TF0和TR0位用于定時器/計數(shù)器;IEl,ITl,IE0和IT0位用于中斷系統(tǒng)。
各位定義如下:
TF1:定時器1溢出標(biāo)志位。當(dāng)字時器1計滿溢出時,由硬件使TF1置“1”,并且申請中斷。進(jìn)入中斷服務(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ù)器前都要對其進(jìn)行初始化,使其按設(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è)置,只要不使其進(jìn)入方式3即可,一般取0,故TMOD=00H。系統(tǒng)復(fù)位后TMOD為0,可不對TMOD重新清0。
下面計算500us定時T1初始值:
機(jī)器周期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)