定時(shí)器/計(jì)數(shù)器方式2的編程和應(yīng)用
方式2是一個(gè)可以自動(dòng)重新裝載初值的8位計(jì)數(shù)器/定時(shí)器。這種工作方式可以省去用戶程序中重新裝入初值的指令。
當(dāng)AT89S51的某個(gè)定時(shí)器/計(jì)數(shù)器不使用時(shí),可為AT89S51擴(kuò)展一個(gè)負(fù)跳沿觸發(fā)的外部中斷源。
例1:擴(kuò)展一個(gè)負(fù)跳沿觸發(fā)的外部中斷源,把定時(shí)器/計(jì)數(shù)器T0引腳作為外部中斷請(qǐng)求輸入端,溢出標(biāo)志TF0作為外部中斷請(qǐng)求標(biāo)志。
基本思想:當(dāng)某一定時(shí)器/計(jì)數(shù)器被設(shè)置為方式2(自動(dòng)裝入常數(shù)方式)計(jì)數(shù)工作模式,計(jì)數(shù)器TH0、TL0初值均為0FFH,并允許T0中斷,總中斷開放。當(dāng)T0引腳電平發(fā)生負(fù)跳變時(shí),T0計(jì)數(shù)器溢出,TF0置1,從而向單片機(jī)發(fā)出中斷請(qǐng)求。
初始化程序如下:
程序說(shuō)明:當(dāng)連接在P3.4(T0引腳)的外部中斷請(qǐng)求輸入線上的電平發(fā)生負(fù)跳變時(shí),TL0加1,產(chǎn)生溢出,TF0置1,向單片機(jī)發(fā)出中斷請(qǐng)求,同時(shí)TH0的內(nèi)容0FFH送TL0,即TL0恢復(fù)初值0FFH,這樣,P3.4腳相當(dāng)于一個(gè)跳沿觸發(fā)的外部中斷請(qǐng)求源輸入端。對(duì)P3.5也可做類似處理。
例2:當(dāng)T0 (P3.4)引腳上發(fā)生負(fù)跳變時(shí),作為Pl.0引腳產(chǎn)生方波的啟動(dòng)信號(hào)。則開始從P1.0引腳上輸出一個(gè)周期為1 ms的方波,如下圖所示(假設(shè)系統(tǒng)時(shí)鐘為6MHz)。
基本思想:T0設(shè)置為方式1計(jì)數(shù)器模式,初值設(shè)為FFFFH。當(dāng)外部計(jì)數(shù)輸入端T0(P3.4)發(fā)生一次負(fù)跳變時(shí),計(jì)數(shù)器T0加1且溢出,溢出標(biāo)志TF0置1,向CPU發(fā)出中斷請(qǐng)求,此時(shí)T0相當(dāng)于一個(gè)負(fù)跳沿觸發(fā)的外部中斷源。進(jìn)入T0中斷程序后,把F0標(biāo)志置1,說(shuō)明T0引腳上已接收過(guò)負(fù)跳變信號(hào)。T1定義為方式2定時(shí)器模式。在T0引腳產(chǎn)生一次負(fù)跳變后,啟動(dòng)Tl每500 μs產(chǎn)生一次中斷,在中斷服務(wù)子程序中對(duì)P1.0求反,使P1.0產(chǎn)生周期l ms的方波。由于方式2省去了用戶程序中重新裝入初值的指令,所以可產(chǎn)生精確的定時(shí)時(shí)間。
(1)計(jì)算Tl的初值。設(shè)T1的初值為X,則
(2)程序設(shè)計(jì)。參考程序如下:
程序說(shuō)明:當(dāng)單片機(jī)復(fù)位時(shí),從0000H跳向主程序MAIN處執(zhí)行程序。其中調(diào)用了對(duì)T0、T1初始化子程序PT0M2。子程序返回后執(zhí)行標(biāo)號(hào)LOOP處指令,循環(huán)等待T0引腳上負(fù)脈沖的到來(lái)。由于負(fù)脈沖到來(lái)的標(biāo)志位F0的復(fù)位初始值為0,所以程序就在標(biāo)號(hào)LOOP處循環(huán)等待。當(dāng)T0(P3.4)引腳上發(fā)生負(fù)跳變時(shí),由于T0計(jì)數(shù)溢出,則跳向T0中斷服務(wù)子程序。此時(shí)停止T0計(jì)數(shù),并把T0引腳接收過(guò)負(fù)脈沖的標(biāo)志F0置1。當(dāng)中斷返回時(shí),由于F0已被置1,則程序跳出LOOP處的循環(huán)等待。此時(shí)執(zhí)行指令來(lái)允許Tl中斷,并啟動(dòng)Tl定時(shí),然后執(zhí)行“AJMPHERE”指令,循環(huán)等待,等待Tl的500 μs定時(shí)中斷到來(lái)。當(dāng)Tl的500 μs定時(shí)中斷產(chǎn)生時(shí),則進(jìn)入Tl的中斷服務(wù)子程序ITIP,把P1.0腳上的電平取反。由于方式2是初值可以自動(dòng)重新裝載,從而省去對(duì)Tl重新裝入初值06H的指令。中斷返回后,到“AJMP HERE”指令處繼續(xù)等待Tl的500μs定時(shí)中斷。如此重復(fù),即可得到上圖所示的波形。
例3:利用定時(shí)器Tl的方式2對(duì)外部信號(hào)計(jì)數(shù),要求每計(jì)滿100個(gè)數(shù),將P1.0取反。
本例是方式2計(jì)數(shù)模式的應(yīng)用舉例。
(1)選擇工作方式。外部信號(hào)由T1(P3.5)引腳輸入,每發(fā)生一次負(fù)跳變計(jì)數(shù)器便加1,每輸入100個(gè)脈沖,計(jì)數(shù)器將產(chǎn)生溢出中斷,在中斷服務(wù)程序中將P1.0取反一次。
Tl工作在方式2的方式控制字為TMOD=60H。不使用T0時(shí),TMOD的低4位可任取,但不能使T0進(jìn)入方式3,這里取全0。
(2)計(jì)算T1的初值
因此,TL1的初值為9CH,重裝初值寄存器TH1=9CH。
(3)程序設(shè)計(jì)。參考程序如下:
程序說(shuō)明:由于Tl的中斷服務(wù)子程序只有兩條指令,不超過(guò)8個(gè)字節(jié),所以進(jìn)入Tl中斷服務(wù)程序入口后,直接就執(zhí)行這兩條指令,而沒(méi)有選擇再跳轉(zhuǎn)。