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