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