mcs51單片機(jī)計數(shù)器/定時器工作方式3 編程舉例
2個8位方式。工作方式3只適用于定時器0。如果使定時器1為工作方式3,則定時器1將處于關(guān)閉狀態(tài)。
當(dāng)T0為工作方式3時,THo和TL0分成2個獨立的8位計數(shù)器。其中,TL0既可用作定時器,又可用作計數(shù)器,并使用原T0的所有控制位及其定時器回零標(biāo)志和中斷源。TH0只能用作定時器,并使用T1的控制位TRl、回零標(biāo)志TFl和中斷源,見下圖。
通常情況下,T0不運行于工作方式3,只有在T1處于工作方式2,并不要求中斷的條件下才可能使用。這時,T1往往用作串行口波特率發(fā)生器(見1.4),TH0用作定時器,TL0作為定時器或計數(shù)器。所以,方式3是為了使單片機(jī)有1個獨立的定時器/計數(shù)器、1個定時器以及1個串行口波特率發(fā)生器的應(yīng)用場合而特地提供的。這時,可把定時器l用于工作方式2,把定時器0用于工作方式3。
這時,T1往往用作串行口波特率發(fā)生器,TH0用作定時器,TL0作為定時器或計數(shù)器。所以,方式3是為了使單片機(jī)有1個獨立的定時器/計數(shù)器、1個定時器以及1個串行口波特率發(fā)生器的應(yīng)用場合而特地提供的。這時,可把定時器l用于工作方式2,把定時器0用于工作方式3。
理解內(nèi)容
定時器/計數(shù)器與中斷綜合應(yīng)用舉例內(nèi)
例題:時鐘計時程序設(shè)計。
所謂時鐘計時,就是以秒、分、時為單位進(jìn)行的計時??梢园言摮绦蚩闯墒嵌〞r器/計數(shù)器與中斷應(yīng)用的典型代表,就算是對這兩部分內(nèi)容的復(fù)習(xí)。
⑴MCS-51單片機(jī)實現(xiàn)時鐘計時顯示的基本方法內(nèi)
①首先要計算計數(shù)初值
時鐘計時的關(guān)鍵問題是秒的產(chǎn)生,因為秒是最小時鐘單位,但使用MMCS-51的定時器/計數(shù)器進(jìn)行定時,即使按工作方式1,其最大定時時間也只能達(dá)到131毫秒,離1秒還差好遠(yuǎn)。為此,我們把秒計時用硬件定時和軟件計數(shù)相結(jié)合的方法實現(xiàn),即:把定時器的定時時間定為125毫秒,這樣當(dāng)計數(shù)溢出8次就可得到1秒,而8次計數(shù)可用軟件方法實現(xiàn)。
為得到125ms定時,我們可使用定時器/計數(shù)器0,以工作方式1進(jìn)行,當(dāng)設(shè)定單片機(jī)為6MHz晶振,設(shè)計數(shù)初值為X,則有如下等式:
(216-X)×2us=125000us
計算得計數(shù)初值X=3036,
二進(jìn)制表示為0000101111001101,十六進(jìn)制表示為0BCDH。
②定時器定時采用中斷方式完成,以便于通過中斷服務(wù)程序進(jìn)行溢出次數(shù)(每次125毫秒)的累計,計 滿8次即得到秒計時。
③通過在程序中的數(shù)值累加和數(shù)值比較來實現(xiàn)從秒到分和從分到時的計時
④設(shè)置時鐘顯示及顯示緩沖區(qū)
假定時鐘時間在六位LED數(shù)碼管(LED5~LED0)上進(jìn)行顯示(時、分、秒各占兩位)。為此,要在內(nèi)部RAM中設(shè)置顯示緩沖區(qū),共6個單元(79H~7EH),與數(shù)碼管的對應(yīng)關(guān)系為:
LED5→7EH、LED4→7DH、LED3→7CH、LED2→7BH、LED1→7AH、LED0→79H。
即顯示緩沖區(qū)從左向右依次存放時、分、秒的數(shù)值。內(nèi)容來自單片機(jī)之家www.dpj100.com
⑤假定已有LED顯示程序為SMXS可供調(diào)用
⑵程序流程
①主程序(MAIN)
主程序的主要功能是進(jìn)行定時器/計數(shù)器的初始化編程,然后通過反復(fù)調(diào)用顯示子程序的方法,等待125ms定時中斷的到來。
②中斷服務(wù)程序(PIT0)
中斷服務(wù)程序的主要功能是進(jìn)行計時操作。程序開始先判斷計數(shù)溢出是否滿了8次,不滿8次表明還沒達(dá)到最小計時單位秒,中斷返回;如滿8次則表明已達(dá)到最小計時單位秒,程序繼續(xù)向下執(zhí)行,進(jìn)行計時操作
③加1子程序(DAAD1)
加1子程序用于完成對秒、分和時的加1操作,中斷服務(wù)程序中在秒、分、時加1時共有三處調(diào)用此子程序。加1操作共包括以下三項內(nèi)容:
合數(shù)
由于每位LED顯示器對應(yīng)一個8位的緩沖單元,因此由兩位BCD碼表示的時間值各占用一個緩沖單元,且只占其低4位。為此在加1運算之前需把兩個緩沖單元中存放的數(shù)值合并起來,構(gòu)成一個字節(jié),然后才能進(jìn)行加1運算。合字之說由此而來。
十進(jìn)制調(diào)整
對加1并進(jìn)行十進(jìn)制調(diào)整
分?jǐn)?shù)
把加1后的時間值再拆分成兩個字節(jié),送回各自的緩沖單元中。
⑶ 程序清單
整個參考程序清單如下:
ORG 8000H
START:AJMP MAIN
ORG 800BH
AJMP PITO
ORG 8100H
MAIN: MOV SP, #60H ;確立堆棧區(qū)
MOV R0, #79H ;顯示緩沖區(qū)首地址
MOV R7, #06H ;顯示位數(shù)
ML1: MOV @R0, #00H ;顯示緩沖單元清0
INC R0
DJNZ R7, ML1
MOV TMOD, #01H ;定時器0,工作方式1
MOV TL0, #0CDH ;裝計數(shù)器初值
MOV TH0, #0BH
SETB 8CH ;TR0置1,定時開始
SETB AFH ;EA置1,中斷總允許
SETB A9H ;ET0置1,定時器0中斷允許
MOV 30H, #08H ;要求的計數(shù)溢出次數(shù),即循環(huán)次數(shù)
ML0: LCALL SMXS ;調(diào)用顯示子程序
SJMP ML0
PITO: PUSH PSW ;中斷服務(wù)程序,現(xiàn)場保護(hù)
PUSH ACC
SETB PSW.3 ;RS1RS0=01,選1組通用寄存器
MOV TL0, #0CDH ;計數(shù)器重新加載
MOV TH0, #0BH
MOV A, 30H ;循環(huán)次數(shù)減1
DEC A
MOV 30H, A
JNZ RET0 ;不滿8次,轉(zhuǎn)RET0返回
MOV 30H, #08H ;滿8次,開始計時操作
MOV R0, #7AH ;秒顯示緩沖單元地址
ACALL DAAD1 ;秒加1
MOV A, R2 ;加1后秒值在R2中
XRL A, #60H ;判是否到60秒
JNZ RET0 ;不到,轉(zhuǎn)RETO返回