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