版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、重點內(nèi)容:輸入\輸出控制中斷系統(tǒng)定時/計數(shù)器本章小結(jié),第7章 C51單片機(jī)的內(nèi)部資源,一、輸入\輸出控制,單片機(jī)I/O 口即輸入/輸出接口,它可對開關(guān)量進(jìn)行檢測、判斷、處理,從而去控制開關(guān)量設(shè)備。單片機(jī)I/O 口是單片機(jī)與外界發(fā)生聯(lián)系的窗口,只有了解和掌握I/O 口的特點、性能、原理,才能真正發(fā)揮I/O 口的功能,才能使單片機(jī)作為一種嵌入式微控制器,應(yīng)用到各種領(lǐng)域,發(fā)揮單片機(jī)的功能。下面是reg51.h和reg52.h中并行
2、I/O口的定義。使用I/O口時,不用關(guān)心I/O口的具體地址,直接使用P0、P1、P2、P3這些變量名就可以了。sfr P0 = 0x80; /*8位I/O口P0*/sfr P1 = 0x90; /*8位I/O口P1*/sfr P2 = 0xA0; /*8位I/O口P2*/sfr P3 = 0xB0; /*8位I/O口P3*/在I/O口直接用做輸入/輸出時,CPU既可以
3、把它們看做數(shù)據(jù)口,也可以看做狀態(tài)口,這是由用戶決定的。在前面我們介紹的流水燈就是一個很好的例子。這里不再贅述。下面看是有關(guān)I/O應(yīng)用的例子。,一、輸入\輸出控制,【例7-1】I/O應(yīng)用設(shè)計一電路,監(jiān)視某開關(guān)K,用發(fā)光二極管LED顯示開關(guān)狀態(tài),如果開關(guān)合上,LED燈亮;否則,LED等滅。分析:設(shè)計電路圖如圖7.1所示。開關(guān)接在P1.4口,LED燈接在P1.0口,當(dāng)開關(guān)斷開時,P1.4為Vcc,對應(yīng)數(shù)字量為“1”,開關(guān)合上時,P1.1電
4、平為0,對應(yīng)數(shù)字量為“0”。根據(jù)LED的解法,當(dāng)P1.0輸出為“0”時,LED燈亮,反之輸出為“1”時,燈則熄滅。程序清單如下:用C 語言編程如下:,一、輸入\輸出控制,#include sbit p1_0=P1^0;sbit p1_1=P1^1; /*定義位變量*/void main(){p1_0=0; /*使發(fā)光二極管滅*/for(;;){ p1_1=1; if (p1_1==0)
5、p1_0=1; else p1_0=0;} },二、中斷系統(tǒng),首先有關(guān)中斷的幾個基本概念。1.中斷所謂中斷,是指CPU在正常運行程序時,由于內(nèi)部/外部事件或由程序預(yù)先安排的事件,引起CPU中斷正在運行的程序,而轉(zhuǎn)到為內(nèi)部/外部事件或為預(yù)先安排的事件服務(wù)的程序中去,服務(wù)完畢,再返回去執(zhí)行波暫時中斷的程序。2. 中斷源中斷源即引起中斷的原因,中斷申請的來源,中斷源可以是I/O設(shè)備、故障、時鐘、調(diào)試中人為設(shè)置。3.中斷優(yōu)先級和
6、中斷的嵌套當(dāng)有多個中斷源同時 向CPU申請中斷時,CPU優(yōu)先響應(yīng)最需緊急處理的中斷請求,處理完畢再響應(yīng)優(yōu)先級別較低的 ,這種預(yù)先安排的響應(yīng)次序就叫做中斷優(yōu)先級。值得一提的是,在中斷系統(tǒng)中,高優(yōu)先級的中斷請求能中斷正在進(jìn)行的較低級的中斷源處理,我們把這叫做中斷的嵌套。,1、中斷的基本概念,二、中斷系統(tǒng),4. 中斷系統(tǒng)能實現(xiàn)中斷功能并能對中斷進(jìn)行管理的硬件和軟件稱為中斷系統(tǒng)。中斷請求是在執(zhí)行程序的過程中隨機(jī)發(fā)生的,中斷系統(tǒng)要解決的問題
7、是:(1)CPU在不斷地執(zhí)行指令中,是如何檢測到隨機(jī)發(fā)生的中斷請求的?(2)如何使中斷的雙方(CPU方和中斷源方)均能人為控制——允許中斷或禁止中斷?(3)由于中斷產(chǎn)生的隨機(jī)性,因此不可能在程序中使用調(diào)用子程序指令或轉(zhuǎn)移指令,那么如何在實現(xiàn)正確的轉(zhuǎn)移,從而更好地為該中斷源服務(wù)呢?(4)中斷源有多個,而CPU只有一個,當(dāng)有多個中斷源同時有中斷請求時,用戶怎么控制CPU按照自己的需要安排響應(yīng)次序?(5)中斷服務(wù)完畢,如何正確地返回
8、到原斷點處?,1、中斷的基本概念,二、中斷系統(tǒng),51單片機(jī)有5個中斷源,3個在片內(nèi),2個在片外,它們在程序存貯器中有固定的中斷入口地址, 當(dāng)CPU響應(yīng)中斷時,硬件自動形成這些地址,由此進(jìn)入中斷服務(wù)程序;5個中斷源有兩級中斷優(yōu)先級,可形成中斷嵌套;這6個中斷源的符號、名稱、產(chǎn)生條件及中斷服務(wù)程序的入口地址如表7-1。,2、中斷源及其中斷的入口地址,二、中斷系統(tǒng),1. 中斷允許控制寄存器IE(地址0A8H)每個中斷源都可以通過置位或清除中
9、斷允許寄存器IE 中的相關(guān)中斷允許控制位分別使得中斷源有效或無效。IE還包括一個中斷允許總控制位EA,它能一次禁止所有中斷。中斷允許寄存器格式如下表7-2。,3、中斷控制相關(guān)的寄存器,二、中斷系統(tǒng),2.定時器/計數(shù)器控制寄存器(TCON)(地址88H)該寄存器用于保存外部中斷請求以及定時器的計數(shù)溢出。寄存器的內(nèi)容及位地址表7-3如下:,3、中斷控制相關(guān)的寄存器,二、中斷系統(tǒng),3.串行口控制寄存器(SCON)(98H)串行口控制寄存器
10、與中斷有關(guān)的控制位共2位,如表7-4所示,3、中斷控制相關(guān)的寄存器,二、中斷系統(tǒng),4. 中斷優(yōu)先級寄存器IP(地址8BH)單片機(jī)采用了自然優(yōu)先級和人工設(shè)置高、低優(yōu)先級的策略,即可以由程序員設(shè)定那些中斷是高優(yōu)先級、哪些中斷是低優(yōu)先級。AT89S52可設(shè)置兩個中斷優(yōu)先級,必有一些中斷處于同一級別,處于同一級別的,就由自然優(yōu)先級確定。六個中斷源的自然優(yōu)先級(由高到低排列)為:外部中斷0->定時器0中斷->外部中斷1->定時器1中斷->
11、串口中斷->定時器2中斷。中斷優(yōu)先級由中斷優(yōu)先級寄存器IP(見表7-5)來設(shè)置的,IP中某位設(shè)為1,相應(yīng)的中斷就是高優(yōu)先級,否則就是低優(yōu)先級。,3、中斷控制相關(guān)的寄存器,二、中斷系統(tǒng),單片機(jī)在每個機(jī)器周期的S5P2期間,順序采樣每個中斷源,CPU在下一個機(jī)器周期S6期間按優(yōu)先級順序查詢中斷標(biāo)志,如查詢到某個中斷標(biāo)志為1,將在再下一個機(jī)器周期S1期間按優(yōu)先級進(jìn)行中斷處理。中斷得到響應(yīng)后自動清除中斷標(biāo)志,由硬件將程序計數(shù)器PC內(nèi)
12、容壓入堆棧保護(hù),然后將對應(yīng)的中斷矢量裝入程序計數(shù)器PC,使程序轉(zhuǎn)向中斷矢量地址單元中去執(zhí)行相應(yīng)的中斷服務(wù)程序。 在下列三種情況之一時,CPU將封鎖對中斷的響應(yīng):(1)CPU正在處理一個同級或更高級別的中斷請求。(2)現(xiàn)行的機(jī)器周期不是當(dāng)前正執(zhí)行指令的最后一個周期。我們知道,單片機(jī)有單周期、雙周期、三周期指令,當(dāng)前執(zhí)行指令是單字節(jié)沒有關(guān)系,如果是雙字節(jié)或四字節(jié)的,就要等整條指令都執(zhí)行完了,才能響應(yīng)中斷(因為中斷查詢是在每個機(jī)器周期都
13、可能查到的)。(3)當(dāng)前正執(zhí)行的指令是返回指令(RETI)或訪問IP、IE寄存器的指令,則CPU至少再執(zhí)行一條指令才應(yīng)中斷。這些都是與中斷有關(guān)的,如果正訪問IP、IE則可能會開、關(guān)中斷或改變中斷的優(yōu)先級,而中斷返回指令則說明本次中斷還沒有處理完,所以都要等本指令處理結(jié)束,再執(zhí)行一條指令才可以響應(yīng)中斷。,4、中斷響應(yīng)過程,二、中斷系統(tǒng),具體地說,CPU響應(yīng)中斷的過程分為以下幾個步驟:(1) 保護(hù)斷點,即保存下一將要執(zhí)行的指令的地址,就
14、是把這個地址送入堆棧。(2) 尋找中斷入口,根據(jù)6個不一樣的中斷源所產(chǎn)生的中斷,查找6個不一樣的入口地址。這6個中斷源的編號和入口地址如表7-6所示各中斷服務(wù)程序入口地址僅間隔8字節(jié),編譯器在這些地址放入無條件轉(zhuǎn)移指令,跳轉(zhuǎn)到服務(wù)程序的實際地址。。以上工作是由計算機(jī)自動完成的,與編程者無關(guān)。(3) 執(zhí)行中斷處理程序。(4) 中斷返回:執(zhí)行完中斷指令后,就從中斷處返回到主程序,繼續(xù)執(zhí)行。,4、中斷響應(yīng)過程,二、中斷系統(tǒng),5、C51
15、中斷的程序設(shè)計,C51使用戶能編寫高效的中斷服務(wù)程序,編譯器在規(guī)定的中斷源的矢量地址中放入無條件轉(zhuǎn)移指令,使CPU響應(yīng)中斷后自動地從矢量地址跳轉(zhuǎn)到中斷服務(wù)程序的實際地址,而無需用戶去安排。中斷服務(wù)程序定義為函數(shù),函數(shù)的完整定義如下: 返回值 函數(shù)名([參數(shù)])[模式][再入]interrupt n[using m]下面分別介紹后面3個參數(shù):再入:通過屬性關(guān)鍵字reentrant將函數(shù)定義為再入函數(shù),這樣函數(shù)才能才能遞歸調(diào)用。
16、這是因為在C51中,普通函數(shù)(非再入的)不能遞歸調(diào)用, 只有再入函數(shù)才可被遞歸調(diào)用。interrupt n :表示將函數(shù)聲明為中斷服務(wù)函數(shù),n 為中斷源編號,它可以是0~31間的整數(shù) ,不允許為帶運算符的表達(dá)式。n 通常取以下值:0 外部中斷0;1 定時器/計數(shù)器0溢出中斷2 外部中斷1;3 定時器/計數(shù)器1溢出中斷4 串行口發(fā)送與接收中斷,二、中斷系統(tǒng),5、C51中斷的程序設(shè)計,Using m:定
17、義函數(shù)所使用的工作寄存器組,m的取值范圍為0~3,可缺省,它對目標(biāo)代碼有如下作用:函數(shù)入口處將當(dāng)前寄存器保存,使用m指定的寄存器組,函數(shù)退出時原寄存器組恢復(fù)。選不同的工作寄存器組,可方便實現(xiàn)寄存器組的現(xiàn)場保護(hù)。值得注意的是,中斷服務(wù)函數(shù)不允許用于外部函數(shù),因為它對目標(biāo)代碼有下面這些影響:①當(dāng)調(diào)用函數(shù)時,SFR中的ACC、B、DPH、DPL和PSW實際需要時應(yīng)該入棧。②如果不使用寄存器組切換,中斷函數(shù)所需的所有工作寄存器Rn都
18、入棧。③函數(shù)退出前,所有工作寄存器出棧。④函數(shù)由“RETI”指令終止?!纠?-2】中斷應(yīng)用要求:電路原理圖如圖7.2所示。每按一次鍵,產(chǎn)生一次中斷,P1口輸出并取反,用C語言編程如下:,二、中斷系統(tǒng),5、C51中斷的程序設(shè)計,//按鍵中斷程序#includemain(){ P1=0x55;//P1口初始值 EA=1;//全局中斷開 EX0=1;//外部中斷0開 IT0=1;//低電平產(chǎn)生中斷 whil
19、e(1); //等待中斷,也是中斷的返回點 }void Izdcs(void) interrupt 0 using 1{ P1=~P1;//按下觸發(fā)一次,P1取反一次},二、中斷系統(tǒng),5、C51中斷的程序設(shè)計,【例7-3】 利用中斷來點亮燈。硬件電路圖如圖7.2,用INT1 引腳的按鈕控制P1口的燈,要求每按一下按鈕就申請一次中斷,點亮一盞燈,依次點亮八盞燈中的一盞。采用邊沿觸發(fā)。程序如下:#include
20、bit flag; /*中斷申請標(biāo)志*/unsigned char ledstatus;/*每一位分別對應(yīng)P1口燈亮狀態(tài),用于計算*/void int1_isr (void) interrupt 2 /*INT1的中斷服務(wù)程序*/{ flag = 1;} void main (void) { /*初始化燈*/P1 = 0xFF;/*初始化P1口的八盞燈,全滅*/ledstatus =
21、0x01;/*第一次是P1.0口的燈亮*//*初始化中斷相關(guān)的寄存器*/EX1 = 1; /*允許 EX1 中斷*/IT1 = 1; /*邊沿觸發(fā) */EA = 1; /*允許總中斷*/ while (1) { if(flag) { P1 = (~ledstatus);/*取反,因為低電平時燈亮*/ ledstatus = (ledstatus << 1
22、) ;/*下一次中斷時燈的狀態(tài)*/ flag = 0;/*處理完成清標(biāo)志*/ }} },二、中斷系統(tǒng),5、C51中斷的程序設(shè)計,【例7-4】多中斷源控制燈采用圖7.3的硬件電路圖,要求每按一下INT1 引腳的按鈕就依次點亮八盞燈中的一盞,而每按一下INT0 就使燈的亮滅變?yōu)橄喾吹臓顟B(tài),INT1 為最高優(yōu)先級。均采用邊沿觸發(fā)。,二、中斷系統(tǒng),5、C51中斷的程序設(shè)計,因為INT1 的自然優(yōu)先級比INT0
23、低,如果我們想讓INT1 為高優(yōu)先級,就要設(shè)置中斷優(yōu)先級寄存器為0x04。程序如下:#include unsigned char ledstatus;/*對應(yīng)P1口的燈亮狀態(tài),用于計算*/void delay(void) /*延時子程序*/{ int x,y; for(x=0; x<100; x++) for(y=0; y<5000; y++); }void int1_i
24、sr (void) interrupt 2 /*INT1的中斷服務(wù)程序*/{ P1 = (~ledstatus);/*取反,因為低電平時燈亮*/ delay();/*延時*/ ledstatus = (ledstatus << 1) ; /*下一次中斷時燈的狀態(tài)*/ flag1 = 0;/*處理完成清標(biāo)志*/},二、中斷系統(tǒng),5、C51中斷的程序設(shè)計,void int0_is
25、r (void) interrupt 0 /*INT0的中斷服務(wù)程序*/{ flag0 = 1; P1 = ~P1;/*燈由亮變滅或由滅變亮*/delay();/*延時*/flag0 = 0;/*處理完成清標(biāo)志*/}void main (void) { /*初始化中斷相關(guān)的寄存器*/IP = 0x04;/*設(shè)INT1為高優(yōu)先級*/EX1 = 1; /
26、*允許 EX1 中斷*/EX0 = 1;/*允許 EX0 中斷*/IT1 = 0; /*INT1低電平觸發(fā) */IT0 = 0; /*INT0低電平觸發(fā) */EA = 1; /*允許總中斷*/ ledstatus = 0x01;/*按下INT1開關(guān)時,第一次是P1.0口的燈亮*/while (1) { P1 = 0xff;/*復(fù)位P1口的八盞燈,全滅*/}
27、 },三、定時/計數(shù)器,1、定時/計數(shù)器的結(jié)構(gòu)和工作方式,51系列單片機(jī)片內(nèi)有二個十六位定時/計數(shù)器:定時器0(T0)和定時器1(T1)。定時器T1有寄存器TH1、TL1組成,定時器T0由寄存器TH0、TL1組成,他們均為8位寄存器。圖7.4是定時器T0的內(nèi)部結(jié)構(gòu)和控制信號。定時器T1也是一樣。T0和T1由如下功能:●兩個定時器都有定時或事件計數(shù)的功能,由軟件選擇是定時工作方式還是計數(shù)工作方式 ●定時/計數(shù)器實際上
28、是16位加1計數(shù)器。 T0由2個8位持殊功能寄存器TH0和TL0構(gòu)成,T1由2個8位持殊功能寄存TH1和TL1構(gòu)成?!馮0和T1受特殊功能寄存器TMOD和TCON控制。對于一些增強(qiáng)型的單片機(jī)中,增加了定時器2(T2)。T2除了具有T1,T0的計數(shù)功能外,還有16位自動重裝載、捕獲方式和加、減計數(shù)方式。定時器0和定時器1實質(zhì)上是一個加1計數(shù)器,他可以工作于定時方式,也可以工作于計數(shù)方式。兩種工作方式實際都是對脈沖計數(shù),只
29、不過所計脈沖的來源不同。,三、定時/計數(shù)器,1、定時/計數(shù)器的結(jié)構(gòu)和工作方式,1.定時方式C/T =0,開關(guān)S打向上,計數(shù)器TH0、TL0的計數(shù)脈沖來自振蕩器的12分頻后的脈沖(即fosc/12),即對系統(tǒng)的機(jī)器周期計數(shù)。當(dāng)開關(guān)K受控合上時,每過一個機(jī)器周期,計數(shù)器TH0,TL0加1;當(dāng)計數(shù)了預(yù)設(shè)的個數(shù),TH0,TL0回零,置位定時/計數(shù)器溢出中斷標(biāo)志位TF0(或TF1),產(chǎn)生溢出中斷。例如,機(jī)器周期為2us,計滿了3個機(jī)器周期即定
30、時了6us,中斷標(biāo)志位TF0(或TF1)被置位。如果允許中斷,產(chǎn)生溢出中斷。由于51單片機(jī)的定時/計數(shù)器是加1計數(shù),預(yù)定計數(shù)初值應(yīng)載入負(fù)值(補(bǔ)碼),TH0,TL0才可能加1回零。定時時計數(shù)脈沖的最高頻率為f= fosc/12。,三、定時/計數(shù)器,1、定時/計數(shù)器的結(jié)構(gòu)和工作方式,2.計數(shù)方式C/T =1,開關(guān)S打向上,計數(shù)器T0,T1的計數(shù)脈沖分別來自于引腳T0(P3.4)或引腳T1(P3.5)上的外部脈沖。當(dāng)開關(guān)K受控合上時,計數(shù)
31、器對此外部脈沖的下降沿進(jìn)行加1計數(shù),直至計滿預(yù)定值回零,置位定時/計數(shù)器中斷標(biāo)志位TF0(或TF1),產(chǎn)生溢出中斷。由于檢測一個由“1”到“0”的跳變需兩個機(jī)器周期,前一個機(jī)器周期測出“1”,后一個機(jī)器周期測出“0”,故計數(shù)脈沖的最高頻率不得超過fosc/24。對外部脈沖的占空比無特殊要求。當(dāng)軟件設(shè)定了定時/計數(shù)器的工作方式,啟動以后,定時/計數(shù)器就按規(guī)定的方式工作,不占用CPU的操作時間。此時CPU可執(zhí)行其他程序,除非定時/計數(shù)
32、器溢出,才可能中斷CPU執(zhí)行的程序。這種工作的方式如同人類的所設(shè)的鬧鐘一樣,人在工作或睡覺的時候,鬧鐘仍然繼續(xù)運走,到了設(shè)定鬧鐘,就會響。,三、定時/計數(shù)器,2、定時/計數(shù)器的寄存器,1.T/C0和T/C1的寄存器定時/計數(shù)器0和定時/計數(shù)器1是所有51系列單片機(jī)都具有的功能,對它們的控制是通過定時/計數(shù)器控制寄存器TCON和定時/計數(shù)器模式寄存器TMOD來實現(xiàn)。(1)定時/計數(shù)器模式寄存器TMOD定時/計數(shù)器模式寄存器
33、TMOD主要用來設(shè)置定時/計數(shù)器的工作模式,它的地址是89H,不能進(jìn)行位尋址,只能用字節(jié)傳送指令設(shè)置定時器工作方式,復(fù)位時,TMOD所有位均為0。每一位的定義見表7-7,高四位與定時/計數(shù)器1有關(guān),低四位與定時/計數(shù)器0有關(guān)。,三、定時/計數(shù)器,2、定時/計數(shù)器的寄存器,GATE :定時操作開關(guān)控制位,當(dāng)GATE=1時,INT0或INT1引腳為高電平,同時TCON中的TR0或TR1控制位為1時,定時/計數(shù)器0或1才開始工作。若GATE=
34、0,則只要將TR0或TR1控制位設(shè)為1,計時/計數(shù)器0或1就開始工作。C/T :定時器或計數(shù)器功能的選擇位。C/T =1為計數(shù)器,通過外部引腳T0或T1輸入計數(shù)脈沖。C/T =0時為定時器,由內(nèi)部系統(tǒng)時鐘提供計時工作脈沖。M1和M0:分別是模式選擇位的高位和低位,通過它們對定時/計數(shù)器的工作模式進(jìn)行設(shè)置,見表7-8。,三、定時/計數(shù)器,2、定時/計數(shù)器的寄存器,(2)定時/計數(shù)器控制寄存器TCON定時/計數(shù)器控制寄存器TCON的
35、地址是88H,可位尋址。該寄存器除了用作定時/計數(shù)器控制寄存器之外,還有幾位與中斷有關(guān),我們在前面已介紹過。每一位的定義見表7-9。,三、定時/計數(shù)器,2、定時/計數(shù)器的寄存器,2.T/C2的寄存器與T/C2相關(guān)的寄存器有控制寄存器T2CON和方式寄存器T2MOD。(1)定時/計數(shù)器2控制寄存器T2CON定時/計數(shù)器2控制寄存器T2CON用來對其進(jìn)行設(shè)置。T2CON的地址為0C8H,可位尋址,復(fù)位值是0000 0000B,寄存器每
36、一位的定義見表7-10。,三、定時/計數(shù)器,2、定時/計數(shù)器的寄存器,定時/計數(shù)器2既可以做定時器,又可以做事件計數(shù)器。其工作方式由特殊寄存器T2CON中的C/T2 位選擇。定時/計數(shù)器2有三種工作方式:捕獲方式,自動重裝載(向上或向下計數(shù))方式和波特率發(fā)生器方式,工作方式由T2CON的控制位RCLK,TCLK,CP/RL2 ,TR2來選擇,參見表7-11。,三、定時/計數(shù)器,2、定時/計數(shù)器的寄存器,(2)定時/計數(shù)器2模式寄存器T2
37、MOD當(dāng)定時器2 工作于16 位自動重載模式,可對其編程實現(xiàn)向上計數(shù)或向下計數(shù)。這一功能可以通過定時/計數(shù)器2模式寄存器T2MOD(見表7-12)中的DCEN(向下計數(shù)允許位)來實現(xiàn)。T2MOD的地址是0C9H,不可位尋址。,三、定時/計數(shù)器,3、定時/計數(shù)器的工作方式,1.方式0方式0是13位計數(shù)結(jié)構(gòu)的工作方式,其計數(shù)器由TH0全部8位和TL0的低5位構(gòu)成。當(dāng)TL0的低5位計數(shù)溢出時,向TH0進(jìn)位,而全部13位計數(shù)溢出時,則向
38、計數(shù)溢出標(biāo)志位TF0進(jìn)位。 在方式0下,當(dāng)為計數(shù)工作方式時,計數(shù)值的范圍是:1~8192(213);當(dāng)為定時工作方式時,定時時間的計算公式為: (213-計數(shù)初值)×晶振周期×12 或 (213-計數(shù)初值)×機(jī)器周期 其時間單位與晶振周期或機(jī)器周期相同(ms)。,三、定時/計數(shù)器,3、定時/計數(shù)器的工作方式,2.方式1方式1是16位計數(shù)結(jié)構(gòu)的工作方式,計數(shù)
39、器由TH0全部8位和TL0全部8位構(gòu)成。與工作方式0基本相同,區(qū)別僅在于工作方式1的計數(shù)器TL1和TH1組成16位計數(shù)器,從而比工作方式0有更寬的定時/計數(shù)范圍。當(dāng)為計數(shù)工作方式時,計數(shù)值的范圍是: 1~65536(216) 當(dāng)為定時工作方式時,定時時間計算公式為: (216-計數(shù)初值)×晶振周期×12或 (216-計數(shù)初值)×機(jī)器周期,三
40、、定時/計數(shù)器,3、定時/計數(shù)器的工作方式,3.方式2 8位自動裝入時間常數(shù)方式。由TLl構(gòu)成8位計數(shù)器,THl僅用來存放時間常數(shù)。啟動T1前,TLl和THl裝入相同的時間常數(shù),當(dāng)TL1計滿后,除定時器回零標(biāo)志TFl置位,具有向CPU請求中斷的條件外,THl中的時間常數(shù)還會自動地裝入TLl,并重新開始定時或計數(shù)。所以,工作方式2是一種自動裝入時間常數(shù)的8位計數(shù)器方式。由于這種方式不需要指令重裝時間常數(shù),因而操作方便,在允許的條
41、件下,應(yīng)盡量使用這種工作方式。當(dāng)然,這種方式的定時/計數(shù)范圍要小于方式0和方式1。當(dāng)計數(shù)溢出后,不是像前兩種工作方式那樣通過軟件方法,而是由預(yù)置寄存器TH以硬件方法自動給計數(shù)器TL重新加載。變軟件加載為硬件加載。 初始化時,8位計數(shù)初值同時裝入TL0和TH0中。當(dāng)TL0計數(shù)溢出時,置位TF0,同時把保存在預(yù)置寄 存器TH0中的計數(shù)初值自動加載TL0,然后TL0重新計數(shù)。如此重復(fù)不止。這不但省去了用戶程序中的重裝指令,而且也有利
42、于提高定時精度。但這種工作方式下是8位計數(shù)結(jié)構(gòu),計數(shù)值有限,最大只能到255。 這種自動重新加載工作方式非常適用于循環(huán)定時或循環(huán)計數(shù)應(yīng)用,例如用于產(chǎn)生固定脈寬的脈沖,此外還可以作串行數(shù)據(jù)通信的波特率發(fā)送器使用。,三、定時/計數(shù)器,3、定時/計數(shù)器的程序設(shè)計,4.方式3 2個8位方式。方式3只適用于定時器0。如果使定時器1為工作方式3,則定時器1將處于關(guān)閉狀態(tài)。 當(dāng)T0為工作方式3時,TH0和TL0分成2個獨立的
43、8位計數(shù)器。其中,TL0既可用作定時器,又可用作計數(shù)器,并使用原T0的所有控制位及其定時器回零標(biāo)志和中斷源。TH0只能用作定時器,并使用T1的控制位TRl、回零標(biāo)志TFl和中斷源,見下圖。通常情況下,T0不運行于工作方式3,只有在T1處于工作方式2,并不要求中斷的條件下才可能使用。這時,T1往往用作串行口波特率發(fā)生器(見1.4),TH0用作定時器,TL0作為定時器或計數(shù)器。所以,方式3是為了使單片機(jī)有1個獨立的定時器/計數(shù)器、1個定時
44、器以及1個串行口波特率發(fā)生器的應(yīng)用場合而特地提供的。這時,可把定時器l用于工作方式2,把定時器0用于工作方式3。,三、定時/計數(shù)器,4、定時/計數(shù)器的程序設(shè)計,由于定時器/計數(shù)器的功能是由軟件編程確定的,所以一般在使用定時/計數(shù)器前都要對其進(jìn)行初始化,使其按設(shè)定的功能工作。初始化的步驟一般如下:(1)確定工作方式(即對TMOD賦值);(2)預(yù)置定時或計數(shù)的初值(可直接將初值寫入TH0、TL0或TH1、TL1);(3)根據(jù)需要開放定
45、時器/計數(shù)器的中斷(直接對IE位賦值);(4)啟動定時器/計數(shù)器(若已規(guī)定用軟件啟動,則可把TR0或TR1置“1”;若已規(guī)定由外中斷引腳電平啟動,則需給外引腳步加啟動電平。當(dāng)實現(xiàn)了啟動要求后,定時器即按規(guī)定的工作方式和初值開始計數(shù)或定時)。因為在不同工作方式下計數(shù)器位數(shù)不同,因而最大計數(shù)值也不同?,F(xiàn)假設(shè)最大計數(shù)值為M,那么各方式下的最大值M值如下:方式0:M=213=8 192方式1:M=216=65 536方式2:M=28=
46、256方式3:定時器0分成兩個8位計數(shù)器,所以兩個M均為256。因為定時器/計數(shù)器是作“加1”計數(shù),并在計數(shù)滿溢出時產(chǎn)生中斷,因此初值X可以這樣計算: X=M-計數(shù)值,三、定時/計數(shù)器,4、定時/計數(shù)器的程序設(shè)計,【例7-5】在XTAL頻率是12MHz的標(biāo)準(zhǔn)8051器件上,用Timer1產(chǎn)生10kHz定時器滴答中斷。 分析:利用T1來產(chǎn)生10kHz的滴答中斷,也就是長生周期為100us的滴答中斷。因為時鐘頻率為12MHZ,采用方式
47、2,先計算計數(shù)初值: 機(jī)器周期 MC=12/ fosc=12/12=1us; 應(yīng)計脈沖個數(shù) 100us/1us=100程序如下:#include static unsigned long overflow_count = 0;/*定時器1中斷服務(wù)程序:每100個時鐘周期執(zhí)行1次*/void timer1_ISR (void) interrupt 3{overflow_count ++; /*溢
48、出計數(shù)器加1*/}/*主函數(shù):置定時器1為8位定時器重裝(方式2)定時器計數(shù)到255時溢出,用156重裝并產(chǎn)生中斷*/void main (void){TMOD = (TMOD & 0x0F) | 0x20; /*設(shè)置方式(8位定時器)*/TH1 = 256 – 100; /*重裝TL1來計數(shù)100個時鐘周期*/TL1 = TH1;ET1 = 1;
49、 /*允許定時器1中斷*/TR1 = 1; /*啟動定時器1運行*/EA = 1; /*總中斷允許*/while (1); /*無限循環(huán),等待定時器溢出中斷*/},三、定時/計數(shù)器,4、定時/計數(shù)器的程序設(shè)計,【例7-7】如圖7.5所示,在P1.7端接有一個發(fā)光二極管,要求利用定時/計數(shù)器控制,使LED亮1s,來1s,周而復(fù)始。分析:
50、題目要求定時1s,定時器的3種工作方式都不能滿足。對于較長時間的定時,應(yīng)采用復(fù)合定時的方法。這里使定時/計數(shù)器0工作在定時器方式1,定時100ms,定時時間到后P1.0反相,即P1.0端輸出周期200ms和方波脈沖。另設(shè)定時/計數(shù)器1工作在計數(shù)器方式2,對T1輸入的脈沖計數(shù),當(dāng)計數(shù)滿5次時,定時1s時間到,將P1.7端反相,改變燈的狀態(tài)。采用6MHz晶振,方式1的最大定時才能達(dá)到100多ms。對于100ms,機(jī)器周期2μs需要的計
51、數(shù)次數(shù)=100×103/2=50 000,即初值為65 536-50 000。方式2滿5次溢出中斷,初值為256-5。,三、定時/計數(shù)器,4、定時/計數(shù)器的程序設(shè)計,程序如下:#include sbit P1_0=P1^0;sbit P1_7=P1^7;timer0( )interrupt 1 using 1 /*T/C0中斷服務(wù)程序*/{ P1_0=!P1_0;
52、 /*100ms到,P1.0反相*/ TH0=(65536-50000)/256; /*重載計數(shù)初值*/ TL0=(65536-50000)%256;}timer1( )interrupt 3 using 2 /*定時/計數(shù)器1中斷服務(wù)程序*/{ P1_7=!P1_7;
53、 /*1s到,燈改變狀態(tài)*/},三、定時/計數(shù)器,4、定時/計數(shù)器的程序設(shè)計,main( ) { P1_7=0; /*置燈初始滅*/P1_0=1; /*保證第一次反相便開始計數(shù)*/TMOD=0x61; /*定時/
54、計數(shù)器0方式1定時,定時/計數(shù)器1方式2計數(shù)*/TH0=(65536-50000)/256; /*預(yù)置計數(shù)初值*/TL0=(65536-50000)%256;TH1=256-5;TH0=256-5;IP=0x08; /*置優(yōu)先級寄存器*/EA=1; /*CPU
55、開中斷*/ ET0=1; /*開T/C0中斷*/ET1=1; /*開T/C1中斷*/TR0=1; /*啟動T/C0*/TR1=1; /*啟動T/C1*/ for( ; ; )
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)原理與c51程序設(shè)計--chap11
- 單片機(jī)原理與c51程序設(shè)計--chap03
- 單片機(jī)原理與c51語言程序設(shè)計與基礎(chǔ)教程課后習(xí)題答案
- 單片機(jī)原理與應(yīng)用及c51程序設(shè)計(第二版)課后答案
- c51單片機(jī)課程設(shè)計
- 單片機(jī)原理及應(yīng)用及c51程序設(shè)計第三章習(xí)題答案
- c51單片機(jī)課程設(shè)計
- c51單片機(jī)畢業(yè)設(shè)計
- c51單片機(jī)畢業(yè)設(shè)計
- 51單片機(jī)c語言程序設(shè)計源代碼
- C51單片機(jī)畢業(yè)設(shè)計.doc
- C51單片機(jī)畢業(yè)設(shè)計.doc
- 單片機(jī)c51的特點與使用
- 51單片機(jī)脈沖產(chǎn)生程序設(shè)計
- c51單片機(jī)實戰(zhàn)100例
- 基于c51單片機(jī)設(shè)計
- c51單片機(jī)課程設(shè)計定時鬧鐘
- 基于c51單片機(jī) 溫度計設(shè)計
- c51倒計時程序設(shè)計
- c51單片機(jī)03數(shù)碼管
評論
0/150
提交評論