第6章AT89S1單片機的定時器計數(shù)器_第1頁
第6章AT89S1單片機的定時器計數(shù)器_第2頁
第6章AT89S1單片機的定時器計數(shù)器_第3頁
第6章AT89S1單片機的定時器計數(shù)器_第4頁
第6章AT89S1單片機的定時器計數(shù)器_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1第第6 6章章 at89s51at89s51單片機的單片機的定時器定時器/ /計數(shù)器計數(shù)器1成都理工大學(xué)工程技術(shù)學(xué)院成都理工大學(xué)工程技術(shù)學(xué)院自動化工程系自動化工程系2 2第第6章章 目錄目錄6.1 定時器定時器/計數(shù)器的結(jié)構(gòu)計數(shù)器的結(jié)構(gòu) 6.1.1 工作方式控制寄存器tmod 6.1.2 定時器/計數(shù)器控制寄存器tcon6.2 定時器定時器/計數(shù)器的計數(shù)器的4種工作方式種工作方式 6.2.1 方式0 6.2.2 方式1 6.2.3 方式2 6.2.4 方式36.3 對外部輸入的計數(shù)信號的要求對外部輸入的計數(shù)信號的要求36.4 定時器定時器/計數(shù)器的編程和應(yīng)用計數(shù)器的編程和應(yīng)用 6.4.1 方

2、式1的應(yīng)用 6.4.2 方式2的應(yīng)用 6.4.3 方式3的應(yīng)用 6.4.4 門控制位gatex的應(yīng)用測量脈沖寬度 6.4.5 實時時鐘的設(shè)計4內(nèi)容概要內(nèi)容概要工業(yè)檢測與控制,許多場合都要用到計數(shù)計數(shù)或定時定時功能。例如,對外部脈沖進行計數(shù),產(chǎn)生精確的定時時間等。at89s51片內(nèi)有兩個可編程的定時器/計數(shù)器t1、t0,可滿足需要。本章介紹定時器/計數(shù)器的結(jié)構(gòu)結(jié)構(gòu)與功能功能,2種工作模式工作模式和4種工作方式工作方式,以及相關(guān)的2個特殊功能寄存器個特殊功能寄存器tmod和tcon各位的定義及其編程,最后介紹定時器/計數(shù)器的編程及應(yīng)用實例。56.1 定時器定時器/計數(shù)器的結(jié)構(gòu)計數(shù)器的結(jié)構(gòu)定時器/計

