51單片機(jī)的定時(shí)/計(jì)數(shù)器(CTC)及應(yīng)用
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)生溢出,可查詢判斷此溢出;也可申請(qǐng)中斷。
- 定時(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í)任意長(zhǎng)時(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方波信號(hào),從P3.6腳輸出,再從T1的計(jì)數(shù)腳P3.5引入;T0還產(chǎn)生1秒的定時(shí)信號(hào),定期打開和關(guān)閉T1計(jì)數(shù)器。打開T1時(shí),方波信號(hào)輸入并計(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。
;***************************************************************
編輯:admin 最后修改時(shí)間:2018-05-08