第7章 定時器、計數(shù)器_第1頁
第7章 定時器、計數(shù)器_第2頁
第7章 定時器、計數(shù)器_第3頁
第7章 定時器、計數(shù)器_第4頁
第7章 定時器、計數(shù)器_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第7章 定時器/計數(shù)器MCS-51單片機內部有兩個16位可編程的定時器/計數(shù)器,即定時器T0和定時器T1(8052提供3個,這第三個稱定時器T2)。它們既可用作定時器方式,又可用作計數(shù)器方式。7 . 1定時器/計數(shù)器結構定時器/計數(shù)器的基本部件是兩個8位的計數(shù)器(其中TH1,TL1是T1的計數(shù)器,TH0,TL0是T0的計數(shù)器)拼裝而成。在作定時器使用時,輸入的時鐘脈沖是由晶體振蕩器的輸出經12分頻后得到的,所以定時器也可看作是對計算機機器周期的計數(shù)器(因為每個機器周期包含12個振蕩周期,故每一個機器周期定時器加1,可以把輸入的時鐘脈沖看成機器周期信號)。故其頻率為晶振頻率的1/12。如果晶振頻

2、率為12MHZ,則定時器每接收一個輸入脈沖的時間為1us。當它用作對外部事件計數(shù)時,接相應的外部輸入引腳T0(P3.4)或T1(P3.5)。在這種情況下,當檢測到輸入引腳上的電平由高跳變到低時,計數(shù)器就加1(它在每個機器周期的S5P2時采樣外部輸入,當采樣值在這個機器周期為高,在下一個機器周期為低時,則計數(shù)器加1)。加1操作發(fā)生在檢測到這種跳變后的一個機器周期中的S3P1,因此需要兩個機器周期來識別一個從“1”到“0”的跳變,故最高計數(shù)頻率為晶振頻率的1/24。這就要求輸入信號的電平要在跳變后至少應在一個機器周期內保持不變,以保證在給定的電平再次變化前至少被采樣一次。定時器/計數(shù)器有四種工作方

3、式,其工作方式的選擇及控制都由兩個特殊功能寄存器(TMOD和TCON)的內容來決定。用指令改變TMOD或TCON的內容后,則在下一條指令的第一個機器周期的S1P1時起作用。1、 定時器的方式寄存器TMOD D7 D6 D5 D4 D3 D2 D1 D0GATEC/M1M0GATEC/M1M0 T1方式控制字 T1方式控制字 圖7-1 TMOD寄存器各位定義特殊功能寄存器TMOD為定時器的方式控制寄存器,寄存器中每位的定義如圖7-1所示。高4位用于定時器1,低4位用于定時器0。其中M1,M0用來確定所選的工作方式,如表7-1所示。 M1 M0 定時器/計數(shù)器四種工作方式選擇,見表7-1所示。 表

4、7-1 工作方式選擇表M1 M0方 式說 明0 0013位定時器/計數(shù)器0 1116位定時器/計數(shù)器1 02自動裝入時間常數(shù)的8位定時器/計數(shù)器1 13對T0分為兩個8位獨立計數(shù)器;對T1置方式3時停止工作(無中斷重裝8位計數(shù)器) C/ 定時器方式或計數(shù)器方式選擇位。C/=1時,為計數(shù)器方式;C/=0時,為定時器方式。 GATE 定時器/計數(shù)器運行控制位,用來確定對應的外部中斷請求引腳(,)是否參與T0或T1的操作控制。當GATE=0時,只要定時器控制寄存器TCON中的TR0(或TR1)被置1時,T0(或T1)被允許開始計數(shù)(TCON各位含義見后面敘述);當GATE=1時,不僅要TCON中的T

5、R0或TR1置位,還需要P3口的或引腳為高電平,才允許計數(shù)。2、 定時器控制寄存器TCON特殊功能寄存器TCON用于控制定時器的操作及對定時器中斷的控制。其各位定義如圖7-2所示。其中D0D3位與外部中斷有關,已在中斷系統(tǒng)一節(jié)中介紹。 D7 D6 D5 D4 D3 D2 D1 D0TF1TR1TF0TR0IE1IT1IE0IT0 用于外部中斷 圖7-2 TCON寄存器各位定義 TR0 T0的運行控制位。該位置1或清0用來實現(xiàn)啟動計數(shù)或停止計數(shù)。 TF0 T0的溢出中斷標志位。當T0計數(shù)溢出時由硬件自動置1;在CPU中斷處理時由硬件清為0。 TR1 T1的運行控制位,功能同TR0。 TF1 T1

