6.1?定時(shí)器概述
89C51/S51單片機(jī)內(nèi)部有兩個(gè)16位定時(shí)器/計(jì)數(shù)器,即定時(shí)器0(T0)和定時(shí)器1(T1)。
6.1.1?什么是記數(shù)和定時(shí)
1.計(jì)數(shù)
所謂計(jì)數(shù)就是對(duì)外部事件進(jìn)行計(jì)數(shù),外部事件的發(fā)生以輸入脈沖表示,因此計(jì)數(shù)功能的實(shí)質(zhì)就是對(duì)外來(lái)脈沖進(jìn)行計(jì)數(shù)。51單片機(jī)有T0(P3.4)和T1(P3.5)兩個(gè)信號(hào)引腳,分別是這兩個(gè)計(jì)數(shù)器的計(jì)數(shù)輸入端。外部輸入的脈沖在負(fù)跳變(即下降沿)時(shí)進(jìn)行計(jì)數(shù)器加1(加法計(jì)數(shù))。
2.定時(shí)
定時(shí)是通過(guò)計(jì)數(shù)器的計(jì)數(shù)來(lái)實(shí)現(xiàn)的,只不過(guò)計(jì)數(shù)脈沖來(lái)自單片機(jī)內(nèi)部,每個(gè)機(jī)器周期產(chǎn)生一個(gè)計(jì)數(shù)脈沖。每個(gè)機(jī)器周期,計(jì)數(shù)器加一。
(因?yàn)橐粋€(gè)機(jī)器周期等于十二個(gè)振蕩脈沖周期,因此計(jì)數(shù)頻率為振蕩周期的1/12)
6.1.2?定時(shí)器/計(jì)數(shù)器的組成
兩個(gè)16位的定時(shí)器/計(jì)數(shù)器,即定時(shí)器0(T0)和定時(shí)器1(T1)。都是16位加1計(jì)數(shù)器。

T0由兩個(gè)8位特殊功能寄存器TH0和TL0構(gòu)成;T1由TH1和TL1構(gòu)成。
每個(gè)定時(shí)器都可由軟件設(shè)置為定時(shí)工作方式或計(jì)數(shù)工作方式以及其他靈活多樣的可控功能方式,這些都由TMOD(TIMER/COUNTER MODE CONTROL REGISTER定時(shí)器/計(jì)數(shù)器模式控制寄存器)和TCON(TIMER/COUNTER CONTROL REGISTER定時(shí)器/計(jì)數(shù)器控制寄存器)所控制。
設(shè)置為定時(shí)工作方式時(shí),每個(gè)機(jī)器周期使定時(shí)器(T0或T1)的數(shù)值加1直至計(jì)滿(mǎn)溢出。當(dāng)89C51/S5采用12 MHz晶振時(shí),一個(gè)機(jī)器周期為1 μs,計(jì)數(shù)頻率為1 MHz。
設(shè)置為計(jì)數(shù)工作方式時(shí),通過(guò)引腳T0(P3.4)和T1(P3.5)對(duì)外部脈沖信號(hào)計(jì)數(shù)。當(dāng)輸入脈沖信號(hào)產(chǎn)生下降沿時(shí),計(jì)數(shù)器的值加1。在每個(gè)機(jī)器周期的S5P2期間采樣T0和T1引腳的輸入電平,在本周期和下一周期之間存在下降沿,則計(jì)數(shù)器加1。所以,檢測(cè)一個(gè)負(fù)跳變下降沿需要兩個(gè)機(jī)器周期,故最高計(jì)數(shù)頻率為振蕩頻率的1/24。(為了確保某個(gè)電平在變化之前至少被采樣一次,要求電平保持時(shí)間至少是一個(gè)完整的機(jī)器周期。)
不管是定時(shí)還是計(jì)數(shù)工作方式,定時(shí)器T0或T1在對(duì)內(nèi)部時(shí)鐘或?qū)ν獠渴录?jì)數(shù)時(shí),不占用CPU時(shí)間,除非定時(shí)器/計(jì)數(shù)器溢出,才可能中斷CPU的當(dāng)前操作。
除了可以選擇定時(shí)或計(jì)數(shù)工作方式外,每個(gè)定時(shí)器/計(jì)數(shù)器還有4種工作模式,也就是每個(gè)定時(shí)器可構(gòu)成4種電路結(jié)構(gòu)模式。其中,模式0~2對(duì)T0和T1都是一樣的,模式3對(duì)兩者是不同的。
6.2?定時(shí)器的控制
當(dāng)89C51/S51復(fù)位時(shí),TNOD、TCON都被清零。這兩個(gè)8位寄存器被用來(lái)設(shè)置T0或T1的操作模式和控制模式。
6.2.1?工作模式寄存器TMOD
TMOD用于控制T0和T1的工作模式。TMOD不能位尋址,只能用字節(jié)設(shè)置定時(shí)器的工作模式,低半字節(jié)設(shè)置T0,高半字節(jié)設(shè)置T1。
89C51系統(tǒng)復(fù)位時(shí),TMOD的所有位被清0。