3、數(shù)器結(jié)構(gòu)結(jié)構(gòu)如圖圖6-1所示所示,定時器/計數(shù)器t0由特殊功能寄存器th0、tl0構(gòu)成,定時器/計數(shù)器t1由特殊功能寄存器th1、tl1構(gòu)成。 5圖6-1 at89s51單片機的定時器/計數(shù)器結(jié)構(gòu)框圖6具有定時器和計數(shù)器2種工作模式種工作模式,4種工作方式(種工作方式(方式0、方式1、方式2和方式3)。屬于增計數(shù)器增計數(shù)器。tmod用于選擇定時器/計數(shù)器t0、t1的工作模式和工作方式。tcon用于控制t0、t1的啟動和停止計數(shù),同時包含了t0、t1的狀態(tài)。t0、t1不論是工作在定時器模式還是計數(shù)器模式,都是對脈沖信號進行計數(shù),只是計數(shù)信號的來源不同。計數(shù)器模式計數(shù)器模式是對加在t0(p3.4)

4、和t1(p3.5)兩個引腳上的外部脈沖進行計數(shù)(見圖6-1)。定時器工作模式定時器工作模式是對單片機的時鐘振蕩器信號經(jīng)片內(nèi)6712分頻后的內(nèi)部脈沖信號計數(shù)。由于時鐘頻率是定值,所以可根據(jù)計數(shù)值計算出定時時間根據(jù)計數(shù)值計算出定時時間。計數(shù)器的起始計數(shù)都是從計數(shù)器初值開始從計數(shù)器初值開始的的。單片機復(fù)位時計數(shù)器的初值為0,也可用指令給計數(shù)器裝入一個新的初值。6.1.1 工作方式控制寄存器工作方式控制寄存器tmod用于選擇定時器/計數(shù)器的工作模式和工作方式,字節(jié)地址字節(jié)地址為89h,不能位尋址,格式如圖圖6-2所示所示。8圖圖6-2 tmod格式格式8位分為兩組,高高4位位控制t1,低低4位位控制t

5、0。tmod各位的功能。(1)gate門控位門控位。 0:僅由運行控制位trx(x = 0,1)來控制定時器/計數(shù)器運行。 1:用外中斷引腳( 或 )上的電平與運行控制位trx共同來控制定時器/計數(shù)器運行。89(2)m1、m0工作方式選擇位工作方式選擇位m1、m0共有4種編碼,對應(yīng)于4種工作方式種工作方式的選擇,如表6-1所示。(3)c/ 計數(shù)器模式和定時器模式選擇位計數(shù)器模式和定時器模式選擇位9t10 0:為定時器工作模式,對單片機的晶體振蕩器12分頻后的脈沖進行計數(shù)。1:為計數(shù)器工作模式,計數(shù)器對外部輸入引腳t0(p3.4)或t1(p3.5)的外部脈沖(負跳變)計數(shù)。6.1.2 定時器定時

6、器/計數(shù)器控制寄存器計數(shù)器控制寄存器tcon 字節(jié)地址為88h,可位尋址,位地址為88h8fh。格式如圖6-3所示所示。圖圖6-3 tcon格式格式11在第5章已介紹與外部中斷有關(guān)的低4位。這里僅介紹與定時器/計數(shù)器相關(guān)的高4位功能。(1)tf1、tf0計數(shù)溢出標(biāo)志位。當(dāng)計數(shù)器計數(shù)溢出時,該位置“1”。使用查詢方式時,此位作為狀態(tài)位供cpu查詢,但應(yīng)注意查詢有效后,應(yīng)使用軟件及時將該位清“0”。使用中斷方式時,此位作為中斷請求標(biāo)志位,進入中斷服務(wù)程序后由硬件自動清“0”。(2)tr1、tr0計數(shù)運行控制位。tr1位(或tr0位)= 1,啟動定時器/計數(shù)器工作的必要條件。1112tr1位(或tr

7、0位) = 0,停止定時器/計數(shù)器工作。該位可由軟件置“1”或清“0”。6.2 定時器定時器/計數(shù)器的計數(shù)器的4種工作方式種工作方式4種工作方式分別介紹如下。6.2.1 方式方式0m1、m0=00時,被設(shè)置為工作方式0,等效邏輯結(jié)構(gòu)框圖如圖圖6-4所示所示(以定時器/計數(shù)器t1為例,tmod.5、tmod.4 = 00)。1213圖6-4 定時器/計數(shù)器方式0邏輯結(jié)構(gòu)框圖13位位計數(shù)器,由tlx x(x = 0,1)低低5位位和thx高高8位位構(gòu)成。tlx低5位溢出則向thx進位,thx計數(shù)溢出則把tcon中的溢出標(biāo)志位tfx置“1”。1314圖圖6-2的的c/ 位位控制的電子開關(guān)決定了定時器

8、/計數(shù)器的兩種工作模式。(1)c/ =0,電子開關(guān)打在上面位置,t1(或t0)為定時器工作模式,把時鐘振蕩器12分頻后的脈沖作為計數(shù)信號。(2)c/ =1,電子開關(guān)打在下面位置,t1(或t0)為計數(shù)器工作模式,計數(shù)脈沖為p3.4(或p3.5)引腳上的外部輸入脈沖,當(dāng)引腳上發(fā)生負跳變時,計數(shù)器加1。gate位狀態(tài)位狀態(tài)決定定時器/計數(shù)器的運行控制取決trx一個條件還是trx和 x(x = 0,1)引腳狀態(tài)兩個條件兩個條件。14tttint15(1) gate = 0,a點(見圖6-4)電位恒為1,b點電位僅取決于trx狀態(tài)。trx = 1,b點為高電平,控制端控制電子開關(guān)閉合,允許t1(或t0)

9、對脈沖計數(shù)。trx = 0,b點為低電平,電子開關(guān)斷開,禁止t1(或t0)計數(shù)。(2) gate = 1,b點電位由 (x = 0,1)的輸入電平和trx的狀態(tài)這兩個條件來確定。當(dāng)trx = 1,且 =1時,b點才為1,控制端控制電子開關(guān)閉合,允許t1(或t0)計數(shù)。故這種情況下計數(shù)器是否計數(shù)是由trx和intx* 兩個條件兩個條件來共同控制的。intxxint166.2.2 方式方式1當(dāng)m1、m0=01時,定時器/計數(shù)器工作于方式方式1,這時定時器/計數(shù)器的等效電路邏輯結(jié)構(gòu)如圖圖6-5所示。方式方式1和方式和方式0的差別的差別僅僅在于計數(shù)器的位數(shù)計數(shù)器的位數(shù)不同,方式1為16位計數(shù)器位計數(shù)器

10、,由thx高8位和tlx低8位構(gòu)成(x= 0,1),方式0則為13位計數(shù)器,有關(guān)控制狀態(tài)位的含義(gate、c/ 、tfx、trx)與方式0相同。t17 17圖圖6-5 定時器/計數(shù)器方式1邏輯結(jié)構(gòu)框圖186.2.3 方式方式2方式0和方式1的最大特點是計數(shù)溢出后,計數(shù)器為全0。因此在循環(huán)定時或循環(huán)計數(shù)應(yīng)用時就存在用指令反復(fù)裝入計存在用指令反復(fù)裝入計數(shù)初值的數(shù)初值的問題問題。這不僅影響定時精度,也給程序設(shè)計帶來麻煩。方式2就是針對此問題而設(shè)置的。當(dāng)m1、m0為10時,定時器/計數(shù)器處于工作方式2,這時定時器/計數(shù)器的等效邏輯結(jié)構(gòu)如圖圖6-6所示所示(以定時器t1為例,x= 1)。19定時器/計

11、數(shù)器的方式方式2為自動恢復(fù)初值為自動恢復(fù)初值(初值自動裝入)的8位位定時器定時器/計數(shù)器計數(shù)器。tlx(x = 0,1)作為常數(shù)緩沖器,當(dāng)tlx計數(shù)溢出時,在溢出標(biāo)志tfx置“1”的同時,還自動將自動將thx中的初值送至中的初值送至tlx,使tlx從初值開始重新計數(shù)。定時器/計數(shù)器的方式2工作過程如圖6-7所示。2020圖6-6 定時器/計數(shù)器方式2邏輯結(jié)構(gòu)框圖21 圖圖6-7 方式2工作過程該方式可省去用戶軟件中重裝初值的指令執(zhí)行時間,簡化定時初值的計算方法,可以相當(dāng)精確地確定相當(dāng)精確地確定定時時間定時時間。21226.2.4 方式方式3是為增加一個增加一個8位定時器位定時器/計數(shù)器計數(shù)器而

12、設(shè),使at89s51單片機具有3個個定時器/計數(shù)器。方式方式3只適用于只適用于t0,t1不能工作在方式不能工作在方式3。t1處于方式3時相當(dāng)于tr1= 0,停止計數(shù)(此時t1可用來作為串行口波特率產(chǎn)生器)。1工作方式工作方式3下的下的t0tmod的低的低2位為位為11時,t0的工作方式被選為方式3,各引腳與t0的邏輯關(guān)系如圖圖6-8所示所示。定時器/計數(shù)器t0分為兩個獨立的分為兩個獨立的8位計數(shù)器位計數(shù)器tl0和和th0,tl0使用t0的狀態(tài)控制位c/ 、gate、tr0、22t23tf0 ,而th0被固定為一個固定為一個8位定時器位定時器(不能作為外部計數(shù)模式),并使用定時器t1的狀態(tài)控制位

13、tr1和tf1,同時占用定時器t1的中斷請求源tf1。2t0工作在方式工作在方式3時時t1的各種工作方式的各種工作方式一般情況下,當(dāng)當(dāng)t1用作串行口的波特率發(fā)生器時,用作串行口的波特率發(fā)生器時,t0才工才工作在方式作在方式3。t0處于工作方式3時,t1可定為方式0、方式1和方式2,用來作為串行口的波特率發(fā)生器,或不需要中斷的場合。24 24圖圖6-8 定時器/計數(shù)器t0方式3的邏輯結(jié)構(gòu)框圖25(1 1)t1t1工作在方式工作在方式0 0t1的控制字中m1、m0 = 00時,t1工作在方式0,工作示意圖如圖圖6-9所示所示。 25圖6-9 t0工作在方式3時t1為方式0的工作示意圖26(2)t1

14、工作在方式工作在方式1當(dāng)t1的控制字中m1、m0 = 01時,t1工作在方式1,工作示意圖如圖6-10所示。 26圖圖6-10 t0工作在方式3時t1為方式1的工作示意圖27(3)t1工作在方式工作在方式2當(dāng)t1的控制字中m1、m0 = 10時,t1的工作方式為方式2,工作示意圖如圖6-11所示。 27圖圖6-11 t0工作在方式3時t1為方式2的工作示意圖28(4)t1設(shè)置在方式設(shè)置在方式3當(dāng)t0設(shè)置在方式3,再把t1也設(shè)成方式3,此時t1停止計數(shù)停止計數(shù)。6.3 對外部輸入的計數(shù)信號的要求對外部輸入的計數(shù)信號的要求當(dāng)定時器/計數(shù)器工作在計數(shù)器模式時,計數(shù)脈沖來自外部輸入引腳t0或t1。當(dāng)輸

15、入信號產(chǎn)生負跳變時,計數(shù)器的值增1。每個機器周期每個機器周期的s5p2期間,都對外部輸入引腳對外部輸入引腳t0或或t1進行采樣。如在第一個機器周期中采得的值為1,而在下一個機器周期中采得的值為0,則在緊跟著的再下一個機器周期s3p129期間,計數(shù)器加1。由于確認一次確認一次負跳變負跳變要花要花2個個機器周期機器周期,因此外部輸入的計數(shù)脈沖的外部輸入的計數(shù)脈沖的最高頻率最高頻率為系統(tǒng)振蕩器頻率的為系統(tǒng)振蕩器頻率的1/24。 例如,選用6mhz頻率的晶體,允許輸入的脈沖頻率最高為250khz。如果選用12mhz頻率的晶體,則可輸入最高頻率為500khz的外部脈沖。對于外部輸入信號的占空比占空比并沒

16、有什么限制并沒有什么限制,但為了確保某一給定電平在變化之前能被采樣一次,則這一電平至少要至少要保持一個機器周期保持一個機器周期。30故對外部輸入信號的要求如圖圖6-12所示,圖中,tcy為機器周期。30圖6-12 對外部計數(shù)輸入信號的要求316.4 6.4 定時器定時器/ /計數(shù)器的編程和應(yīng)用計數(shù)器的編程和應(yīng)用4 4種方式,方式種方式,方式0 0與方式與方式1 1基本相同,只是計數(shù)位數(shù)不同。方基本相同,只是計數(shù)位數(shù)不同。方式式0 0初值計算復(fù)雜,初值計算復(fù)雜,一般不用方式一般不用方式0 0,而,而用方式用方式1 1。6.4.1 6.4.1 方式方式1 1的應(yīng)用的應(yīng)用【例【例6-16-1】假設(shè)系

17、統(tǒng)時鐘頻率采用假設(shè)系統(tǒng)時鐘頻率采用6mhz6mhz,在在p1.0p1.0引腳上輸出引腳上輸出一個一個周期為周期為2ms2ms的的方波方波,如,如圖圖6-136-13所示。所示。31圖圖6-13 p1.0引腳上輸出周期為引腳上輸出周期為2ms的方波的方波32基本思想基本思想:方波周期:方波周期t0t0確定,確定,t0t0每隔每隔1ms1ms計數(shù)溢出計數(shù)溢出1 1次,次,即即t0t0每隔每隔1ms1ms產(chǎn)生一次中斷,產(chǎn)生一次中斷,cpucpu響應(yīng)中斷后,在中斷服務(wù)響應(yīng)中斷后,在中斷服務(wù)子程序中對子程序中對p1.0p1.0取反取反, ,如如圖圖6-136-13所示。為此要做如下幾步所示。為此要做如下

18、幾步工作。工作。 (1 1)計算計數(shù)初值)計算計數(shù)初值x x機器周期機器周期 = 2 = 2 s = 2s = 2 10 106 6s s設(shè)需要設(shè)需要裝入裝入t0t0的的初值為初值為x x,則有,則有(2(21616x x) ) 2 2 10106 6=1=1 10 103 3,2 21616x x=500=500,x x=65036=65036。x x化為十六進制數(shù),即:化為十六進制數(shù),即: 65036 = fe0ch 65036 = fe0ch 。t0t0的的初值初值為為th0 =fehth0 =feh,tl0 = 0chtl0 = 0ch。3233(2)初始化程序設(shè)計)初始化程序設(shè)計采用