6、的溢出中斷標志位,功能同TF0。 TMOD和TCON寄存器在復位時其每一位均清零。7 . 2 工作方式 如前所述,MCS-51片內的定時器/計數(shù)器可以通過對特殊功能寄存器TMOD中的控制位C/的設置來選擇定時器方式或計數(shù)器方式;通過對M1M0兩位的設置來選擇四種工作方式,現(xiàn)以T0為例加以說明。1、 方式0 當M1M0設置為00時,定時器選定為方式0工作。在這種方式下,16位寄存器只用了13位,TL0的高三位未用。由TH0的8位和TL0的低5位組成一個13位計數(shù)器。 當GATE=0時,只要TCON中的TR0為1,TL0及TH0組成的13位計數(shù)器就開始計數(shù);當GATE=1時,此時僅TR0=1仍不能

7、使計數(shù)器計數(shù),還需要引腳為1才能使計數(shù)器工作。由此可知,當GATE=1和TR0=1時,TH0+TL0是否計數(shù)取決于引腳的信號,當由0變1時,開始計數(shù);當由1變0時,停止計數(shù),這樣就可以用來測量在端出現(xiàn)的脈沖寬度。 當13位計數(shù)器從0或設定的初值,加1到全“1”以后,再加1就產生溢出。這時,置TCON的TF0位為1,同時把計數(shù)器變?yōu)槿?”。2、 方式1 方式1和方式0的工作相同,唯一的差別是TH0和TL0組成一個16位計數(shù)器。3、 方式2 方式2把TL0配置成一個可以自動恢復初值(初始常數(shù)自動重新裝入)的8位計數(shù)器,TH0作為常數(shù)緩沖器, TH0由軟件預置值。當TL0產生溢出時,一方面使溢出標

8、志TF0置1,同時把TH0中的8位數(shù)據(jù)重新裝入TL0中。 方式2常用于定時控制。例如希望每隔250s產生一個定時控制脈沖,則可以采用12MHz的振蕩器,把TH0預置為6,并使C/=0就能實現(xiàn)。方式2不用作串行口波特率發(fā)生器。4、 方式3 方式3對定時器T0和定時器T1是不相同的。若T1設置為方式3,則停止工作(其效果與TR1=0相同)。所以方式3只適用于T0。 方式3使MCS-51具有三個定時器/計數(shù)器(增加了一個附加的8位定時器/計數(shù)器)。當T0設置為方式3時,將使TL0和TH0成為兩個相互獨立的8位計數(shù)器, TL0利用了T0本身的一些控制(C/,GATE,TR0,和TF0)方式,它的操作與

9、方式0和方式1類似。而TH0被規(guī)定為用作定時器功能,對機器周期計數(shù),并借用了T1的控制位TR1和TF1。在這種情況下TH0控制了T1的中斷。這時T1還可以設置為方式02,用于任何不需要中斷控制的場合,或用作串行口的波特率發(fā)生器。通常,當T1用作串行口波特率發(fā)生器時,T0才定義為方式3,以增加一個8位計數(shù)器。7 . 3 定時器/計數(shù)器的初始化 1、初始化步驟MCS-51內部定時器/計數(shù)器是可編程序的,其工作方式和工作過程均可由MCS-51通過程序對它進行設定和控制。因此,MCS-51在定時器/計數(shù)器工作前必須先對它進行初始化。初始化步驟為:(1) 根據(jù)題目要求先給定時器方式寄存器TMOD送一個方

