高娟 高英 崔艷萍
單片機內(nèi)部的定時/計數(shù)器資源在生活中有廣泛的應用。本文結合筆者實際教學的過程及任務介紹課堂設計。
首先介紹前一個任務——“控制流水燈顯示”中的延時程序存在的問題,即:延時時間是用軟件延時產(chǎn)生的,不夠精確,從而引出本次課的任務——用定時/計數(shù)器控制信號燈閃爍,通過這一任務來學習單片機的定時/計數(shù)器資源。要實現(xiàn)定時/計數(shù)器控制信號燈閃爍,就要知道使用定時/計數(shù)器的步驟,要掌握使用定時/計數(shù)器的步驟,就要先了解單片機定時/計數(shù)器的工作原理,這就是本次課的教學內(nèi)容。
一、單片機定時/計數(shù)器的工作原理
單片機本身是數(shù)字電路,它只能數(shù)脈沖。這個脈沖來自于兩個地方:一個是18,19腳接的晶振產(chǎn)生的脈沖信號,這個脈沖信號到單片機內(nèi)部經(jīng)過12分頻后提供給定時器,定時器每接收到1個脈沖就會自動把計的數(shù)加1,而這個脈沖的周期就是機器周期,對機器周期進行計數(shù)當然就實現(xiàn)了定時功能。計數(shù)脈沖的另一個來源是單片機輸入引腳P3.4和P3.5的外部脈沖信號,因為外部脈沖的周期不確定,所以這一次實現(xiàn)的就是計數(shù)功能。由此可見,定時和計數(shù)的本質(zhì)都是計數(shù),只是計數(shù)的對象不同而已。因此,定時問題可以轉(zhuǎn)換成計數(shù)問題。
剛才講了單片機的定時/計數(shù)器每接到一個脈沖就自動把計的數(shù)加1,這個數(shù)就放在了TH0、TL0、TH1、TL1里。TH0、TL0、TH1、TL1稱之為計數(shù)容器。
單片機的定時/計數(shù)器到底是怎樣工作的呢?定時/計數(shù)器的計數(shù)也像是往一個水桶里注水一樣,水桶里面先存了一些水,然后再一滴滴往里面注水,直到水桶滿了溢出為止。先存的水加上后滴的水就等于水桶的容量。對于定時/計數(shù)器而言,水桶的容量相當于定時/計數(shù)器的計數(shù)范圍,設為M,先存的水相當于定時/計數(shù)器的計數(shù)初值,設為X,后滴的水相當于要計的數(shù)值,設為T。實際上我們總是已知要計的數(shù)值T,而計數(shù)器的計數(shù)范圍M是可以選擇的,也就是可變的,而初值X是未知的。顯然,M=X+T,因此我們首先確定定時/計數(shù)器的計數(shù)范圍M,接著計算初值X并將X裝入定時/計數(shù)器的計數(shù)容器中,再啟動定時/計數(shù)器,它就開始工作了。下面就來具體介紹定時/計數(shù)器的工作步驟。
二、使用定時/計數(shù)器的步驟
1.設置工作方式
設置工作方式可以解決兩個問題:選擇定時或計數(shù)功能,確定計數(shù)范圍M。這兩個功能合稱為設置工作方式。設置工作方式是通過配置工作方式寄存器TMOD來實現(xiàn)的。具體用到的是這條指令:MOV TMOD,#XXH。究竟為TMOD送什么值,就要看TMOD的格式了。TMOD的高四位為T1的方式字段,低四位是T0的方式字段。高四位和低四位的含義是相同的。
提問:定時1s,應該選用哪種工作方式?怎樣初始化呢? 1s=106us,超出了任何一種工作方式的最長定時時間,那么是不是就不能定時1s了呢?實際上可以利用循環(huán),把1s可以轉(zhuǎn)換成10ms×100次,20ms×50次或者50ms×20次,這樣可以定時小的時間,再循環(huán)一定的次數(shù)就可以實現(xiàn)了。定時1s,可以選用工作方式1;如果選用定時器0,則用MOV TMOD,#01H;如果選用定時器1,則用MOV TMOD,#10H。當完成了初始化以后,就該設定計數(shù)初值了。
2.預置計數(shù)初值。
要計的數(shù)值T是已知的,計數(shù)范圍M也已經(jīng)確定了,那么計數(shù)初值X=M-T,將X裝入16位計數(shù)容器就稱為預置計數(shù)初值。預置初值是通過這兩條指令實現(xiàn)的。
MOV TH0, #XXH
MOV TL0, #XXH
首先我們根據(jù)剛才講過的計數(shù)器工作原理來計算定時1s的計數(shù)初值。
10ms=10000μs,1個機器周期是1μs,計數(shù)器加1,因此10000μs就要計數(shù)10000次,最大值是65536,所以初始值應該設為65536-10000=55536。55536轉(zhuǎn)換為16進制數(shù)是3CB0,所以,應該通過以下兩條指令預置計數(shù)初值。
MOV TH0, #3CH
MOV TL0, #0B0H
完成了TMOD的初始化,又設定好了計數(shù)初值后,就該啟動定時/計數(shù)器工作了,這是靠控制寄存器TCON完成的。
3.啟動定時
TCON的作用是控制定時/計數(shù)器的啟動、停止,標志定時/計數(shù)器的溢出和中斷情況。定時/計數(shù)器控制TCON的格式如下圖所示。
■
TOCN中的低4位用于控制外部中斷,與定時/計數(shù)器無關,將在中斷系統(tǒng)介紹。
TR1:定時/計數(shù)器1運行控制位。
TR0:定時/計數(shù)器0運行控制位。
通過指令SETB TR0/TR1將相應的位置1就可以啟動定時或計數(shù)了,就像賽跑時開發(fā)令槍就開始比賽一樣。
TF0:定時/計數(shù)器0溢出標志位。
TF1:定時/計數(shù)器1溢出標志位。
當定時/計數(shù)器1計滿溢出時,由硬件自動設置TF1=1,根據(jù)TF標志位CPU就知道什么時候定時結束了。
4.查詢等待完成定時
查詢等待完成定時通過這一條指令就可以了:JBC TF0/TF1,LP。
通過上面的介紹,學生已經(jīng)知道使用定時/計數(shù)器的步驟了,接下來就綜合以上各步,實現(xiàn)用定時/計數(shù)器控制信號燈閃爍,延時1s。
參考文獻:
范紅剛,魏學海,任思璟.51單片機自學筆記[M].北京:北京航空航天大學出版社,2010.