19、定時器中斷方式中斷方式工作。包括定時器初始化和中斷系統(tǒng)初始化,主要是對寄存器寄存器ip、ie、tcon、tmod的相應(yīng)位進行正確的設(shè)置,并將計數(shù)初值送入定時器中。(3)程序設(shè)計)程序設(shè)計中斷服務(wù)子程序除了完成所要求的產(chǎn)生方波產(chǎn)生方波的工作之外,還要注意將計數(shù)初值重新裝入定時器初值重新裝入定時器,為下一次產(chǎn)生中斷做準(zhǔn)備。本例,主程序主程序用一條轉(zhuǎn)至自身的短跳轉(zhuǎn)指令來代替。3334參考程序如下:參考程序如下: org0000h;程序入口reset:ajmp main ;轉(zhuǎn)主程序 org 000bh ;t0中斷入口 ajmp it0p;轉(zhuǎn)t0中斷處理程序it0p org 0100h;主程序入口mai

20、n: mov sp,#60h;設(shè)堆棧指針 mov tmod,#01h;設(shè)置t0為方式1定時 acall pt0m0;調(diào)用初始化子程序pt0m0here: ajmp here ;原地循環(huán),等待中斷3435pt0m0: mov tl0,#0ch;t0初始化,裝初值的低8位 mov th0,#0feh;裝初值的高8位 setb et0;允許t0中斷 setb ea ;總中斷允許 setb tr0;啟動t0 retit0p: mov tl0,#0ch;中斷子程序,t0重裝初值 mov th0,#0feh cpl p1.0 ;p1.0的狀態(tài)取反 reti程序說明:程序說明:當(dāng)單片機復(fù)位時,從程序入口00