10、式控制字,以設定定時器/計數(shù)器的相應工作方式。(2) 根據(jù)實際需要給定時器/計數(shù)器選送定時器初值或計數(shù)器初值,以確實需要定時的時間和需要記數(shù)的初值。(3) 根據(jù)需要給中斷允許寄存器IE選送中斷控制字和給中斷優(yōu)先級寄存器IP選送中斷優(yōu)先級字,以開放相應中斷和設定中斷優(yōu)先級。(4) 給定時器控制寄存器TCON送命令字,以啟動或禁止定時器/計數(shù)器的運行。2、計數(shù)器初值的計算定時器/計數(shù)器可用軟件隨時隨地起動和關閉,起動時它就自動加“1”記數(shù),一直記到滿,即全為“1”,若不停止,計數(shù)值從全“1”變?yōu)槿?”,同時將計數(shù)溢出位置“1”并向CPU發(fā)出定時器溢出中斷申請。對于各種不同的工作方式最大的定時時間

11、和計數(shù)數(shù)不同。這里在使用中就會出現(xiàn)兩個問題:一是要產生比定時器最大的定時時間還要小的時間和計數(shù)器最大計數(shù)次數(shù)還要小的計數(shù)次數(shù)怎么辦?二是要產生比定時器最大的定時時間還要大的時間和計數(shù)器最大計數(shù)次數(shù)還要大的計數(shù)次數(shù)怎么辦?解決以上第一個問題只要給定時器/計數(shù)器一個非零初值,開定時器/計數(shù)器時,定時器/計數(shù)器不從0開始,而是從初值開始,這樣就可得到比定時器/計數(shù)器最大的定時時間和計數(shù)次數(shù)還要小的時間和計數(shù)次數(shù),解決第二個問題就要用到循環(huán)程序了,循環(huán)幾次就相當于乘幾。例如要產生1秒的定時你可先用定時器產生50MS的定時,再循環(huán)20次就行了,因為1S=1000MS,也可用其它的組合。有時也可采用中斷來

12、實現(xiàn)。由上可見,解決問題的基本出路在于初值的計算,下面就來具體討論計數(shù)器的初值計算和最大值的計算。我們把計數(shù)器從初值開始作加1計數(shù)到計滿為全1所需要的計數(shù)值設定為C和計數(shù)初值設定為D,由此便可得到如下的計算通式: D=M-C (1)式中,M為計數(shù)器模值,該值和計數(shù)器工作方式有關。在方式0時M為213;在方式1時M為216;在方式2和方式3時M為28。3、定時器初值的計算在定時器模式下,計數(shù)器由單片機脈沖經12分頻后計數(shù)。因此,定時器定時時間T的計算公式為:T=(TMTC)12/fOSC (s) (2)式中TM為計數(shù)器從初值開始作加1計數(shù)到計滿為全1所需要的時間,TM為模值,和定時器的工作方式有

13、關;fOSC是單片機晶體振蕩器的頻率,TC為定時器的定時初值。在式(2)中,若設TC=0,則定時器定時時間為最大(初值為0,計數(shù)從全0到全1,溢出后又為全0)。由于M的值和定時器工作方式有關,因此不同工作方式下定時器的最大定時時間也不一樣。例如:若設單片機主脈沖晶體振蕩器頻率fOSC為12MHz,則最大定時時間為:方式0時 TMmax=2131S=8.192ms方式1時 TMmax=216 1s=65.536ms方式2和3時 TMmax=28 1s=0.256ms 例1、設 方式0工作時,定時時間為1ms,時鐘振蕩頻率為6MHz,解: 將數(shù)據(jù)代入公式(2)得: (213TC)12/6 S =1

14、ms=1000S TC=213-500=7692化成二進制數(shù)為TC=1111 0 0000 01100根據(jù)13位定時器/計數(shù)器特性,高8位F0H送至TH0低5位0CH送TL0,一般的高三位置“”,可用下列指令實現(xiàn)。MOV TL0,#0CH; 5位送TL0寄存器MOV TH0,#0F0H; 位送T0寄存器 例2若單片機時鐘頻率fOSC為12MHz,請計算定時2ms所需的定時器初值。 解:由于定時器工作在方式2和方式3下時的最大定時時間只有0.256ms,因此要想獲得2ms的定時時間定時器必須工作在方式0或方式1。 若采用方式0,則根據(jù)式(2)可得定時器初值為: TC=213-2MS/1s=612

