版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
教學(xué)基本要求:※掌握單片機定時器/計數(shù)器的結(jié)構(gòu)與工作原理;※握單片機的定時器/計數(shù)器的初值計算、工作方式控制寄存器的初始化;※了解單片機的定時器/計數(shù)器的各種工作方式及其差異;※掌握單片機的定時器/計數(shù)器程序的設(shè)計方法和步驟。第6章MCS-51的定時器/計數(shù)器重點與難點:單片機定時器/計數(shù)器的結(jié)構(gòu)與工作原理、控制與工作方式、編程和應(yīng)用。6.1定時器/計數(shù)器結(jié)構(gòu)與工作原理定時器/計數(shù)器的基本部件是兩個8位的計數(shù)器(其中TH1,TL1是T1的計數(shù)器,TH0,TL0是T0的計數(shù)器)拼裝而成。在作定時器使用時,輸入的時鐘脈沖是由晶體振蕩器的輸出經(jīng)12分頻后得到的,所以定時器也可看作是對計算機機器周期的計數(shù)器(因為每個機器周期包含12個振蕩周期,故每一個機器周期定時器加1,可以把輸入的時鐘脈沖看成機器周期信號)。故其頻率為晶振頻率的1/12。如果晶振頻率為12MHZ,則定時器每接收一個輸入脈沖的時間為1μs。當(dāng)它用作對外部事件計數(shù)時,接相應(yīng)的外部輸入引腳T0(P3.4)或T1(P3.5)。在這種情況下,當(dāng)檢測到輸入引腳上的電平由高跳變到低時,計數(shù)器就加1(它在每個機器周期的S5P2時采樣外部輸入,當(dāng)采樣值在這個機器周期為高,在下一個機器周期為低時,則計數(shù)器加1)。加1操作發(fā)生在檢測到這種跳變后的一個機器周期中的S3P1,因此需要兩個機器周期來識別一個從“1”到“0”的跳變,故最高計數(shù)頻率為晶振頻率的1/24。這就要求輸入信號的電平要在跳變后至少應(yīng)在一個機器周期內(nèi)保持不變,以保證在給定的電平再次變化前至少被采樣一次。定時器/計數(shù)器有四種工作方式,其工作方式的選擇及控制都由兩個特殊功能寄存器(TMOD和TCON)的內(nèi)容來決定。用指令改變TMOD或TCON的內(nèi)容后,則在下一條指令的第一個機器周期的S1P1時起作用。定時器的方式寄存器TMOD圖6-1TMOD寄存器各位定義特殊功能寄存器TMOD為定時器的方式控制寄存器,高4位用于定時器1,低4位用于定時器0。其中M1,M0用來確定所選的工作方式。①M1M0定時器/計數(shù)器四種工作方式選擇M1M0方式說明00013位定時器/計數(shù)器01116位定時器/計數(shù)器102自動裝入時間常數(shù)的8位定時器/計數(shù)器113對T0分為兩個8位獨立計數(shù)器;對T1置方式3時停止工作(無中斷重裝8位計數(shù)器)表6-1工作方式選擇表②C/定時器方式或計數(shù)器方式選擇位。C/=1時,為計數(shù)器方式;C/=0時,為定時器方式。③GATE定時器/計數(shù)器運行控制位,用來確定對應(yīng)的外部中斷請求引腳(,)是否參與T0或T1的操作控制。當(dāng)GATE=0時,只要定時器控制寄存器TCON中的TR0(或TR1)被置1時,T0(或T1)被允許開始計數(shù)(TCON各位含義見后面敘述);當(dāng)GATE=1時,不僅要TCON中的TR0或TR1置位,還需要P3口的或引腳為高電平,才允許計數(shù)。特殊功能寄存器TCON用于控制定時器的操作及對定時器中斷的控制。其各位定義如圖6-2所示。其中D0~D3位與外部中斷有關(guān)。圖6-2TCON寄存器各位定義①TR0T0的運行控制位。該位置1或清0用來實現(xiàn)啟動計數(shù)或停止計數(shù)。②TF0T0的溢出中斷標(biāo)志位。當(dāng)T0計數(shù)溢出時由硬件自動置1;在CPU中斷處理時由硬件清為0。③TR1T1的運行控制位。功能同TR0。④TF1T1的溢出中斷標(biāo)志位。功能同TF0。TMOD和TCON寄存器在復(fù)位時其每一位均清零。2、定時器控制寄存器TCON6.2定時/計數(shù)器的工作方式MCS-51片內(nèi)的定時器/計數(shù)器可以通過對特殊功能寄存器TMOD中的控制位C/的設(shè)置來選擇定時器方式或計數(shù)器方式;通過對M1M0兩位的設(shè)置來選擇四種工作方式1、方式0當(dāng)M1M0設(shè)置為00時,定時器選定為方式0工作。在這種方式下,16位寄存器只用了13位,TL0的高三位未用。由TH0的8位和TL0的低5位組成一個13位計數(shù)器,如圖6-3所示。圖6-3定時/計數(shù)器選定為方式0工作2、方式1方式1和方式0的工作相同,唯一的差別是TH0和TL0組成一個16位計數(shù)器,如圖6-4所示。圖6-4定時/計數(shù)器選定為方式1工作3、方式2方式2把TL0配置成一個可以自動恢復(fù)初值(初始常數(shù)自動重新裝入)的8位計數(shù)器,TH0作為常數(shù)緩沖器,TH0由軟件預(yù)置值。當(dāng)TL0產(chǎn)生溢出時,一方面使溢出標(biāo)志TF0置1,同時把TH0中的8位數(shù)據(jù)重新裝入TL0中,如圖6-5所示。圖6-5定時/計數(shù)器選定為方式2工作方式2常用于定時控制。例如希望每隔250μs產(chǎn)生一個定時控制脈沖,則可以采用12MHz的振蕩器,把TH0預(yù)置為6,并使C/=0就能實現(xiàn)。T1的方式2常用作串行口波特率發(fā)生器。4、方式3方式3對定時器T0和定時器T1是不相同的。若T1設(shè)置為方式3,則停止工作(其效果與TR1=0相同)。所以方式3只適用于T0,如圖6-6所示。圖6-6定時/計數(shù)器選定為方式3工作方式3使MCS-51具有三個定時器/計數(shù)器(增加了一個附加的8位定時器/計數(shù)器)。當(dāng)T0設(shè)置為方式3時,將使TL0和TH0成為兩個相互獨立的8位計數(shù)器,TL0利用了T0本身的一些控制(C/,GATE,TR0,和TF0)方式,它的操作與方式0和方式1類似。而TH0被規(guī)定為用作定時器功能,對機器周期計數(shù),并借用了T1的控制位TR1和TF1。在這種情況下TH0控制了T1的中斷。這時T1還可以設(shè)置為方式0~2,用于任何不需要中斷控制的場合,或用作串行口的波特率發(fā)生器。通常,當(dāng)T1用作串行口波特率發(fā)生器時,T0才定義為方式3,以增加一個8位計數(shù)器。6.3定時器/計數(shù)器的初始化1、初始化步驟MCS-51內(nèi)部定時器/計數(shù)器是可編程序的,其工作方式和工作過程均可由MCS-51通過程序?qū)λM行設(shè)定和控制。因此,MCS-51在定時器/計數(shù)器工作前必須先對它進行初始化。初始化步驟為:(1)根據(jù)題目要求先給定時器方式寄存器TMOD送一個方式控制字,以設(shè)定定時器/計數(shù)器的相應(yīng)工作方式。(2)根據(jù)實際需要給定時器/計數(shù)器選送定時器初值或計數(shù)器初值,以確實需要定時的時間和需要記數(shù)的初值。(3)根據(jù)需要給中斷允許寄存器IE選送中斷控制字和給中斷優(yōu)先級寄存器IP選送中斷優(yōu)先級字,以開放相應(yīng)中斷和設(shè)定中斷優(yōu)先級。(4)給定時器控制寄存器TCON送命令字,以啟動或禁止定時器/計數(shù)器的運行。2、計數(shù)器初值的計算定時器/計數(shù)器可用軟件隨時隨地起動和關(guān)閉,起動時它就自動加“1”記數(shù),一直記到滿,即全為“1”,若不停止,計數(shù)值從全“1”變?yōu)槿?”,同時將計數(shù)溢出位置“1”并向CPU發(fā)出定時器溢出中斷申請。對于各種不同的工作方式最大的定時時間和計數(shù)數(shù)目不同。這里在使用中就會出現(xiàn)兩個問題:一是要產(chǎn)生比定時器最大的定時時間還要小的時間和計數(shù)器最大計數(shù)次數(shù)還要小的計數(shù)次數(shù)怎么辦?二是要產(chǎn)生比定時器最大的定時時間還要大的時間和計數(shù)器最大計數(shù)次數(shù)還要大的計數(shù)次數(shù)怎么辦?解決以上第一個問題只要給定時器/計數(shù)器一個非零初值,開定時器/計數(shù)器時,定時器/計數(shù)器不從0開始,而是從初值開始,這樣就可得到比定時器/計數(shù)器最大的定時時間和計數(shù)次數(shù)還要小的時間和計數(shù)次數(shù),解決第二個問題就要用到循環(huán)程序了,循環(huán)幾次就相當(dāng)于乘幾。例如要產(chǎn)生1秒的定時你可先用定時器產(chǎn)生50ms的定時,再循環(huán)20次就行了,因為1s=1000ms,也可用其它的組合。有時也可采用中斷來實現(xiàn)。由上可見,解決問題的基本出路在于初值的計算,下面就來具體討論計數(shù)器的初值計算和最大值的計算。我們把計數(shù)器從初值開始作加1計數(shù)到計滿為全1所需要的計數(shù)值設(shè)定為C和計數(shù)初值設(shè)定為D,由此便可得到如下的計算通式:
D=M-C(1)式中,M為計數(shù)器模值,該值和計數(shù)器工作方式有關(guān)。在方式0時M為213;在方式1時M為216;在方式2和方式3時M為28。3、定時器初值的計算在定時器模式下,計數(shù)器由單片機脈沖經(jīng)12分頻后計數(shù)。因此,定時器定時時間T的計算公式為:
T=(TM—TC)12/fOSC(μs)(2)式中TM為計數(shù)器從初值開始作加1計數(shù)到計滿為全1所需要的時間。TM為模值,和定時器的工作方式有關(guān);fOSC是單片機晶體振蕩器的頻率,TC為定時器的定時初值。在式(2)中,若設(shè)TC=0,則定時器定時時間為最大(初值為0,計數(shù)從全0到全1,溢出后又為全0)。由于M的值和定時器工作方式有關(guān),因此不同工作方式下定時器的最大定時時間也不一樣。例如:若設(shè)單片機主脈沖晶體振蕩器頻率fOSC為12MHz,則最大定時時間為:方式0時TMmax=213×1μS=8.192ms方式1時TMmax=216×1μs=65.536ms方式2和3時TMmax=28×1μs=0.256ms
例6-1設(shè)方式0工作時,定時時間為1ms,時鐘振蕩頻率為6MHz。解:將數(shù)據(jù)代入公式(2)得:(213-TC)12/6μS=1ms=1000μsTC=213-500=7692化成二進制數(shù)為TC=1111000001100根據(jù)13位定時器/計數(shù)器特性,高8位F0H送至TH0低5位0CH送TL0,一般TL0的高三位置“0”,可用下列匯編指令實現(xiàn)。MOVTL0,#0CH;5位送TL0寄存器MOVTH0,#0F0H;8位送TH0寄存器C51代碼如下:TL0=(8192-500)&0x1f;//取低5位送TL0寄存器
TH0=(8192-500)>>5;//取高8位送TH0寄存器
例6-2若單片機時鐘頻率fOSC為12MHz,請計算定時2ms所需的定時器初值。解:由于定時器工作在方式2和方式3下時的最大定時時間只有0.256ms,因此要想獲得2ms的定時時間定時器必須工作在方式0或方式1。若采用方式0,則根據(jù)式(2)可得定時器初值為:
TC=213-2ms/1μs=6129
用計算機附件中的計算器可將6129轉(zhuǎn)換為十六進制數(shù)為1830H。注意:這不是定時器工作在方式0時的初值,因定時器工作在方式0時是13位,高字節(jié)8位,低字節(jié)5位,所以還要進行適當(dāng)?shù)淖儞Q,因為1830H可寫成0001100000110000按13位重新組合成0001100000110000這組數(shù)就可拼成
1100000100010000這樣就得到定時器工作在方式0時的初值C110H。即:TH0應(yīng)裝C1H;TL0應(yīng)裝10H(高三位為0)。若采取方式1,則有:TC=216-2MS/1μs=63536=F830H
即:TH0應(yīng)裝F8H;TL0應(yīng)裝30H。例6-3設(shè)T1作定時器,以方式1工作,定時時間為10mS;T0作計數(shù)器,以方式2工作,外界發(fā)生一次事件即溢出。解:T1的時間常數(shù)為:(216-TC)×2μs=10msTC=EC78H
初始化代碼(匯編語言):
MOVTMOD,#16H;T1定時方式1,T0計數(shù)方式2,即置TMOD寄存器的內(nèi)容為00010110MOVTL0,#0FFH;T0時間常數(shù)低八位送TL0MOVTH0,#0FFH;T0時間常數(shù)高八位送TH0MOVTL1,#78H;T1時間常數(shù)(低8位)送TL1MOVTH1,#0ECH;T1時間常數(shù)(高8位)送TH1SETBTR0;置TR0為1允許T0啟動計數(shù)SETBTR1;置TR1為1允許T1啟動計數(shù)C51代碼如下:TMOD=0x16;//T1定時方式1,T0計數(shù)方式2TL0=0xff;//T0時間常數(shù)低八位送TL0TH0=0xff;//T0時間常數(shù)高八位送TH0TL1=0x78;//T1時間常數(shù)(低8位)送TL1TH1=0xec;//T1時間常數(shù)(高8位)送TH1TR0=1;//啟動T0計數(shù)
TR1=1;//啟動T1計數(shù)例6-4
設(shè)定時器T0,以方式1工作,試編寫一個延時1秒的子程序。解:若主頻頻率為6MHZ可求得T0的最大定時時間為:
TMmax=216×2μs=131.072ms我們就用定時器獲得100ms的定時時間再加10次循環(huán)得到1秒的延時,可算得100ms定時的定時初值:(216-TC)×2μs=100ms=100000μsTC=216-50000=15536TC=3CB0H
匯編語言程序如下:ORG0000HMOVTMOD,#01H;設(shè)置T0為定時模式1MOVR7,#10;設(shè)置0.1s計數(shù)器初值
ACALLTIME;SJMP$;1秒延時子程序TIME:MOVTL0,#0B0H;設(shè)置定時器初值
MOVTH0,#3CHSETBTR0;啟動定時器0LOOP1:JBCTF0,LOOP2;測試0.1S時間到標(biāo)志,如果100ms時間到,轉(zhuǎn)0.1s處理
JMPLOOP1;0.1s時間沒有到,繼續(xù)測試0.1s時間到標(biāo)志LOOP2:DJNZR7,TIME;1s時間沒到,轉(zhuǎn)到TIMERET;子程序返回
END例6-5廣告燈的左移右移方法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、硬件:見圖6-7圖6-7廣告燈的左移右移電路圖3、程序如下(例5-4給出的是C51代碼,與本例相似,本例給出的是匯編語言程序):ORG00H;起始地址MOVTMOD,#00H;設(shè)定TIMER0工作在MODE0START:CLRC;C=0MOVA,#0FEH;ACC=FEH,左移初值MOVR2,#08;R2=08,設(shè)左移8次LOOP:RLCA;左移一位MOVP1,A;輸出至P1MOVR3,#100;0.2秒ACALLDELAY;2000微妙DJNZR2,LOOP;左移8次MOVR2,#07;R2=07,設(shè)右移7次LOOP1:
RRCA;右移一位MOVP1,A;輸出至P1MOVR3,#100;0.2秒ACALLDELAY;2000微妙DJNZR2,LOOP1;右移7次JMPSTARTDELAY:SETBTR0;啟動TIMER0開始計時AGAIN:MOVTL0,#10H;設(shè)定TL0的值MOVTH0,#0C1H;設(shè)定TH0的值LOOP1:JBCTF0,LOOP3;TF0是否為1,是則跳至LOOP3,并清TF0JMPLOOP1;不是則跳到LOOP1LOOP3:DJNZR3,AGAIN;R3是否為0?不是則跳到AGAINCLRTR0;是則停止TIMR0計數(shù)RETEND方法2:延時時間0.2秒,使用TIMER0在MODE1下工作。程序略方法3:延時時間0.2秒,使用TIMER0在MODE2下工作。程序略方法4:延時時間0.2秒,使用TIMER0在MODE3下工作。程序略例6-6計數(shù)器(TIMER0)1、功能說明①T0每輸入脈沖3次則P1的LED會做BCD碼加1的變化,P1.3~P1.0為個位(8421碼),P1.7~P1.4為十位(8421碼)。②方法1:TIMER0工作在MODE0計數(shù)模式下。2、硬件:見圖6-8,只是在AT89C51的14腳(T0)接一個按鍵,按按鍵提供計數(shù)脈沖。圖6-8計數(shù)器(TIMER0)3、程序如下:#include<REG51.H>//插入51特殊功能寄存器頭文件//--------------------------------------------------------------------------------unsignedcharcount;//定義計數(shù)變量//---------------------------------------------------voidmain(void){count=0;//計數(shù)器清0P1=0x00;//P1輸出初始值00TMOD=0x04;//定時/計數(shù)器0設(shè)為方式0,計數(shù)模式
TR0=1;//啟動定時/計數(shù)器0while(1){TH0=0xFF;//設(shè)定計數(shù)3次
TL0=0x1D;while(!TF0);//沒有溢出,就等待
TF0=0;//清溢出標(biāo)志
count++;//計數(shù)器加1
if(count==100)count=0;//如果計數(shù)值為100,計數(shù)器就清0P1=((count/10)<<4)+(count%10);//輸出至P1}}方法2:TIMER0在MODE1的計數(shù)工作方式下。程序略方法3:TIMER0在MODE2的計數(shù)工作方式下。程序略方法4:TIMER0在MODE3的計數(shù)工作方式下。程序略例6-7低頻信號發(fā)生器驅(qū)動程序設(shè)計一個控制程序,使AT89C51的P1口輸出8路低頻方波脈沖,頻率分別為100、50、25、20、10、5、2、1Hz。使用定時器T0,產(chǎn)生5ms的定時,若晶振選11.0592MHz,則5ms相當(dāng)于4608個機器周期,T0應(yīng)工作于方式1,初值位x為:x=65536-4608=60928。用十六進制數(shù)表示則:x=0EE00H。對應(yīng)于P1.0~P1.7,設(shè)立8個計數(shù)器,初值分別為1、2、4、5、10、20、50、100,由T0的溢出中斷服務(wù)程序?qū)λ鼈儨p“1”計數(shù),當(dāng)減為零時恢復(fù)初值,并使相應(yīng)的口線改變狀態(tài),這樣就使P1口輸出所要求的方波,圖6-9例6-7低頻信號發(fā)生器仿真圖。下面分別是有關(guān)的部分主程序和T0中斷處理程序。圖6-9例6-7低頻信號發(fā)生器仿真圖程序如下:#include<REG51.H>//插入51特殊功能寄存器頭文件//--------------------------------------------------------------------------------sbitP10=P1^0;//100Hz輸出信號口設(shè)置sbitP11=P1^1;//50Hz輸出信號口設(shè)置sbitP12=P1^2;//20Hz輸出信號口設(shè)置sbitP13=P1^3;//10Hz輸出信號口設(shè)置sbitP14=P1^4;//5Hz輸出信號口設(shè)置sbitP15=P1^5;//4Hz輸出信號口設(shè)置sbitP16=P1^6;//2Hz輸出信號口設(shè)置sbitP17=P1^7;//1Hz輸出信號口設(shè)置unsignedcharcount2,count4,count5,count10,count20;unsignedcharcount50,count100;//定義計數(shù)變量//===============================================voidmain(void){TMOD=0x01;//定時/計數(shù)器0設(shè)為方式1TH0=0xEE;//定時5ms初值的高八位送入TH0TL0=0;//初值的低八位送入TL0count2=2;//10ms計時單元置初值
count4=4;//20ms計時單元置初值
count5=5;//25ms計時單元置初值
count10=10;//50ms計時單元置初值
count20=20;//100ms計時單元置初值
count50=50;//250ms計時單元置初值
count100=100;//500ms計時單元置初值
TR0=1;//啟動定時器0ET0=1;//開定時/計數(shù)器0的中斷
EA=1;//開CPU中斷
while(1);//等待中斷
}voidt0(void)interrupt1using0//定時器0中斷處理函數(shù)
{TH0=0xEE;//重新將定時50ms初值的高八位送入TH0P10=!P10;//100Hz輸出信號取反
count2--;//10ms計時單元減1if(count2==0){count2=2;P11=!P11;}//如果時間到,10ms計時單元重新置初值,50Hz輸出信號取反
count4--;//10ms計時單元減1if(count4==0){count4=4;P12=!P12;}//如果時間到,20ms計時單元重新置初值,20Hz輸出信號取反
count5--;//20ms計時單元減1if(count5==0){count5=5;P13=!P13;}//如果時間到,25ms計時單元重新置初值,10Hz輸出信號取反
count10--;//25ms計時單元減1if(count10==0){count10=10;P14=!P14;}//如果時間到,50ms計時單元重新置初值,5Hz輸出信號取反
count20--;//50ms計時單元減1if(count20==0){count20=20;P15=!P15;}//如果時間到,100ms計時單元重新置初值,4Hz輸出信號取反
count50--;//250ms計時單元減1if(count50==0){count50=50;P16=!P16;}//如果時間到,250ms計時單元重新置初值,2Hz輸出信號取反
count100--;//500ms計時單元減1if(count100==0){count100=100;P17=!P17;}//如果時間到,500ms計時單元重新置初值,1Hz輸出信號取反
}圖6-10低頻信號發(fā)生器仿真效果圖例6-8波形展寬程序設(shè)P3.4輸入低頻的窄脈沖信號,要求在P3.4輸入發(fā)生負(fù)跳變時,P1.0輸出一個500μS的同步脈沖。若晶振頻率為6MHz,500μS相當(dāng)于250個機器周期。我們采用如圖6-11所示的設(shè)計方法。P1.0的初態(tài)為高電平,T0選為方式2對外部事件計數(shù),初值為0FFH;這樣P3.4輸入發(fā)生負(fù)跳變時,T0產(chǎn)生溢出,程序查詢到TF0為1時,T0改變?yōu)?00μS的定時器的工作方式,并使P1.0輸出低電平,T0溢出后恢復(fù)P1.0高電平,T0又工作于外部事件計數(shù)方式。圖6-11I/O波形和T0方式變換
程序如下:#include<reg51.h>sbitP1_0=P1^0;//P1.0輸出展寬波形voidmain(){TMOD=0x06;//T0計數(shù)器,方式2TH0=-250;//6MHz頻率500微秒定時初值
TL0=255;//初值255可使1個外來脈沖即產(chǎn)生溢出
TR0=1;//啟動計數(shù)器
while(1){while(TF0==0);//等待首次溢出
TF0=0;//清TF0溢出標(biāo)志
TMOD=0x02;//T0定時器,方式2P1_0=0;//P1.0輸出0while(TF0==0);//等待再次溢出
TF0=0;//清TF0溢出標(biāo)志
P1_0=1;//P1.0輸出1TMOD=0x06;//T0計數(shù)器,方式2TL0=255;//重新置計數(shù)初值
}}圖6-12波形展寬仿真圖例6-9簡易順序控制器監(jiān)控程序在一個簡易順序控制器中,用51P1口上的八個繼電器來控制一個機械裝置的八個機械動作,要求P1口輸出如圖6-13所示的波形,現(xiàn)在為這個控制器配一個監(jiān)控程序。我們采用和例2中相似的方法。根據(jù)P1口的輸出波形,可劃分為十六個狀態(tài),用一個工作單元記錄P1口當(dāng)前的狀態(tài)數(shù)(初值為0)。把16個狀態(tài)的輸出數(shù)據(jù)和持續(xù)時間以表格形式存放于程序存貯器中。利用定時器T0產(chǎn)生10ms(時間單位)的定時,在T0的中斷服務(wù)程序中對當(dāng)前狀態(tài)的時間計數(shù)器進行計數(shù)。當(dāng)計數(shù)器減1到0時,計算下一個狀態(tài),查表取出持續(xù)時間常數(shù)裝入當(dāng)前時間計數(shù)器,取出數(shù)據(jù)輸出到P1口。這樣便使P1口輸出規(guī)定的波形,實現(xiàn)對機械裝置的操作控制。下面分別為主程序和T0中斷服務(wù)程序。主程序中,我們用踏步指令代替CPU的其他操作,在實際應(yīng)用中CPU還執(zhí)行系統(tǒng)狀態(tài)的監(jiān)視等操作(如人工干預(yù)、機械裝置異常狀態(tài)輸入處理等)。圖6-13簡易順序控制器輸出波形程序如下:#include<REG51.H>//插入51特殊功能寄存器頭文件//--------------------------------------------------------------------------------unsignedcharcodeOUTTAB[]=//輸出狀態(tài)表
{0x00,0x01,0x00,0x02,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80};unsignedintcodeGNTAB[]=//時間常數(shù)表
{2000,2200,2400,2600,2800,3000,3200,3400,3600,3800,4000,4200,4400,4600,4800,5000};//--------------------------------------------------------------------------------unsignedcharstaudata;//狀態(tài)數(shù)變量unsignedintcount;//計數(shù)變量//---------------------------------------------------voidSPRI(unsignedchara)//P1口操作子函數(shù)
{P1=OUTTAB[a];}//根據(jù)狀態(tài)數(shù)取數(shù)據(jù)→P1口//------------------unsignedint
GNI(unsignedchara)//取時間常數(shù)子變量
{unsignedinti;i=GNTAB[a];//取時間常數(shù)
return(i);//返回時間常數(shù)值
}//------------------voidmain(void){P1=0;//P1口初始化
staudata=0;//狀態(tài)計數(shù)器初始化
TMOD=0x01;//定時/計數(shù)器0設(shè)為方式1TH0=0xff;//0xdc;//定時50ms初值的高八位送入TH0TL0=0x00;//定時50ms初值的低八位送入TL0IE=0x82;//開T0中斷,開CPU中斷
TR0=1;//啟動定時器0while(1);//等待中斷
}//=====================voidt0(void)interrupt1using0//定時器0中斷處理函數(shù)
{TH0=0xff;//0xDC;//重新將定時50ms初值的高八位送入TH0
if(count!=0){count--;}//如果不為0,計數(shù)器減1else{
staudata++;//計算下一個狀態(tài)數(shù)
staudata= staudata&0x0f;
SPRI(staudata);//調(diào)用對P1口操作函數(shù)
count=GNI(staudata);//調(diào)用取時間常數(shù)函數(shù)
}}圖6-14簡易順序控制器仿真效果圖例6-10脈沖寬度測試程序該程序的功能是測試P3.3上輸入的正脈沖寬度,將測試的結(jié)果送內(nèi)部RAM緩沖器中。門控位為1時,僅當(dāng)P3.3為高電平時,T1才啟動計數(shù),利用這個方法,便可以測試P3.3輸入脈沖的寬度,測試原理見圖6-15。在本例中脈沖寬度以機器周期為單位,且小于65536。請讀者修改下面給出的程序,使之能測試寬度更大的脈沖。圖6-15脈沖寬度測試原理程序如下:#include<reg51.h>sbitP3_3=P3^3;//定義脈沖輸入引腳voidmain(){unsignedchar*P,i;
inta;P=0x30;//指針指向片內(nèi)30H單元
TMOD=0x90;//GATE=1,工作方式為計數(shù)器T1//(T1設(shè)為門控制方式1定時)TL1=0x00;TH1=0x00;//裝入初值
do{}while(P3_3==1);//等待INT1變低
TR1=1;//啟動計數(shù)器
while(P3_3==0);//等待INT1變高,即脈沖上升沿
while(P3_3==1);//等待INT1變低,即脈沖下降沿
TR1=0;//停止計數(shù)
i=TH1;//讀入TH1值
a=i*256+TL1;//計數(shù)結(jié)果轉(zhuǎn)換為10進制
for(a;a!=0;)//a不等于0時循環(huán),轉(zhuǎn)換為BCD碼
{*P=a%10;//個位存放在30單元
a=a/10;P++;}}圖6-16脈沖寬度測試仿真效果圖
AT89C52中有一個功能較強的定時器/計數(shù)器T2,它是一個16位定時/計數(shù)器,可通過設(shè)置特殊功能寄存器T2CON中的C/T2位,選擇將其作為定時器或計數(shù)器。6.5.1T2控制寄存器T2CON和T2MOD6.5.1.1狀態(tài)控制寄存器T2CONT2CON是定時/計數(shù)器T2的狀態(tài)控制寄存器,用于確定T2的工作方式、各種功能選擇及有關(guān)狀態(tài)信息。T2CON可位尋址,因此所有標(biāo)志或控制位都可以用位操作指令來置位或清零。T2CON的格式如下(0xc8):D7D6D5D4D3D2D1D0TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2TF2(T2CON.7):定時器2溢出標(biāo)志。定時器2溢出時置位,必須由軟件清除。當(dāng)RCLK或TCLK=l時,TF2將不會置位。
EXF2(T2CON.6):定時器2外部標(biāo)志。當(dāng)EXEN2=1且T2EX的負(fù)跳變產(chǎn)生捕獲或重裝時,EXF2置位。定時器2中斷使能時,EXF2=1將使CPU從中斷向量處執(zhí)行定時器2中斷子程序。EXF2位必須用軟件清零,在遞增/遞減計數(shù)器模式DCEN=l中,EXF2不會引起中斷。
RCLK(T2CON.5):接收時鐘標(biāo)志。RCLK置位時,定時器2的溢出脈沖作為串行口模式l和模式3的接收時鐘。RCLK=0時,將定時器l的溢出脈沖作為接收時鐘。
TCLK(T2CON.4):發(fā)送時鐘標(biāo)志。TCLK置位時,定時器2的溢出脈沖作為串行口模式l和模式3的發(fā)送時鐘。TCLK=0時,將定時器l的溢出脈沖作為發(fā)送時鐘。
EXEN2(T2CON.3):定時器2外部使能標(biāo)志。當(dāng)EXEN2置位且定時器2未作為串行口時鐘時,允許T2EX的負(fù)跳變產(chǎn)生捕獲或重裝。EXEN2=0時,T2EX的跳變對定時器2無效。
TR2(T2CON.2):定時器2啟動/停止控制位。置l時啟動定時器。
C/T2(T2CON.1):定時器/計數(shù)器選擇(定時器2)。
0:內(nèi)部定時器;
1:外部事件計數(shù)器(下降沿觸發(fā))。
CP/RL2(T2CON.0):捕獲/重裝標(biāo)志。置位:EXEN2=1時T2EX的負(fù)跳變產(chǎn)生捕獲。清零:EXEN2=1時定時器2溢出或T2EX的負(fù)跳變都可使定時器自動重裝。當(dāng)RCLK=1或TCLK=1時,該位無效且定時器強制為溢出時自動重裝。6.5定時/計數(shù)器T26.5.1.2模式控制寄存器T2MODT2MOD是定時/計數(shù)器T2的模式控制寄存器,不可位尋址,格式如下(0xC9):D7D6D5D4D3D2D1D0------T2OEDCEN“-”:不可用,保留將來之用。但不可將其置1,這些位在將來8051系列產(chǎn)品中用來實現(xiàn)新的特性,這種情況下,以后用到保留位,復(fù)位時或非有效狀態(tài)時,它的值應(yīng)為0,而這些位為有效狀態(tài)時,它的值為1,從保留讀到的值是不確定的。
T2OE(T2MOD.1):定時器2輸出使能位。
DCEN(T2MOD.0):向下計數(shù)使能位。定時器2可配置成向上/向下計數(shù)器。6.5.2T2的操作模式定時器2有3種操作模式:捕獲、自動重新裝載(遞增或遞減計數(shù))和波特率發(fā)生器,這3種模式由T2CON中的控制位RCLK+TCLK和CP/RL2來進行選擇,見表6-2。表6-2定時/計數(shù)器T2工作模式RCLK+TCLKCP/RL2TR2操作模式00116位自動重裝01116位捕獲1X1波特率發(fā)生器XX0(關(guān)閉)6.5.2.1捕獲模式在捕獲模式中,通過T2CON中的EXEN2設(shè)置兩個選項。如果EXEN2=0,定時器2作為一個l6位定時器或計數(shù)器(由T2CON中C/T2位選擇),溢出時置位TF2(定時器2溢出標(biāo)志位)。通過使能IE寄存器中定時器2的中斷使能位,該位可用于產(chǎn)生中斷。如果EXEN2=1,與以上描述相同,但增加了一個特性,即外部輸入T2EX由1變0時將定時器2中TL2和TH2的當(dāng)前值各自捕獲到RCAP2L和RCAP2H。另外,T2EX的負(fù)跳變使T2CON中的EXF2置位,EXF2也像TF2一樣能夠產(chǎn)生中斷,其向量與定時器2溢出中斷地址相同,定時器2中斷服務(wù)程序通過查詢TF2和EXF2來確定引起中斷的事件。捕獲模式如圖6-17所示。在該模式中TL2和TH2無重新裝載值。當(dāng)T2EX產(chǎn)生捕獲事件時,計數(shù)器仍以T2EX的負(fù)跳變或振蕩頻率的l/12。圖6-17定時/計數(shù)器2的捕獲模式6.5.2.2自動重裝模式(遞增/遞減計數(shù)器)在16位自動重裝模式中,定時器2可通過C/T2配置為定時器/計數(shù)器,通過編程控制遞增/遞減計數(shù)。計數(shù)的方向是由DCEN(遞減計數(shù)使能位)確定。DCEN位于T2MOD寄存器中,當(dāng)DCEN=0時,定時器2默認(rèn)為向上計數(shù);當(dāng)DCEN=1時,定時器2可通過T2EX確定遞增或遞減計數(shù)。圖6-18顯示了當(dāng)DCEN=0時,定時器2自動遞增計數(shù),在該模式中通過設(shè)置EXEN2位進行選擇。如果EXEN2=0,定時器2遞增計數(shù)到0FFFFH并在溢出后將TF2置位,然后將RCAP2L和RCAP2H中的16位值作為重新裝載值裝入定時器2。RCAP2L(0xCA)和RCAP2H(0xCB)的值是通過軟件設(shè)置的。如果EXEN2=1,16位重新裝載可通過溢出或T2EX從高電平1到低電平0的負(fù)跳變實現(xiàn),此負(fù)跳變同時將EXF2置位。如果定時器2的中斷被使能,則當(dāng)TF2或EXF2置1時產(chǎn)生中斷。如圖6-19所示,DCEN=1時定時器2可遞增或遞減計數(shù),此模式允許T2EX控制計數(shù)的方向。當(dāng)T2EX置1時,定時器2遞增計數(shù),計數(shù)到0FFFFH后溢出并置位TF2,同時將產(chǎn)生中斷(如果中斷被使能)。定時器2的溢出將使RCAP2L和RCAP2H中的16位值作為重新裝載值裝入TL2(0xCC)和TH2(0xCD)。圖6-18定時/計數(shù)器2的自動重裝模式(DCEN=0)圖6-19定時/計數(shù)器2的自動重裝模式(DCEN=1)當(dāng)T2EX置零時,將使定時器2遞減計數(shù)。當(dāng)TL2和TH2計數(shù)到等于RCAP2L和RCAP2H時,定時器產(chǎn)生溢出,定時器2溢出置位TF2,并將0FFFFH重新裝入TL2和TH2。當(dāng)定時器2遞增/遞減產(chǎn)生溢出時,外部標(biāo)志位EXF2翻轉(zhuǎn)。如果需要,可將EXF2位作為第l7位。在此模式下,EXF2標(biāo)志不會產(chǎn)生中斷。6.5.2.3波特率發(fā)生器模式寄存器T2CON的位TCLK和RCLK允許從定時器l或定時器2獲得串行口發(fā)送和接收的波特率。當(dāng)TCLK=0時,選用定時器1作為串行口發(fā)送波特率發(fā)生器;當(dāng)TCLK=1時,選用定時器2作為串行口發(fā)送波特率發(fā)生器。RCLK對串行口接收波特率有同樣的作用。通過這兩位,串行口能得到不同的接收和發(fā)送波特率:一個通過定時器l產(chǎn)生,另一個通過定時器2產(chǎn)生。當(dāng)定時器2工作在波特率發(fā)生器模式時,與自動重裝模式相似,當(dāng)TH2溢出時,波特率發(fā)生器模式使定時器2寄存器重新裝載來自寄存器RCAP2H和RCAP2L的16位的值,寄存器RCAP2H和RCAP2L的值由軟件預(yù)置。當(dāng)定時器2工作于模式1和模式3時,波特率由定時器2的溢出率決定:定時器可配置成“定時”或“計數(shù)”方式,在許多應(yīng)用上,定時器被設(shè)置在“定時”方式(C/T2*=0)。當(dāng)定時器2作為定時器時,它的操作不同于波特率發(fā)生器。通常定時器2作為定時器,會在每個機器周期遞增(1/12振蕩頻率)。當(dāng)定時器2作為波特率發(fā)生器時,將以振蕩頻率遞增(12時鐘模式時為l/2振蕩頻率),因此,波特率公式如下:
(RCAP2H,RCAP2L)=RCAP2H和RCAP2L的內(nèi)容,為16位無符號整數(shù)。表6-3由定時器2產(chǎn)生的常用波特率波特率振蕩器頻率定時器212MHz時鐘模式RCAP2HRCAP2L375K12MHzFFFF9.6K12MHzFFD94.8K12MHzFFB22.4K12MHzFF641.2K12MHzFEC830012MHzFB1E11012MHzF2AF3006MHzFD8F1106MHzF9576.5.2.4波特率公式匯總定時器2工作在波特率發(fā)生器模式,外部時鐘信號由T2引腳進入,波特率為:如果定時器2采用內(nèi)部時鐘信號,則波特率為:此處n=32(12時鐘模式)或16(6時鐘模式)。
fosc一振蕩器頻率。自動重裝值可由下式得到:RCAP2H,RCAP2L=65536-[fosc/(32X波特率)]。6.5.3T2的設(shè)置表6-4T2作為定時器模式T2CON內(nèi)部控制(注1)外部控制(注2)16位重裝00H08H16位捕獲01H09H波特率發(fā)生器接收和發(fā)送相同波特率34H36H只接收24H26H只發(fā)送14H16H表6-5T2作為計數(shù)器模式TMOD內(nèi)部控制(注1)外部控制(注2)16位02H0AH自動重裝03H0BH注:(1)僅當(dāng)定時器溢出時進行捕獲和重裝;
(2)當(dāng)定時/計數(shù)器溢出且T2EX(P1.1)發(fā)生電平負(fù)跳變時產(chǎn)生捕獲和重裝(定時器2用于波特率發(fā)生器模式時除外)。5.2.4可編程時鐘輸出52系列的單片機,可以設(shè)定定時/計數(shù)器2,通過P1.0輸出時鐘信號。Pl.0除作為通用I/O口外,還有兩個功能可供選用,即用于定時/計數(shù)器2的外部計數(shù)輸入和定時/計數(shù)器2時鐘信號輸出,圖6-20時鐘輸出方式下的定時器T2結(jié)構(gòu)。通過軟件對T2CON.1位C/T2復(fù)位為0,對T2MOD.1位T20E置1就可將定時/計數(shù)器2選為時鐘信號發(fā)生器,而T2CON.2位TR2控制時鐘信號開始或結(jié)束(TR2為啟停控制位)。由主振頻率(fosc)和定時/計數(shù)器2定時、自動重裝入方式的計數(shù)初值來決定時鐘信號的輸出頻率,其設(shè)置公式如下:圖6-20時鐘輸出方式下的定時器T2結(jié)構(gòu)例6-11P1.0輸出頻率8-99Hz的可調(diào)方波用定時器T2來做(12M晶振),初始值為50Hz的相當(dāng)于20ms周期。仿真效果見圖6-21。//========================================================//系統(tǒng)初始頻率為50Hz的方波相當(dāng)于20ms周期,用定時器來做12M晶振下定時//頻率從8Hz--99Hz可調(diào)節(jié),所以可以做如下參考程序://========================================================#include<reg52.h>unsignedcharcodeLEDcode[]=//定義"0--F"十六個數(shù)據(jù)的共陰極LED七段顯示碼
{0x3
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年濟寧道路運輸從業(yè)人員資格考試內(nèi)容有哪些
- 2025年綏化道路運輸從業(yè)資格證模擬考試年新版
- 《虎年春節(jié)模板》課件
- 城市綠化養(yǎng)護服務(wù)招投標(biāo)模板
- 廣州市二手房按揭合同簽訂指南
- 教育設(shè)施租賃協(xié)議
- 智能化施工合同住宅小區(qū)改造
- 城市綠化帶建設(shè)室外施工合同
- 旅行社暖氣管道維修施工合同
- 學(xué)校綜合樓建設(shè)項目可行性研究報告
- 小學(xué)總復(fù)習(xí)-非連續(xù)性文本
- 功能醫(yī)學(xué)與健康管理課件
- 硬件研發(fā)工程師生涯人物訪談報告
- 教師一對一廉潔談話記錄
- 課本劇西門豹治鄴劇本
- 下肢靜脈血栓形成全解課件
- 宿舍危險源識別和風(fēng)險評價表范例
- 《尖子生培養(yǎng)》課件
- 特種設(shè)備(承壓類)生產(chǎn)單位安全風(fēng)險管控(日管控、周排查、月調(diào)度)清單
- 網(wǎng)絡(luò)傳播法規(guī)(自考14339)復(fù)習(xí)必備題庫(含答案)
評論
0/150
提交評論