21、00h跳向主程序main處執(zhí)行。其中調(diào)用了t0初始化子程序pt0m0。3536子程序返回后,程序執(zhí)行程序執(zhí)行“ajmp here”指令,則循指令,則循環(huán)等待。環(huán)等待。當(dāng)響應(yīng)響應(yīng)t0定時中斷定時中斷時,則跳向t0中斷入口,再從t0中斷入口跳向it0p標(biāo)號處執(zhí)行t0中斷服務(wù)子程序。當(dāng)執(zhí)行完中斷返回的指令執(zhí)行完中斷返回的指令“reti”后,又返回斷點處繼續(xù)執(zhí)行循環(huán)指令“ajmp here”。在實際的程序中,“ajmp here” 實際上是一段主程序。當(dāng)下一次定時器t0的1ms定時中斷發(fā)生時,再跳向t0中斷入口,從而重復(fù)執(zhí)行上述過程。如cpu不做其他工作,也可用查詢方式也可用查詢方式進行控制,程序要簡

22、單得多。3637查詢方式參考程序:查詢方式參考程序: movtmod,#01h;設(shè)置t0為方式1loop: movth0,#0feh ;t0置初值 movtl0,# 0ch setbtr0 ;接通t0loop1:jnb tf0,loop1 ;查tf0,tf0 =0, t0未溢出; ;tf0 =1, t0溢出, clrtr0 ;t0溢出, 關(guān)斷t0 cplp1.0 ;p1.0的狀態(tài)求反 sjmploop查詢程序雖簡單程序雖簡單,但cpu必須要不斷查詢tf0標(biāo)志,工作效率低效率低。3738【例【例6-2】系統(tǒng)時鐘為6mhz,編寫定時器t0產(chǎn)生1s定時的程序?;舅枷耄夯舅枷耄翰捎枚〞r器模式。因定