15、9 用計算機附件中的計算器可將6129轉換為十六進制數(shù)為1830H注意:這不是定時器工作在方式0時的初值,因定時器工作在方式0時是13位,高字節(jié)8位,低字節(jié)5位,所以還要進行適當?shù)淖儞Q,因為1830H 可寫成 0001 1000 0011 0000按13位重新組合成 10000 這組數(shù)就可拼成 1100 0001 0001 0000這樣就得到定時器工作在方式0時的初值C110H即:TH0應裝C1H;TL0應裝10H(高三位為0)。 若采取方式1,則有:TC=216-2MS/1s=63536=F830H 即:TH0應裝F8H;TL0應裝30H。例3、設T1作定時器,以方式1工作,定時時間為10M

16、S;T0作計數(shù)器,以方式2工作,外界發(fā)生一次事件即溢出。解:T1的時間常數(shù)為: (216-TC)2s=10ms TC=EC78H 初始化程序: MOV TMOD,#16H ;T1定時方式1,T0計數(shù)方式2,即置TMOD寄存器的內容為 MOV TL0,#0FFH ;T0時間常數(shù)送TL0 MOV TH0,#0FFH ;T0時間常數(shù)送TH0 MOV TL1,#78H ;T1時間常數(shù)(低8位)送TL1 MOV TH1,#0ECH ;T1時間常數(shù)(高8位)送TH1 SETB TR0 ;置TR0為1允許T0啟動計數(shù)SETB TR1 ;置TR1為1允許T1啟動計數(shù)例4 設定時器T0,以方式1工作,試編寫一個

17、延時1秒的子程序。解:若主頻頻率為6MHZ可求得T0的最大定時時間為: TMmax=216 2s=131.072ms我們就用定時器獲得100ms的定時時間再加10次循環(huán)得到1秒的延時,可算得100ms定時的定時初值:(216-TC)2s=100ms=sTC=216-50000=15536TC=3CB0H 程序如下:ORG 0000H MOV TMOD,#01H MOV R7,#10TIME: MOV TL0,#0B0H MOV TH0,#3CH SETB TR1LOOP1:JBC TF0,LOOP2 JMP LOOP1LOOP2:DJNZ R7,TIME RET END7 . 4應用舉例例1、

18、廣告燈的左移右移方法1: 延時時間使用TIMER0在MODE0下工作1、功能說明 開始時P1.0亮,延時0.2秒后左移至P1.1亮,如此左移7次后至P1.7亮,再延時0.2秒右移至P1.6亮,如此右移7次后至P1.0亮。 延時時間0.2秒,使用TIMER0在MODE0下工作(時鐘頻率fOSC為12MHz)。2、硬件:見第二章圖2-15或圖2-163、程序如下:ORG 00H ;起始地址MOV TMOD,#00H ;設定TIMER0工作在MODE0START: CLR C ;C=0MOV A,#0FFH ;ACC=FFH,左移初值MOV R2,#08 ;R2=08,設左移8次LOOP: RLC

19、A ;左移一位MOV P1,A ;輸出至P1MOV R3,#100 ;0.2秒ACALL DELAY ;2000微妙DJNZ R2,LOOP ;左移8次MOV R2,#07 ;R2=07,設右移7次LOOP1: RRC A ;右移一位MOV P1,A ;輸出至P1MOV R3,#100 ;0.2秒ACALL DELAY ;2000微妙DJNZ R2,LOOP1 ;右移7次JMP START DELAY: SETB TR0 ;啟動TIMER0開始計時AGAIN: MOV TL0,#10H ;設定TL0的值MOV TH0,#0C1H ;設定TH0的值LOOP1: JBC TF0,LOOP3 ;TF

20、0是否為1,是則跳至LOOP3,并清TF0JMP LOOP1 ;不是則跳到LOOP1LOOP3: DJNZ R3,AGAIN ;R3是否為0?不是則跳到AGAINCLR TR0 ;是則停止TIMR0計數(shù)RET END方法2:延時時間0.2秒,使用TIMER0在MODE1下工作。程序如下:ORG 00H ;起始地址MOV TMOD,#01H ;設定TIMER0工作在MODE1START: CLR C ;C=0MOV A,#0FFH ;ACC=FFH,左移初值MOV R2,#08 ;R2=08,設左移8次LOOP: RLC A ;左移一位MOV P1,A ;輸出至P1MOV R3,#20 ;0.2

