從(cong) 上一節我們(men) 已經得知,單片機中的定時/計數器都能有多種用途,那麽(me) 我怎樣才能讓它們(men) 工作於(yu) 我所需要的用途呢?這就要通過定時/計數器的方式控製字來設置。
在單片機中有兩(liang) 個(ge) 特殊功能寄存器與(yu) 定時/計數有關(guan) ,這就是TMOD和TCON。順便說一下,TMOD和TCON是名稱,我們(men) 在寫(xie) 程序時就能直接用這個(ge) 名稱來指定它們(men) ,當然也能直接用它們(men) 的地址89H和88H來指定它們(men) (其實用名稱也就是直接用地址,匯編軟件幫你翻譯一下而已)。
<TMOD結構>
從(cong) 圖1中我們(men) 能看出,TMOD被分成兩(liang) 部份,每部份4位。分別用於(yu) 控製T1和T0,至於(yu) 這裏麵是什麽(me) 意思,我們(men) 下麵介紹。
<TCON結構>
從(cong) 圖2中我們(men) 能看出,TCON也被分成兩(liang) 部份,高4位用於(yu) 定時/計數器,低4位則用於(yu) 中斷(我們(men) 暫不管)。而TF1(0)我們(men) 上節課已提到了,當計數溢出後TF1(0)就由0變為(wei) 1。原來TF1(0)在這兒(er) !那麽(me) TR0、TR1又是什麽(me) 呢?看上節課的圖。
計數脈衝(chong) 要進入計數器還真不不難,有層層關(guan) 要通過,最起碼,就是TR0(1)要為(wei) 1,開關(guan) 才能合上,脈衝(chong) 才能過來。因此,TR0(1)稱之為(wei) 運行控製位,可用指令SETB來置位以啟動計數器/定時器運行,用指令CLR來關(guan) 閉定時/計數器的工作,一切盡在自已的掌握中。
<單片機定時器/計數器結構>
定時/計數器的四種工作方式
工作方式0
定時器/計數器的工作方式0稱之為(wei) 13位定時/計數方式。它由TL(1/0)的低5位和TH(0/1)的8位組成13位的計數器,此時TL(1/0)的高3位未用。
我們(men) 用這個(ge) 圖來討論幾個(ge) 問題:
M1M0:定時/計數器一共有四種工作方式,就是用M1M0來控製的,2位正好是四種組合。
C/T:前麵我們(men) 說過,定時/計數器即可作定時用也可用計數用,到底作什麽(me) 用,由我們(men) 根據需要自行決(jue) 定,也說是決(jue) 定權在我們(men) ��編程者。如果C/T為(wei) 0就是用作定時器(開關(guan) 往上打),如果C/T為(wei) 1就是用作計數器(開關(guan) 往下打)。順便提一下:一個(ge) 定時/計數器同一時刻要麽(me) 作定時用,要麽(me) 作計數用,不能同時用的,這是個(ge) 極普通的常識,幾乎沒有教材會(hui) 提這一點,但很多開始學習(xi) 者卻會(hui) 有此困惑。
GATE:看圖,當我們(men) 選擇了定時或計數工作方式後,定時/計數脈衝(chong) 卻不一定能到達計數器端,中間還有一個(ge) 開關(guan) ,顯然這個(ge) 開關(guan) 不合上,計數脈衝(chong) 就沒法過去,那麽(me) 開關(guan) 什麽(me) 時候過去呢?有兩(liang) 種情況
GATE=0,分析一下邏輯,GATE非後是1,進入或門,或門總是輸出1,和或門的另一個(ge) 輸入端INT1無關(guan) ,在這種情況下,開關(guan) 的打開、合上隻取決(jue) 於(yu) TR1,隻要TR1是1,開關(guan) 就合上,計數脈衝(chong) 得以暢通無阻,而如果TR1等於(yu) 0則開關(guan) 打開,計數脈衝(chong) 無法通過,因此定時/計數是否工作,隻取決(jue) 於(yu) TR1。
GATE=1,在此種情況下,計數脈衝(chong) 通路上的開關(guan) 不僅(jin) 要由TR1來控製,而且還要受到INT1管腳的控製,隻有TR1為(wei) 1,且INT1管腳也是高電平,開關(guan) 才合上,計數脈衝(chong) 才得以通過。這個(ge) 特性能用來測量一個(ge) 信號的高電平的寬度,想想看,怎麽(me) 測?
為(wei) 什 麽(me) 在這種模式下隻用13位呢?幹嗎不用16位,這是為(wei) 了和51機的前輩48係列兼容而設的一種工作式,如果你覺得用得不順手,那就幹脆用第二種工作方式。
工作方式1
工作方式1是16位的定時/計數方式,將M1M0設為(wei) 01即可,其它特性與(yu) 工作方式0相同。
工作方式2
在介紹這種式方式之前先讓我們(men) 思考一個(ge) 問題:上一次課我們(men) 提到過任意計數及任意定時的問題,比如我要計1000個(ge) 數,可是16位的計數器要計到65536才滿,怎麽(me) 辦呢?我們(men) 討論後得出的辦法是用預置數,先在計數器裏放上64536,再來1000個(ge) 脈衝(chong) ,不就行了嗎?是的,但是計滿了之後我們(men) 又該怎麽(me) 辦呢?要知道,計數總是持續重複的,流水線上計滿後馬上又要開始下一次計數,下一次的計數還是1000嗎?當計滿並溢出後,計數器裏麵的值變成了0(為(wei) 什麽(me) ,能參考前麵課程的說明),因此下一次將要計滿65536後才會(hui) 溢出,這可不符合要求,怎麽(me) 辦?當然辦法很簡單,就是每次一溢出時執行一段程序(這常常是需要的,要不然要溢出幹嗎?)能在這段程序中做把預置數64536送入計數器中的事情。所以采用工作方式0或1都要在溢出後做一個(ge) 重置預置數的工作,做工作當然就得要時間,一般來說這點時間不算什麽(me) ,可是有一些場合我們(men) 還是要計較的,所以就有了第三種工作方式��自動再裝入預置數的工作方式。
既然要自動得新裝入預置數,那麽(me) 預置數就得放在一個(ge) 地方,要不然裝什麽(me) 呢?那麽(me) 預置數放在什麽(me) 地方呢?它放在T(0/1)的高8位,那麽(me) 這樣高8位不就不能參與(yu) 計數了嗎?是的,在工作方式2,隻有低8位參與(yu) 計數,而高8位不參與(yu) 計數,用作預置數的存放,這樣計數範圍就小多了,當然做任可事總有代價(jia) 的,關(guan) 鍵是看值不值,如果我根本不需要計那麽(me) 多數,那麽(me) 就能用這種方式。看圖4,每當計數溢出,就會(hui) 打開T(0/1)的高、低8位之間的開關(guan) ,計預置數進入低8位。這是由硬件自動完成的,不需要由人工幹預。
常常這種式作方式用於(yu) 波特率發生器(我們(men) 將在串行接口中講解),用於(yu) 這種用途時,定時器就是為(wei) 了供給一個(ge) 時間基準。計數溢出後不需要做事情,要做的僅(jin) 僅(jin) 隻有一件,就是重新裝入預置數,再開始計數,而且中間不要任何延遲,可見這個(ge) 任務用工作方式2來完成是最妙不過了。
工作方式3
這種式作方式之下,定時/計數器0被拆成2個(ge) 獨立的定時/計數器來用。其中,TL0能組成8位的定時器或計數器的工作方式,而TH0則隻能作為(wei) 定時器來用。我們(men) 知道作定時、計數器來用,需要控製,計滿後溢出需要有溢出標記,T0被分成兩(liang) 個(ge) 來用,那就要兩(liang) 套控製及、溢出標記了,從(cong) 何而來呢?TL0還是用原來的T0的標記,而TH0則借用T1的標記。如此T1不是無標記、控製可用了嗎?是的。
一般情況處,隻有在T1以工作方式2運行(當波特率發生器用)時,才讓T0工作於(yu) 方式3的。
定時器/計數器的定時/計數範圍
工作方式0:13位定時/計數方式,因此,最多能計到2的13次方,也就是8192次。
工作方式1:16位定時/計數方式,因此,最多能計到2的16次方,也就是65536次。
工作方式2和工作方式3,都是8位的定時/計數方式,因此,最多能計到2的8次方,也說是256次。
預置值計算:用最大計數量減去需要的計數次數即可。
例:流水線上一個(ge) 包裝是12盒,要求每到12盒就產(chan) 生一個(ge) 動作,用單片機的工作方式0來控製,應當預置多大的值呢?對了,就是8192-12=8180。
以上是計數,明白了這個(ge) 道理,定時也是一樣。這在前麵的課程已提到,我們(men) 不再重複,請參考前麵的例程。