23、時時間較長,首先確定采用哪一種工作方式采用哪一種工作方式。時鐘為6mhz的條件下,定時器各種工作方式最長可定時時間:方式方式0最長可定時16.384ms;方式方式1最長可定時131.072ms;方式方式2最長可定時512 s。由上可見,可選選方式方式1,每隔,每隔100ms中斷一次中斷一次,中斷中斷10次次為1s。3839(1)計算計數(shù)初值)計算計數(shù)初值x因為(216 x) 2 106 = 101,所以x = 15536 = 3cb0h。因此th0 = 3ch,tl0 = b0h。(2)10次計數(shù)的實現(xiàn)次計數(shù)的實現(xiàn)對于中斷10次的計數(shù),采用b寄存器寄存器作為中斷次數(shù)計數(shù)器中斷次數(shù)計數(shù)器。(3)

24、程序設(shè)計)程序設(shè)計參考程序如下: org0000h;程序運行入口reset:ljmp main ;跳向主程序入口main org000bh ;t0的中斷入口 ljmpit0p;轉(zhuǎn)t0中斷處理子程序it0p org1000h;主程序入口3940main:movsp,#60h;設(shè)堆棧指針 movb,#0ah;設(shè)循環(huán)次數(shù)10次 movtmod,#01h;設(shè)置t0工作在方式1定時 mov tl0,#0b0h;給t0設(shè)初值 mov th0,#3ch setbet0;允許t0中斷 setbea ;總中斷允許 setbtr0;啟動t0here: sjmphere;原地循環(huán),等待中斷4041it0p: mov

25、tl0,#0b0h ;t0中斷子程序,t0重裝初值 movth0,#3ch djnzb,rturn;b中斷次數(shù)計數(shù),減1非0則;中斷返回 clrtr0 ;1s定時時間到,停止t0工作setbf0;1s定時時間到標(biāo)志f0置1rturn:reti程序說明:程序說明:不論1s定時時間是否已到,都返回到“sjmp here”指令處。“sjmp here”指令實際是一段主程序。在這段主程序中再通過對再通過對f0標(biāo)志標(biāo)志的的判定判定,可知1s定時是否到,再進行具體處理。41426.4.2 方式方式2的應(yīng)用的應(yīng)用方式2是一個可以自動重新裝載初值自動重新裝載初值的8位計數(shù)器/定時器??墒∪ナ∪ブ匮b初值指令。當(dāng)

