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