51單片機(jī)的定時器/計(jì)數(shù)器結(jié)構(gòu)如圖7-7所示。
T0由特殊功能寄存器TH0、TL0構(gòu)成。
T1由特殊功能寄存器TH1、TL1構(gòu)成。
T0 和T1都具有定時器和計(jì)數(shù)器兩種工作模式,4種工作方式(方式0~3)。屬于增計(jì)數(shù)器。
特殊功能寄存器TMOD用于選擇T0、T1的工作模式和工作方式。特殊功能寄存器TCON用于控制T0、T1的啟動和停止計(jì)數(shù),同時包含了T0、T1的狀態(tài)。T0、 T1不論是工作在定時器模式還是計(jì)數(shù)器模式,實(shí)質(zhì)是對脈沖信號進(jìn)行計(jì)數(shù),只不過計(jì)數(shù)信號的來源不同。
計(jì)數(shù)器模式是對加在T0(P3.4)和T1(P3.5)兩個引腳上的外部脈沖進(jìn)行計(jì)數(shù)。
定時器模式是對單片機(jī)的系統(tǒng)時鐘信號經(jīng)片內(nèi)12分頻后的內(nèi)部脈沖信號(機(jī)器周期)計(jì)數(shù)。由于時鐘頻率是定值,所以可根據(jù)對內(nèi)部脈沖信號的計(jì)數(shù)值可計(jì)算出定時時間。
計(jì)數(shù)器的起始計(jì)數(shù)是從初值開始。單片機(jī)復(fù)位時計(jì)數(shù)器初值為0,也可用指令給計(jì)數(shù)器裝入一個新的初值。
TMOD是一個不可以位尋址的8位特殊功能寄存器,字節(jié)地址為89H,其高4位專供T1使用的,其低4位專供T0使用的,見表7-8。
8位分為兩組,高4位控制T1,低4位控制T0。
下面對TMOD的各位給出說明。
(1)GATE—門控位
GATE=0時,僅由運(yùn)行控制位TRx(x = 0,1)來控制定時器運(yùn)行。
GATE=1時,用外中斷引腳INT0*(或INT1* )上的電平與運(yùn)行控制位TRx共同控制定時器運(yùn)行。
(2)M1、M0—工作方式選擇位
M1、M0的4種編碼,對應(yīng)于4種工作方式的選擇,如表7-9所示。
(3)C/T* —計(jì)數(shù)器模式和定時器模式選擇位
C/T*=0,為定時器工作模式,對單片機(jī)的晶體振蕩器12分頻后的脈沖進(jìn)行計(jì)數(shù)。
C/T*=1,為計(jì)數(shù)器工作模式,計(jì)數(shù)器對外部輸入引腳T0(P3.4)或T1(P3.5)的外部脈沖(負(fù)跳變)計(jì)數(shù)。
TCON字節(jié)地址為88H,可位尋址,位地址為88H~8FH,格式如表7-10所示。
7.1節(jié)介紹了與外部中斷有關(guān)的低4位。這里僅介紹與定時器相關(guān)的高4位功能。
(1)TF1、TF0—計(jì)數(shù)溢出標(biāo)志位
當(dāng)計(jì)數(shù)器計(jì)數(shù)溢出時,該位置“1”。使用查詢方式時,此位作為狀態(tài)位供CPU查詢,但應(yīng)注意查詢有效后,應(yīng)使用軟件及時將該位清“0”。使用中斷方式時,此位作為中斷請求標(biāo)志位,進(jìn)入中斷服務(wù)程序后由硬件自動清“0”。
(2)TR1、TR0—計(jì)數(shù)運(yùn)行控制位
TR1位(或TR0位)=1,啟動定時器工作的必要條件。
TR1位(或TR0位)=0,停止定時器工作。
該位可由軟件置“1”或清“0”。
(1) 方式0
當(dāng)M1、M0為00時,定時器/計(jì)數(shù)器被設(shè)置為工作方式0,這時定時器/計(jì)數(shù)器的等效邏輯結(jié)構(gòu)框圖如圖7-9所示(以定時器/計(jì)數(shù)器T1為例,TMOD.5、TMOD.4 = 00)。
方式0時,為13位計(jì)數(shù)器,由TLx(x = 0,1)的低5位和THx的高8位構(gòu)成。TLx低5位溢出則向THx進(jìn)位,THx計(jì)數(shù)溢出則把TCON中的溢出標(biāo)志位TFx置“1”。計(jì)數(shù)值的范圍為1~8192,當(dāng)溢出時其計(jì)錄脈沖的個數(shù)為:
S=8192-X ,式中X為T0(或T1) 計(jì)數(shù)初值。
TLx=(213一X) /32 // 取5位的余數(shù)
THx=(213一X)/32 // 取5位的商
圖7-9中, C/T*位控制的電子開關(guān)決定了定時器/計(jì)數(shù)器的兩種工作模式。
①C/T*=0,電子開關(guān)打在上面位置,T1(或T0)為定時器工作模式,把時鐘振蕩器12分頻后的脈沖作為計(jì)數(shù)信號。
②C/T*=1,電子開關(guān)打在下面位置,T1(或T0)為計(jì)數(shù)器工作模式,計(jì)數(shù)脈沖為P3.4(或P3.5)引腳上的外部輸入脈沖,當(dāng)引腳上發(fā)生負(fù)跳變時,計(jì)數(shù)器加1。
GATE位狀態(tài)決定定時器的運(yùn)行控制取決于TRx一個條件,還是取決于TRx和INTX* (x = 0,1)引腳狀態(tài)這兩個條件。
①GATE=0時,A點(diǎn)(見圖6-4)電位恒為1,B點(diǎn)電位僅取決于TRx狀態(tài)。TRx = 1,B點(diǎn)為高電平,控制端控制電子開關(guān)閉合,允許T1(或T0)對脈沖計(jì)數(shù)。TRx = 0,B點(diǎn)為低電平,電子開關(guān)斷開,禁止T1(或T0)計(jì)數(shù)。
②GATE=1時,B點(diǎn)電位由INTX*(x = 0,1)的輸入電平和TRx的狀態(tài)兩個條件來定。當(dāng)TRx=1,且INTX*=1時,B點(diǎn)才為1,控制端控制電子開關(guān)閉合,允許T1(或T0)計(jì)數(shù)。故這種情況下計(jì)數(shù)器是否計(jì)數(shù)是由TRx和INTX*兩個條件來共同控制。
(2) 方式1
當(dāng)M1、M0為01時,工作于方式1,方式1的等效電路邏輯結(jié)構(gòu)如下圖所示。
方式1和方式0的差別僅僅在于計(jì)數(shù)器的位數(shù)不同,方式1為16位計(jì)數(shù)器,由THx高8位和TLx低8位構(gòu)成(x = 0,1),方式0則為13位計(jì)數(shù)器,有關(guān)控制狀態(tài)位的含義(GATE、C/T*、TFx、TRx)與方式0相同。
在方式1下當(dāng)為定時工作方式時,定時時間的計(jì)算公式為:
T=(2^16-X)× Ts
其中X為T0(或T1) 計(jì)數(shù)初值,Ts為機(jī)器周期。當(dāng)為計(jì)數(shù)工作方式時, S=216一X ,式中X為T0(或T1) 計(jì)數(shù)初值, 計(jì)數(shù)值的范圍為1~65536(216)。在方式1中TLx和THx計(jì)數(shù)寄存器各使用8位,而28=256,所以把計(jì)數(shù)起點(diǎn)的值除以256,其余數(shù)放入TLx計(jì)數(shù)寄存器,其商放入THx寄存器中。
TLx=(2^16-X) /256 //取8位的余數(shù)
THx=(2^16-X)/256 //取8位的商
(3) 方式2
方式0和方式1的最大特點(diǎn)是計(jì)數(shù)溢出后,計(jì)數(shù)器為全0。因此在循環(huán)定時或循環(huán)計(jì)數(shù)應(yīng)用時就存在用指令反復(fù)裝入計(jì)數(shù)初值的問題。這不僅影響定時精度,也給程序設(shè)計(jì)帶來麻煩。方式2就是解決此問題而設(shè)置的。
當(dāng)M1、M0為10時,定時器/計(jì)數(shù)器處于工作方式2,這時定時器/計(jì)數(shù)器的等效邏輯結(jié)構(gòu)如圖7-10所示(以定時器T1為例,x = 1)。
定時器/計(jì)數(shù)器的方式2為自動恢復(fù)初值(初值自動裝入)的8位定時器/計(jì)數(shù)器,TLx(x = 0,1)作為常數(shù)緩沖器,當(dāng)TLx計(jì)數(shù)溢出時,在溢出標(biāo)志TFx置“1”的同時,還自動將THx中的初值送至TLx,使TLx從初值開始重新計(jì)數(shù)。定時器/計(jì)數(shù)器的方式2工作過程如右圖所示。
此工作方式可省去用戶軟件中
重裝初值的指令的執(zhí)行時間,
簡化定時初值的計(jì)算方法,
可相當(dāng)精確地確定定時時間。
(4) 方式3
方式3是為了增加一個附加的8位定時器/計(jì)數(shù)器而設(shè)置的,從而使AT89S51單片機(jī)具有3個定時器/計(jì)數(shù)器。方式3只適用于定時器/計(jì)數(shù)器T0,定時器/計(jì)數(shù)器T1不能工作在方式3。T1處于方式3時相當(dāng)于TR1 = 0,停止計(jì)數(shù)(此時T1可用來作為串行口波特率產(chǎn)生器)。
①工作方式3下的T0
當(dāng)TMOD的低2位為11時,T0的工作方式被選為方式3,各引腳與T0的邏輯關(guān)系如圖7-11所示。
T0分為兩個獨(dú)立的8位計(jì)數(shù)器TL0和TH0,TL0使用T0的狀態(tài)控制位C/T*、GATE、TR0,而TH0被固定為一個8位定時器(不能作為外部計(jì)數(shù)模式),并使用T1的狀態(tài)控制位TR1和TF1,同時占用T1的中斷請求源TF1。
當(dāng)T0設(shè)置在方式3時,再把T1也設(shè)置成方式3,此時T1停止計(jì)數(shù)。
當(dāng)定時器/計(jì)數(shù)器工作在計(jì)數(shù)器模式時,計(jì)數(shù)脈沖來自外部輸入引腳T0或T1。當(dāng)輸入信號產(chǎn)生由1至0的跳變(即負(fù)跳變)時,計(jì)數(shù)器值增1。每個機(jī)器周期的S5P2期間,都對外部輸入引腳T0或T1進(jìn)行采樣。如在第一個機(jī)器周期中采得的值為1,而在下一個機(jī)器周期中采得的值為0,則在緊跟著的再下一個機(jī)器周期S3P1期間,計(jì)數(shù)器加1。
由于確認(rèn)一次負(fù)跳變花2個機(jī)器周期,即24個振蕩周期,因此外部輸入的計(jì)數(shù)脈沖的最高頻率為系統(tǒng)振蕩器頻率的1/24。