26、某個定時器/計數(shù)器不使用時,可擴展一個擴展一個負跳沿觸負跳沿觸發(fā)發(fā)的的外中斷源外中斷源。【例【例6-36-3】擴展一個負跳沿觸發(fā)的外部中斷源負跳沿觸發(fā)的外部中斷源,把定時器/計數(shù)器t0腳腳作為外部中斷請求輸入端外部中斷請求輸入端,溢出標(biāo)志tf0作為外中斷請求標(biāo)志?;舅枷耄夯舅枷耄涸O(shè)為方式2(自動裝入常數(shù)方式)計數(shù)模式,th0、tl0初值初值均為0ffh。當(dāng)t0腳發(fā)生負跳變時,t0計數(shù)溢出,tf0置“1”,單片機發(fā)出中斷請求。4243初始化程序: org0000h ajmpiini;跳到初始化程序 org000bh ajmpit0p;跳到外中斷處理程序iini:mov tmod,#06h;設(shè)

27、置t0為方式2 mov tl0,#0ffh;設(shè)t0初值 mov th0,#0ffh setb et0;允許t0中斷 setb ea;總中斷允許 setbtr0;啟動t0 it0p: 外中斷處理程序段外中斷處理程序段 4344程序說明:程序說明:當(dāng)連接在p3.4(t0腳)的外部中斷請求輸入腳電平發(fā)生負跳變時,tl0加1,產(chǎn)生溢出,tf0置“1”,向單片機發(fā)出中斷請求,同時th0的內(nèi)容的內(nèi)容0ffh送tl0,即tl0恢復(fù)初值0ffh。p3.4腳相當(dāng)于一個腳相當(dāng)于一個負跳沿負跳沿觸發(fā)的觸發(fā)的外中斷請求源外中斷請求源輸入輸入。對p3.5也可做類似的處理?!纠纠?-4】 當(dāng)t0(p3.4)引腳上發(fā)生負

28、跳變時,作為p1.0引腳產(chǎn)生方波的啟動信號。開始從p1.0腳腳上輸出一個周期為周期為1ms的方波方波,如圖圖6-14所示所示(系統(tǒng)時鐘6mhz)。4445基本思想:基本思想:t0設(shè)為方式方式1計數(shù)計數(shù),初值初值為ffffh。當(dāng)外部計數(shù)輸入端t0(p3.4)發(fā)生一次負跳變發(fā)生一次負跳變時,t0加1且溢出溢出,溢出標(biāo)志tf0置“1”,向cpu發(fā)出中斷請求,此時t0相當(dāng)于一個負跳沿觸發(fā)的外部中斷源。進入t0中斷程序后,f0標(biāo)志置“1”,說明t0引腳上已接收過負跳變信號。t1定義為方式方式2定時定時。在t0引腳產(chǎn)生一次負跳變后,啟動t1每每500 s產(chǎn)生一次中斷產(chǎn)生一次中斷,在中斷服中斷服務(wù)子程序務(wù)子

29、程序中對p1.0求反求反,使p1.0產(chǎn)生周期周期1ms的方波。由于省去重新裝初值指令,所以可產(chǎn)生精確精確的定時時間。4546 46圖圖6-14 6-14 負跳變觸發(fā)輸出一個周期為負跳變觸發(fā)輸出一個周期為1ms1ms的方波的方波47(1)計算)計算t1的初值的初值設(shè)t1的初值為x,則(28 x) 2 106 = 5 104x = 28 250 = 6 = 06h(2)程序設(shè)計)程序設(shè)計參考程序參考程序: org 0000h;程序入口reset:ljmp main ;跳向主程序main org 000bh ;t0的中斷入口 ljmp it0p ;轉(zhuǎn)t0中斷服務(wù)程序 org 001bh;t1的中斷入

30、口 4748ljmp it1p ;轉(zhuǎn)t1中斷服務(wù)程序 org 0100h;主程序入口main: mov sp,#60h;設(shè)堆棧指針 acall pt0m2;調(diào)用對t0,t1初始化子程序loop: mov c,f0 ;t0是否是否產(chǎn)產(chǎn)生過中斷,若產(chǎn)生;過,f0置1 jnc loop;t0未產(chǎn)生中斷,c=0,則跳;到loop,等待t0中斷 setb et1 ;允許t1產(chǎn)生定時中斷setb tr1 ;啟動t1here: ajmp here4849pt0m2: mov tmod,#26h ;對t0,t1初始化,t0方式1;計數(shù),t1方式2定時 mov tl0,#0ffh ;t0置初值 mov th0,