21、秒ACALL DELAY ;10000微妙DJNZ R2,LOOP ;左移8次MOV R2,#07 ;R2=07,設右移7次LOOP1: RRC A ;右移一位MOV P1,A ;輸出至P1MOV R3,#20 ;0.2秒ACALL DELAY ;10000微妙DJNZ R2,LOOP1 ;右移7次JMP START DELAY: SETB TR0 ;啟動TIMER0開始計時AGAIN: MOV TL0,#0F0H ;設定TL0的值MOV TH0,#0D8H ;設定TH0的值LOOP1: JBC TF0,LOOP3 ;TF0是否為1,是則;跳至LOOP3,并清楚TF0JMP LOOP1 ;不是

22、則跳到LOOP1LOOP3: DJNZ R3,AGAIN ;R3是否為0?不是;則跳到AGAINCLR TR0 ;是則停止TIMR0計數(shù)RET END方法3:延時時間0.2秒,使用TIMER0在MODE2下工作。程序如下:ORG 00H ;起始地址MOV TMOD,#02H ;設定TIMER0工作在MODE2START: CLR C ;C=0MOV A,#0FFH ;ACC=FFH,左移初值MOV R2,#08 ;R2=08,設左移8次LOOP: RLC A ;左移一位MOV P1,A ;輸出至P1MOV R4,#04 ;200毫秒A1: MOV R3,#200 ;50毫秒ACALL DELA

23、Y ;250微妙DJNZ R4,A1DJNZ R2,LOOP ;左移8次MOV R2,#07 ;R2=07,設右移7次LOOP1: RRC A ;右移一位MOV P1,A ;輸出至P1MOV R4,#04 ;200毫秒A2: MOV R3,#200 ;50毫秒ACALL DELAY ;250微妙DJNZ R4,A2DJNZ R2,LOOP1 ;右移7次JMP START DELAY: SETB TR0 ;啟動TIMER0開始計時AGAIN: MOV TL0,#6 ;設定TL0的值MOV TH0,#6 ;設定TH0的值LOOP1: JBC TF0,LOOP ;TF0是否為1,是則;跳至LOOP3

24、,并清TF0JMP LOOP1 ;不是則跳到LOOP1LOOP3: DJNZ R3,AGAIN ;R3是否為0?不是則跳到AGAINCLR TR0 ;是則停止TIMR0計數(shù)RET END方法4:延時時間0.2秒,使用TIMER0在MODE3下工作。程序如下:ORG 00H ;起始地址MOV TMOD,#03H ;設定TIMER0工作在MODE3START: CLR C ;C=0MOV A,#0FFH ;A=FFHMOV R2,#08 ;R2=08,設左移8次LOOP: RLC A ;左移一位MOV P1,A ;輸出至P1MOV R4,#04 ;200毫秒A1: MOV R3,#200 ;50毫

25、秒ACALL DELAY ;250微妙DJNZ R4,A1DJNZ R2,LOOP ;左移8次MOV R2,#07 ;R2=07,設右移7次LOOP1: RRC A ;右移一位MOV P1,A ;輸出至P1MOV R4,#04 ;200毫秒A2: MOV R3,#200 ;50毫秒ACALL DELAY ;250微妙DJNZ R4,A2DJNZ R2,LOOP1 ;右移7次JMP START DELAY: SETB TR0 ;啟動TIMER0開始計時AGAIN: MOV TL0,#6 ;設定TL0的值LOOP1:JBC TF0,LOOP3 ;TF0是否為1,是則跳至LOOP3,并清楚TF0JM

26、P LOOP1 ;不是則跳到LOOP1LOOP3: DJNZ R3,AGAIN ;R3是否為0?不是則跳到AGAINCLR TR0 ;是則停止TIMR0計數(shù)RET END例2、計數(shù)器(TIMER0)1、功能說明T0每輸入脈沖3次則P1的LED會做BCD碼加1的變化,P1.3P1.0為個位(8421碼),P1.7P1.4為十位(8421碼)。 方法1:TIMER0工作在MODE0計數(shù)模式下。2、硬件:見第二章圖2-16,只是在8031的14腳(T0)接一個由555組成的方波振蕩器,提供計數(shù)脈沖。3、程序如下: ORG 0000HSTART:MOV R2,#00H ;計數(shù)指針MOV TMOD,#B

