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