31、#0ffh setb et0;允許t0中斷 mov tl1,#06h;t1置初值 mov th1,#06h clr f0;把t0已發(fā)生中斷標(biāo)志f0清0 setb ea;總中斷允許 setb tr0;啟動t0 ret4950it0p: clrtr0 ;t0中斷服務(wù)程序中斷服務(wù)程序,停止t0計數(shù) setbf0 ;把t0引腳接收過負脈沖標(biāo)志f0置1,;即接收過負跳變 retiit1p: cpl p1.0;t1中斷服務(wù)程序中斷服務(wù)程序,p1.0位取反 reti程序說明:程序說明:當(dāng)單片機復(fù)位時,從0000h跳向主程序main處執(zhí)行程序。其中調(diào)用了對t0,t1初始化子程序pt0m2。子程序返回后執(zhí)行標(biāo)號

32、loop處指令,循環(huán)等待t0引腳上負脈沖的到來。由于負脈沖到來的標(biāo)志位f0的復(fù)位初始值為0,所以程序就在標(biāo)號loop處循環(huán)等待。5051當(dāng)t0(p3.4)腳)腳發(fā)生負跳變發(fā)生負跳變時,由于t0計數(shù)溢出,則跳向t0中斷服務(wù)子程序。此時停止t0計數(shù),并把t0引腳接收過負脈沖的標(biāo)志f0置1。當(dāng)中斷返回中斷返回時,由于f0已被置已被置1,則程序跳出loop處的循環(huán)等待。此時執(zhí)行指令來允許t1中斷,并啟動t1定時,然后執(zhí)行“ajmp here”指令,循環(huán)等待,等待等待t1的的500 s定時中斷定時中斷到來。當(dāng)t1的500s定時中斷產(chǎn)生時,則進入則進入t1的中斷服務(wù)子的中斷服務(wù)子程序程序it1p,把p1.

33、0腳電平取反。由于是自動裝初值,省去對t1重裝初值指令。中斷返回后,到“ajmp here” 處等待t1的500s定時中斷。如此重復(fù),即得到圖6-14波形。5152【例【例6-5】 利用定時器t1的方式方式2計數(shù)計數(shù),每計滿計滿100個個數(shù),將p1.0取反。本例是方式方式2計數(shù)模式計數(shù)模式的應(yīng)用舉例。(1)選擇工作方式)選擇工作方式外部信號由t1(p3.5)引腳輸入,每發(fā)生一次負跳變計數(shù)器便加1,每輸入100個脈沖,計數(shù)器將產(chǎn)生溢出中斷,在中斷服務(wù)程序中將p1.0取反一次。t1工作在方式方式2的控制字tmod = 60h。不使用t0時,tmod低4位任取,但不能使t0為方式3,這里取全0。(2

34、)計算)計算t1的初值的初值x = 28 100 = 156 = 9chtl1的初值為9ch,重裝初值寄存器th1 = 9ch。5253(3)參考程序:)參考程序: org0000h;程序運行入口 ljmp main;跳向主程序main org001bh;t1中斷服務(wù)程序入口 cplp1.0;p1.0位取反 reti org0100h;主程序入口main: mov tmod,#60h;設(shè)置t1為方式2計數(shù) movtl0,#9ch ;t0置初值 movth0,#9ch setbtr1 ;啟動t1here: ajmphereend 5354程序說明:程序說明:由于t1的中斷服務(wù)子程序只有兩條指令,

35、不超過8個字節(jié),所以進入t1中斷服務(wù)程序入口后,沒有選擇再跳轉(zhuǎn)。6.4.3 方式方式3的應(yīng)用的應(yīng)用方式方式3下的下的t0和和t1大不相同大不相同。t0工作在方式3,tl0和th0被分成兩個獨立的8位定時器/計數(shù)器。其中,tl0可作為8位的定時器/計數(shù)器,而th0只能作為8位的定時器。此時t1只能工作在方式0、1或2。一般情況下,當(dāng)t1用作串行口波特率發(fā)生器串行口波特率發(fā)生器時,t0才設(shè)置為方式方式3。此時,常把定時器t1設(shè)置為方式方式2,用作波特率發(fā)生器。5455【例【例6-6】假設(shè)某at89s51單片機應(yīng)用系統(tǒng)的兩個外部中斷源已被占用,設(shè)置t1工作在方式工作在方式2,用作波特率發(fā)生,用作波特