27、 ;設定計數(shù)工作方式LOOP1:MOV TH0,#0FFH ;設定計數(shù)3次MOV TL0,#1DHSETB TR0 ;啟動計數(shù)器LOOP1:JBC TF0,LOOP3 ;溢出嗎?是則跳LOOP3JMP LOOP1 ;不是則往LOOP1LOOP3:MOV A,R2 ;計數(shù)指針加1ADD A,#01HDA A ;作BCD碼調整MOV R2,A ;存入R2CPL A ;反相以作LO輸出MOV P1,A ;輸出至P1JMP LOOP1END方法2:TIMER0在MODE1的計數(shù)工作方式下。程序如下:ORG 00HSTART:MOV R2,#00H ;計數(shù)指針MOV TMOD,#B ;設定計數(shù)工作方式L

28、OOP1:MOV TH0,#0FDH ;設定計數(shù)3次MOV TL0,#0FFHSETB TR0 ;啟動計數(shù)器LOOP1:JBC TF0,LOOP3 ;溢出嗎?是則跳LOOP3JMP LOOP1 ;不是則往LOOP1LOOP3:MOV A,R2 ;計數(shù)指針加1ADD A,#01HDA A ;作BCD碼調整MOV R2,A ;存入R2CPL A ;反相以作LO輸出MOV P1,A ;輸出至P1JMP LOOP1END方法3:TIMER0在MODE2的計數(shù)工作方式下。程序如下:ORG 00HSTART: MOV R2,#00H ;計數(shù)指針MOV TMOD,#B ;設定計數(shù)工作方式LOOP1:MOV

29、TH0,#0FDH ;設定計數(shù)3次MOV TL0,#0FDHSETB TR0 ;啟動計數(shù)器LOOP1:JBC TF0,LOOP3 ;溢出嗎?是則跳LOOP3JMP LOOP1 ;不是則往LOOP1LOOP3:MOV A,R2 ;計數(shù)指針加1ADD A,#01HDA A ;作BCD碼調整MOV R2,A ;存入R2CPL A ;反相以作LO輸出MOV P1,A ;輸出至P1JMP LOOP1END方法4:TIMER0在MODE3的計數(shù)工作方式下。程序如下:ORG 00HSTART:MOV R2,#00H ;計數(shù)指針MOV TMOD,#B ;設定計數(shù)工作方式LOOP1:MOV TH0,#0FDH

30、;設定計數(shù)3次SETB TR0 ;啟動計數(shù)器LOOP1:JBC TF0,LOOP3 ;溢出嗎?是則跳LOOP3JMP LOOP1 ;不是則往LOOP1LOOP3:MOV A,R2 ;計數(shù)指針加1ADD A,#01HDA A ;作BCD碼調整MOV R2,A ;存入R2CPL A ;反相以作LO輸出MOV P1,A ;輸出至P1JMP LOOP1END應用定時器T0、T1來進行定時或對外部事件計數(shù)、利用MCS-51的中斷功能,就能使CPU并行地執(zhí)行多種操作,提高CPU的工作效率。例3:低頻信號發(fā)生器驅動程序我們設計一個控制程序,使8031的P1口輸出8路低頻方波脈沖,頻率分別為100、50、25

31、、20、10、5、2、1Hz。我們使用定時器T0,產生5ms的定時,若晶振選11.0592MHz,則5ms相當于4608個機器周期,T0應工作于方式1,初值位x為:x=65536-4608=60928。用十六進制數(shù)表示則:x=0EE00H。對應于P1.0 P1.7,設立8個計數(shù)器,初值分別為1、2、4、5、10、20、50、100,由T0的溢出中斷服務程序對它們減“1”計數(shù),當減為零時恢復初值,并使相應的口線改變狀態(tài),這樣就使P1口輸出所要求的方波。下面分別是有關的部分主程序和T0中斷處理程序。程序如下: ORG 0START: AJMP MAINORG 0BHPTF0: MOV TH0,#0

