51單片機內有兩個定時/計數(shù)器,稱為t0和t1,是16位的,所以它們各由兩個8位的特殊功能寄存器(sfr)組成,即t0=th0+tl0,t1=th1+tl1,默認情況下,通電后它們是不啟動的。
一、定時/計數(shù)器的應用
1.計數(shù)功能:
2.定時功能:
二、定時/計數(shù)器的工作原理
定時/計數(shù)器中的核心部件為可預置初值計數(shù)器。預置初值后開始計數(shù),直至計數(shù)值產(chǎn)生溢出,可查詢判斷此溢出;也可申請中斷。
定時/計數(shù)器的結構示意圖
2.定時器的控制、模式寄存器
tmod定時器方式寄存器(89h) tcon定時器控制/狀態(tài)寄存器(88h)
定時實驗(采用查詢法)
如圖,p0口接了8只發(fā)光管,高電平亮。用定時器實現(xiàn)50ms延時,輪流點亮。(注:實驗時用短路帽短路jmp2的2-3腳和jmp3的2-3腳)
參考程序:
org 0000h
main: mov tmod,#00000001b ;選t0,定時,方式1
mov th0,#3ch
mov tl0,#0b0h ;預置初值15536
setb tr0 ;啟動t0
mov a,#00000001b ;設置顯示模式
loop: mov p0,a
rl a
jnb tf0,$ ;等候50ms的溢出
clr tf0
mov th0,#3ch
mov tl0,#0b0h ;預置初值15536
sjmp loop
思考題:⑴ 若定時30ms,怎樣修改程序?
⑵ 若定時1秒,怎樣修改程序?
⑶ 若定時任意長時間,怎樣修改程序?
計數(shù)實驗
如圖,計數(shù)器t0的計數(shù)引腳(p3.4腳)接有一開關,每按一次開關,理論上計數(shù)器t0就會計一個數(shù)(若考慮抖動問題,實際上可能會計多個數(shù)),讀出該數(shù)送p0口,通過p0口的發(fā)光管的亮滅情況,讀出計數(shù)值(設t0計數(shù)、用方式2)。
參考程序:
org 0000h
main: mov p0,#0
mov tmod,#00000110b ;選t0,計數(shù),方式2
setb tr0 ;啟動t0
loop: mov a,tl0 ;讀出t0的低8位值送a寄存器
mov p0,a ;送p0口顯示
sjmp loop
思考題:⑴ 若計數(shù)100,然后聲光指示,怎樣修改程序?
⑵ 若計數(shù)500,然后聲光指示,怎樣修改程序?
定時、計數(shù)聯(lián)合實驗(采用查詢法)
任務:定時器t0產(chǎn)生2000hz方波信號,從p3.6腳輸出,再從t1的計數(shù)腳p3.5引入;t0還產(chǎn)生1秒的定時信號,定期打開和關閉t1計數(shù)器。打開t1時,方波信號輸入并計數(shù);關閉t1時,讀出t1的值送p0口和p1口顯示(注:p1口的值是反相的,即低電平亮,高電平滅。當然可以取反后送p1口)。
參考程序:
;*********************************************************
;************* 數(shù)字頻率計程序 ***************
;*********************************************************
;任務:利用定時器t0定時,產(chǎn)生2khz方波,從p3.6腳輸出,
;并送p3.5腳(t1的計數(shù)腳)進行計數(shù);t0還產(chǎn)生1秒定時,不斷地
;打開和關閉t1計數(shù)器,并將讀取到的頻率值送p0口和p1口顯示。
;分析:2khz方波,設占空比為50%,則高低電平的時間各為250us,
;可用t0定時,選方式2,自動重新裝載初始值6。t1計數(shù),方式1。
;硬件上,將p3.6腳與p3.5腳相連(注意從排針上相連或短路帽短接)即可。
org 0000h
ljmp main
;*********************************************************
;主程序
org 0030h
main: mov p0,#0
mov p1,#0ffh
mov p3,#0ffh ;初始化,關閉所有發(fā)光管
mov r3,#0
mov r4,#0 ;r3-r4組成1秒計數(shù)器
mov tmod,#01010010b ;t1計數(shù),方式1;
;t0定時,方式2。
mov th0,#6
mov tl0,#6 ;預置初始值6,準備計數(shù)250
mov th1,#0
mov tl1,#0
setb tr0 ;啟動定時器t0
main_disp: jnb tf0, main_disp
clr tf0
cpl p3.6 ;輸出方波
inc r3
cjne r3,#0,next
inc r4
sjmp main_disp
next: cjne r3,#0a0h,main_disp
cjne r4,#0fh,main_disp ;判斷夠4000次計數(shù)嗎?
;因為中斷4000次為1秒。
mov r3,#0
mov r4,#0 ;1秒計數(shù)器清0
cpl tr1 ;啟動或關閉t1計數(shù)器
jb tr1,main_disp ;若t1啟動則返回,否則去讀取頻率值
mov a,tl1
mov p0,a ;將頻率值的低8位送p0口顯示
mov a,th1
cpl a ;考慮p1口是低電平點亮,故取反
mov p1,a ; 將頻率值的高8位送p1口顯示
mov tl1,#0
mov th1,#0 ;t1計數(shù)器清0
ljmp main_disp
end
;注:以上送p1和p0口的數(shù)據(jù)為16進制。經(jīng)實驗,得到的16進制值為07h、0d0h。
;***************************************************************