36、率發(fā)生器器?,F(xiàn)要求增加一個要求增加一個外部中斷源外部中斷源,并控制控制p1.0引腳輸出一引腳輸出一個個5khz(周期為(周期為200 s)的)的方波方波。設(shè)時鐘為12mhz?;舅枷耄夯舅枷耄涸O(shè)置tl0工作在方式3計數(shù)模式,tl0的初值設(shè)為0ffh,當(dāng)檢測到檢測到t0腳信號出現(xiàn)腳信號出現(xiàn)負跳變負跳變時,tl0溢出,同時向cpu申請中斷,這里t0腳作為一個負跳沿觸發(fā)的腳作為一個負跳沿觸發(fā)的外部中斷請求輸入端外部中斷請求輸入端。在中斷處理子程序中,啟動th0,th0事先被設(shè)置為方式方式3的的100 s定時定時,從而控制控制p1.0輸輸出周期為出周期為200 s的方波信號的方波信號,如圖圖6-15

37、所示所示。555656圖圖6-15 6-15 定時器定時器p1.0p1.0輸出的方波信號輸出的方波信號57(1)初值)初值x計算計算tl0的初值設(shè)為0ffh。5khz方波方波的周期為周期為200 s,因此th0的定時時間為100 s。 初值x計算:(28 x) 1 106 = 1 104 x = 28 100 = 156 = 9ch(2)程序設(shè)計)程序設(shè)計org0000h ljmpmain org 000bh ;tl0中斷入口,tl0使用t0的中斷 ljmp tl0int ;跳向tl0中斷服務(wù)程序, tl0占用t0中斷 5758org 001bh;th0中斷入口,t1為方式3時,th0;使用了

38、t1的中斷l(xiāng)jmp th0int ;跳向th0中斷服務(wù)程序org 0100h;主程序入口main: movtmod,#27h ;t0方式3,t1方式2定時作串;行口波特率發(fā)生器 movtl0,#0ffh ;置tl0初值 movth0,#9ch;置th0初值 movtl1,#datal ;tl1裝入串口波特率常數(shù)mov th1,#datah;th1裝入串口波特率常數(shù) mov tcon,#15h;允許t0中斷 5859movie,#9fh;設(shè)置中斷允許,總中斷允許,;th0、tl0中斷允許here: ajmp here;循環(huán)等待tl0int: mov tl0,#0ffh;tl0中斷服務(wù)處理子程序,

39、tl0;重新裝入初值 setb tr1;開始啟動th0定時 retith0int:mov th0,#9ch;th0中斷服務(wù)程序,th0重新;裝入初值 cplp1.0;p1.0位取反輸出 reti 59606.4.4 門控制位門控制位gatex的應(yīng)用的應(yīng)用測量脈沖寬度測量脈沖寬度介紹門控制位gate的具體應(yīng)用,測量 (p3.3)引腳上正脈沖的寬度。【例【例6-7】 門控位gate1可使t1的啟動計數(shù)受 的控制,當(dāng)gate1 = 1,tr1=1時,時,只有只有 int1*引腳輸入高引腳輸入高電平時電平時,t1才被允許計數(shù)才被允許計數(shù)??蓽y量 引腳 (p3.3)上正脈沖的寬度。其方法如圖圖6-16所

40、示所示。60int1int1int1圖圖6-16 利用利用gate位測量正脈沖的寬度位測量正脈沖的寬度61參考程序: org0000hreset: ajmp main ;復(fù)位入口轉(zhuǎn)主程序 org 0100h;主程序入口main: mov sp,#60h movtmod,#90h;向tmod寫控制字,t1為方;式1定時,gate1 = 1 mov tl1,#00h mov th1,#00hloop0: jb p3.3,loop0;等待 低 setb tr1;如 為低,啟動t161int1int162loop1:jnb p3.3,loop1;等待 升高loop2:jb p3.3,loop2 ; 為高, 此時計數(shù)器計數(shù), ;等待 降低 clr tr1 ;停止t1計數(shù) mov a,tl1 ;t1計數(shù)值送a ;將t1計數(shù)值送顯示器 end執(zhí)行以上程序,使 引腳上出現(xiàn)的正脈沖寬度正脈沖寬度以機機器周期數(shù)器周期數(shù)的形式顯示在顯示器上。62將a中的t1計數(shù)值送到顯示器顯示int1int1int1int1636.4.5 實時時鐘的設(shè)計實時時鐘的設(shè)計介紹使用定時器/計數(shù)器實現(xiàn)時鐘。1實現(xiàn)實時時鐘的基本思想實現(xiàn)實時時鐘的基本思想最小計時單位是秒秒,如何獲得1s的定時時間的定時時間呢?從前面介紹

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論