標(biāo)準(zhǔn)的51單片機內(nèi)部有 T0 和 T1 這兩個定時器,T 就是 Timer 的縮寫,現(xiàn)在很多51系列單片機還會增加額外的定時器,在這里我們先講定時器0和1。前邊提到過,對于單片機的每一個功能模塊,都是由它的 SFR,也就是特殊功能寄存器來控制。與定時器有關(guān)的特殊功能寄存器,有以下幾個,大家不需要去記憶這些寄存器的名字和作用,你只要大概知道就行,用的時候,隨時可以查手冊,找到每個寄存器的名字和每個寄存器所起到的作用。
表5-1的寄存器是存儲定時器的計數(shù)值的。TH0/TL0 用于 T0,TH1/TL1 用于 T1。
表5-1 定時值存儲寄存器
| 名稱 | 描述 | SFR 地址 | 復(fù)位值 |
|---|---|---|---|
| TH0 | 定時器0高字節(jié) | 0x8C | 0x00 |
| TL0 | 定時器0低字節(jié) | 0x8A | 0x00 |
| TH1 | 定時器1高字節(jié) | 0x8D | 0x00 |
| TL1 | 定時器1低字節(jié) | 0x8B | 0x00 |
表5-2是定時器控制寄存器 TCON 的位分配,表5-3是則是對每一位的具體含義的描述。
表5-2 TCON——定時器控制寄存器的位分配(地址 0x88、可位尋址)
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 符號 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
| 復(fù)位值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
表 5-3 TCON——定時器控制寄存器的位描述
| 位 | 符號 | 描述 |
|---|---|---|
| 7 | TF1 | 定時器1溢出標(biāo)志。一旦定時器1發(fā)生溢出時硬件置1。清零有兩種方式:軟件清零,或者進入定時器中斷時硬件清零。 |
| 6 | TR1 | 定時器1運行控制位。軟件置位/清零來進行啟動/停止定時器。 |
| 5 | TF0 | 定時器0溢出標(biāo)志。一旦定時器0發(fā)生溢出時硬件置1。清零有兩種方式:軟件清零,或者進入定時器中斷時硬件清零。 |
| 4 | TR0 | 定時器0運行控制位。軟件置位/清零來進行啟動/停止定時器。 |
| 3 | IE1 | 外部中斷部分,與定時器無關(guān),暫且不看。 |
| 2 | IT1 | 外部中斷部分,與定時器無關(guān),暫且不看。 |
| 1 | IE0 | 外部中斷部分,與定時器無關(guān),暫且不看。 |
| 0 | IT0 | 外部中斷部分,與定時器無關(guān),暫且不看。 |
大家注意在表5-3中的描述中,只要寫到硬件置1或者清0的,就是指一旦符合條件,單片機將自動完成的動作,只要寫軟件置1或者清0的,是指我們必須用程序去完成這個動作,后續(xù)遇到此類描述就不再另做說明了。
對于 TCON 這個 SFR,其中有 TF1、TR1、TF0、TR0 這4位需要我們理解清楚,它們分別對應(yīng)于 T1 和 T0,我們以定時器1為例講解,那么定時器0同理。先看 TR1,當(dāng)我們程序中寫 TR1 = 1 以后,定時器值就會每經(jīng)過一個機器周期自動加1,當(dāng)我們程序中寫 TR1 = 0 以后,定時器就會停止加1,其值會保持不變化。TF1,這個是一個標(biāo)志位,他的作用是告訴我們定時器溢出了。比如我們的定時器設(shè)置成16位的模式,那么每經(jīng)過一個機器周期,TL1 加1一次,當(dāng) TL1 加到255后,再加1,TL1 變成0,TH1 會加1一次,如此一直加到 TH1 和 TL1 都是255(即 TH1 和 TL1 組成的16位整型數(shù)為65535)以后,再加1一次,就會溢出了,TH1 和 TL1 同時都變?yōu)?,只要一溢出,TF1 馬上自動變成1,告訴我們定時器溢出了,僅僅是提供給我們一個信號,讓我們知道定時器溢出了,它不會對定時器是否繼續(xù)運行產(chǎn)生任何影響。
本節(jié)開頭我們就提到了定時器有多種工作模式,工作模式的選擇就由 TMOD 來控制,TMOD 的位分配和描述見表5-4到5-6所示,TMOD 的位功能如表5-5所示。
表5-4 TMOD——定時器模式寄存器的位分配(地址 0x89、不可位尋址)
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 符號 | GATE(T1) | C/T(T1) | M1(T1) | M0(T1) | GATE(T0) | C/T(T0) | M1(T0) | M0(T0) |
| 復(fù)位值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
表5-5 TMOD——定時器模式寄存器的位描述
| 符號 | 描述 |
|---|---|
| T1/T0 | 在表5-5中,標(biāo) T1 的表示控制定時器1的位,標(biāo) T0 的表示控制定時器0的位。 |
| GATE | 該位被置1時為門控位。僅當(dāng)?INTx?腳為高并且?TRx?控制位被置1時使能定時器?x?,定時器開始計時,當(dāng)該位被清0時,只要?TRx?位被置1,定時器 x 就使能開始計時,不受到單片機引腳?INTx?外部信號的干擾,常用來測量外部信號脈沖寬度。這是定時器一個額外功能,本節(jié)課暫不介紹。 |
| C/T | 定時器或計數(shù)器選擇位。該位被清零時用作定時器功能(內(nèi)部系統(tǒng)時鐘),被置1用作計數(shù)器功能。 |
表5-6 TMOD——定時器模式寄存器 M1/M0 工作模式
| M1 | M0 | 工作模式 | 描述 |
|---|---|---|---|
| 0 | 0 | 0 | 兼容 8048 單片機的13位定時器,THn 的8位和 TLn 的5位組成一個13位定時器。 |
| 0 | 1 | 1 | THn 和 TLn 組成一個16位的定時器。 |
| 1 | 0 | 2 | 8位自動重裝模式,定時器溢出后 THn 重裝到 TLn 中。 |
| 1 | 1 | 3 | 禁用定時器1,定時器0變成2個8位定時器。 |
可能你已經(jīng)注意到了,表5-2的 TCON 最后標(biāo)注了“可位尋址”,而表5-4的 TMOD 標(biāo)注的是“不可位尋址”。意思就是說:比如 TCON 有一個位叫 TR1,我們可以在程序中直接進行 TR1 = 1 這樣的操作。但對 TMOD 里的位比如(T1)M1 = 1這樣的操作就是錯誤的。我們要操作就必須一次操作這整個字節(jié),也就是必須一次性對 TMOD 所有位操作,不能對其中某一位單獨進行操作,那么我們能不能只修改其中的一位而不影響其它位的值呢?當(dāng)然可以,在后續(xù)課程中你就會學(xué)到方法的,現(xiàn)在就先不關(guān)心它了。
表5-6列出的就是定時器的4中工作模式,其中模式0是為了兼容老的 8048 系列單片機而設(shè)計的,現(xiàn)在的51幾乎不會用到這種模式,而模式3根據(jù)我的應(yīng)用經(jīng)驗,它的功能用模式2完全可以取代,所以基本上也是不用的,那么我們就重點來學(xué)習(xí)模式1和模式2。
模式1,是 THn 和 TLn 組成了一個16位的定時器,計數(shù)范圍是0~65535,溢出后,只要不對 THn 和 TLn 重新賦值,則從0開始計數(shù)。模式2,是8位自動重裝載模式,只有 TLn 做加1計數(shù),計數(shù)范圍0~255,THn 的值并不發(fā)生變化,而是保持原值,TLn 溢出后,TFn就直接置1了,并且 THn 原先的值直接賦給 TLn,然后 TLn 從新賦值的這個數(shù)字開始計數(shù)。這個功能可以用來產(chǎn)生串口的通信波特率,我們講串口的時候要用到,本章節(jié)我們重點來學(xué)習(xí)模式1。為了加深大家理解定時器的原理,我們來看一下他的模式1的電路示意圖5-2。
http://wiki.jikexueyuan.com/project/mcu-tutorial-one/images/60.png" alt="" />
圖5-2 定時器/計數(shù)器模式1示意圖
我?guī)ьI(lǐng)大家一起來分析一遍這個示意圖,日后如果再遇到類似的圖,大家就可以自己研究了。OSC 框表示時鐘頻率,因為1個機器周期等于12個時鐘周期,所以那個 d 就等于12。下邊 GATE 右邊的那個門是一個非門電路,再右側(cè)是一個或門,再往右是一個與門電路,大家可以對照一下5-1節(jié)的內(nèi)容。
圖上可以看出來,下邊部分電路是控制了上邊部分,那我們先來看下邊是如何控制的,我們以定時器0為例。
1) TR0 和下邊或門電路的結(jié)果要進行與運算,TR0 如果是0的話,與運算完了肯定是0,所以如果要讓定時器工作,那么 TR0 就必須置1。
2) 這里的與門結(jié)果要想得到1,那么前面的或門出來的結(jié)果必須也得是1才行。在 GATE 位為1的情況下,經(jīng)過一個非門變成0,或門電路結(jié)果要想是1的話,那 INT0 即 P3.2 引腳必須是1的情況下,這個時候定時器才會工作,而 INT0 引腳是0的情況下,定時器不工作,這就是 GATE 位的作用。
3) 當(dāng) GATE 位為0的時候,經(jīng)過一個非門會變成1,那么不管 INT0 引腳是什么電平,經(jīng)過或門電路后都肯定是1,定時器就會工作。
4) 要想讓定時器工作,就是自動加1,從圖上看有兩種方式,第一種方式是那個開關(guān)打到上邊的箭頭,就是 C/T =0 的時候,一個機器周期 TL 就會加1一次,當(dāng)開關(guān)打到下邊的箭頭,即 C/T =1 的時候,T0 引腳即 P3.4 引腳來一個脈沖,TL 就加1一次,這也就是計數(shù)器功能。