32、EEH ;T0中斷服務程序CPL P1.0DJNZ 31H,PF01 ;對各路計數(shù)器進行計數(shù)MOV 31H,#2 ;計數(shù)器減為0,恢復計數(shù)初值CPL P1.1PF01: DJNZ 32H,PF02 ;輸出相反MOV 32H,#4CPL P1.2PF02: DJNZ 33H,PF03MOV 33H,#5CPL P1.3PF03: DJNZ 34H,PF04MOV 34H,#10CPL P1.4PF04: DJNZ 35H,PF05MOV 35H,#20CPL P1.5PF05: DJNZ 36H,PF06MOV 36H,#50CPL P1.6PF06: DJNZ 37H,PF07MOV 37H,

33、#100CPL P1.7PF07: RETIMAIN: MOV SP,#70 ;主程序:棧指針初始化MOV 31H,#2 ;各路計數(shù)器置初值MOV 32H,#4MOV 33H,#5MOV 34H,#10MOV 35H,#20MOV 36H,#50MOV 37H,#100MOV TMOD,#1 ;T0方式1定時MOV TL0,#0 ;初值T0MOV TH0,#0EEHMOV IE,#82H ;允許T0中斷SETB TR0 ;允許T0計數(shù)HERE: SJMP HERE ;踏步,通常CPU處理其他工作例4:波形展寬程序設P3.4輸入低頻的窄脈沖信號,要求在P3.4輸入發(fā)生負跳變時,P1.0輸出一個5

34、00us的同步脈沖。若晶振頻率為6MHz,500us相當于250個機器周期。我們采用如圖7-3所示的設計方法。P1.0的初態(tài)為高電平,T0選為方式2對外部事件計數(shù),初值為0FFH;這樣P3.4輸入發(fā)生負跳變時,T0產生溢出,程序查詢到TF0為1時,T0改變?yōu)?00us的定時器的工作方式,并使P1.0輸出低電平,T0溢出后恢復P1.0高電平,T0又工作于外部事件計數(shù)方式。 圖7-3 I/O波形和T0方式變換程序如下:START:MOV TMOD,#6MOV TH0,#0FFHMOV TL0,#0FFHSETB TR0LOP1: JBC TF0,PT01 SJMP LOP1PT01: CLR P1

35、.0CLR TR0 ;*1MOV TMOD,#2 ;*2MOV TH0,#11H ;*2MOV TL0,#11H ;*2SETB TR0 ;*1LOP1: JBC TF0,PT02 ;*2SJMP LOP1PT02: SETB P1.0 ;*1CLR TR0SJMP STARTP1.0負脈沖寬度為:(28-17)+112=500us(帶*機器周期和為11)例5:簡易順序控制器監(jiān)控程序在一個簡易順序控制器中,用8031 P1口上的八個繼電器來控制一個機械裝置的八個機械動作,要求P1口輸出如圖7-4所示的波形,現(xiàn)在為這個控制器配一個監(jiān)控程序。我們采用和例2中相似的方法。根據(jù)P1口的輸出波形,可劃分

36、為十六個狀態(tài),用一個工作單元記錄P1口當前的狀態(tài)數(shù)(初值為0)。把16個狀態(tài)的輸出數(shù)據(jù)和持續(xù)時間以表格形式存放于程序存貯器中。利用定時器T0產生10ms(時間單位)的定時,在T0的中斷服務程序中對當前狀態(tài)的時間計數(shù)器進行計數(shù)。當計數(shù)器減1到0時,計算下一個狀態(tài),查表取出持續(xù)時間常數(shù)裝入當前時間計數(shù)器,取出數(shù)據(jù)輸出到P1口。這樣便使P1口輸出規(guī)定的波形,實現(xiàn)對機械裝置的操作控制。下面分別為主程序和T0中斷服務程序。主程序中,我們用踏步指令代替CPU的其他操作,在實際應用中CPU還執(zhí)行系統(tǒng)狀態(tài)的監(jiān)視等操作(如人工干預、機械裝置異常狀態(tài)輸入處理等)。圖7-4簡易順序控制器輸出波形程序如下:ORG 0START:SJMP MAIN ;轉主程序ORG 0BHLJMP PTFO ;轉T0中斷服務程序ORG 40HMAIN:MOV P1,#0 ;主程序,P1口和棧指針初始化MOV SP,#70HMOV 20H,#0 ;狀態(tài)數(shù)初

溫馨提示

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

評論

0/150

提交評論