M1和M0:操作模式控制位。兩位可形成四種編碼,對(duì)應(yīng)四種操作模式。
模式0——13位計(jì)數(shù)器;模式1——16位計(jì)數(shù)器;模式2——自動(dòng)再裝入8位計(jì)數(shù)器;模式3——定時(shí)器0分成二個(gè)8位計(jì)數(shù)器,定時(shí)器1停止計(jì)數(shù)
:定時(shí)器/計(jì)數(shù)器方式選擇
若=0,設(shè)置為定時(shí)方式,定時(shí)器計(jì)數(shù)單片機(jī)片內(nèi)脈沖,即對(duì)機(jī)器周期計(jì)數(shù)(震蕩周期的12倍);若
=1,為計(jì)數(shù)方式,對(duì)外部脈沖計(jì)數(shù)(引腳T0(P3.4)或T1(P3.5))。

GATE:門(mén)控位。GATE=0,可以不管外部中斷端口直接啟動(dòng)。
6.2.2?控制寄存器TCON
控制寄存器可位尋址。89C51/S51系統(tǒng)復(fù)位時(shí),TCON的所有位被清0。
TF(Timer OverFlow Flag)、TR(Timer Run)

①TF1(TCON.7) —T1溢出標(biāo)志位。
當(dāng)T1溢出時(shí),由硬件自動(dòng)使中斷觸發(fā)器TF1置1,并向CPU申請(qǐng)中斷。當(dāng)CPU響應(yīng)中斷進(jìn)入中斷服務(wù)程序后,TF1被硬件自動(dòng)清0。TF1也可以用軟件清0。
②TF0(TCON.5)—T0溢出標(biāo)志位。其功能和操作情況同TF1。
③TR1(TCON.6)—T1運(yùn)行控制位。
可通過(guò)軟件置1(TR1=1)或清0(TR1=0)來(lái)啟動(dòng)或關(guān)閉T1工作。在程序中用指令“SETB?? TR1”使TR1位置1,定時(shí)器T1便開(kāi)始計(jì)數(shù)。用“CLR TR1使TR1清0,定時(shí)器停止工作。
④?TR0(TCON.4)—T0運(yùn)行控制位。 其功能和操作情況同TR1。
⑤?其余為中斷標(biāo)志位

6.3?定時(shí)器的四種模式及應(yīng)用
T0、T1在模式0、模式1、模式2時(shí),工作模式形同,模式3時(shí)不相同。
模式0通常很少使用。
6.3.1?模式1及應(yīng)用
模式1對(duì)應(yīng)一個(gè)16位的定時(shí)器/計(jì)數(shù)器。寄存器TH0和TL1以全部16位參與操作。
當(dāng)用于定時(shí)工作方式時(shí),定時(shí)時(shí)長(zhǎng)為:
①?用于定時(shí)工作方式時(shí),定時(shí)時(shí)間為:
t=(65536-T0初值)×振蕩周期×12
②?用于計(jì)數(shù)工作方式時(shí),計(jì)數(shù)長(zhǎng)度為:
(65536-T0初值)(個(gè)外部脈沖)
6.3.2?模式2及應(yīng)用
模式2把TL0配置成一個(gè)可以自動(dòng)重裝載的8位定時(shí)器/計(jì)數(shù)器。
TL0計(jì)數(shù)溢出時(shí),不僅使溢出中斷標(biāo)志位TF0置1,而且還自動(dòng)把TH0中的內(nèi)容重新裝載到TL0中。TL0用作8位計(jì)數(shù)器,TH0用以保存初值。
在程序初始化時(shí),TL0和TH0由軟件賦予相同的初值。
用于定時(shí)工作方式時(shí),定時(shí)時(shí)間為:
?t=(256-TL0初值)×振蕩周期×12
該模式可省去軟件中重裝常數(shù)的語(yǔ)句,并可產(chǎn)生相當(dāng)精確的定時(shí)時(shí)間,適合于作串行口波特率發(fā)生器?
6.3.3?模式三及應(yīng)用
若將T0設(shè)置為模式3,則TL0和TH0被分成兩個(gè)相互獨(dú)立的8位計(jì)數(shù)器。
T0設(shè)置為模式3,TL0和TH0被分成兩個(gè)相互獨(dú)立的8位計(jì)數(shù)器。
TL0:用原T0的各控制位、引腳和中斷源,即,GATE,TR0,TF0,T0(P3.4)引腳,INT0(P3.2)引腳。
TL0可工作在定時(shí)器方式和計(jì)數(shù)器方式。其功能和操作與模式0、模式1相同(只是8位)。
TH0:只可用作簡(jiǎn)單的內(nèi)部定時(shí)功能。TH0占用了定時(shí)器T1的控制位TR1和T1的中斷標(biāo)志TF1,其啟動(dòng)和關(guān)閉僅受TR1的控制。
所以T1沒(méi)有模式3,若將T1設(shè)置為模式3,會(huì)導(dǎo)致T1立即停止計(jì)數(shù),也就是保持原有的計(jì)數(shù)值。
定時(shí)器T1無(wú)工作模式3狀態(tài)。在T0用作模式3時(shí),T1仍可設(shè)置為模式0~2。
由于TR1和TF1被定時(shí)器T0占用,計(jì)數(shù)器開(kāi)關(guān)K已被接通,此時(shí),僅用T1控制位,切換其定時(shí)或計(jì)數(shù)器工作方式就可使T1運(yùn)行。當(dāng)計(jì)數(shù)器溢出時(shí),只能將輸出送入串行口或用于不需要中斷的場(chǎng)合。T0模式3,一般設(shè)T1模式2作波特率發(fā)生器。