《單片機(jī)C語(yǔ)言應(yīng)用技術(shù)》課件-第4章_第1頁(yè)
《單片機(jī)C語(yǔ)言應(yīng)用技術(shù)》課件-第4章_第2頁(yè)
《單片機(jī)C語(yǔ)言應(yīng)用技術(shù)》課件-第4章_第3頁(yè)
《單片機(jī)C語(yǔ)言應(yīng)用技術(shù)》課件-第4章_第4頁(yè)
《單片機(jī)C語(yǔ)言應(yīng)用技術(shù)》課件-第4章_第5頁(yè)
已閱讀5頁(yè),還剩111頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

模塊4定時(shí)與中斷系統(tǒng)任務(wù)5定時(shí)亮滅的小燈任務(wù)6人工控制的小燈習(xí)題4任務(wù)5定時(shí)亮滅的小燈

1.任務(wù)目的通過(guò)定時(shí)亮滅的小燈電路的制作和軟件設(shè)計(jì),了解單片機(jī)的定時(shí)/計(jì)數(shù)器系統(tǒng),熟悉定時(shí)/計(jì)數(shù)器的四種工作方式,掌握相關(guān)特殊功能寄存器的含義,掌握定時(shí)/計(jì)數(shù)器的初值計(jì)算和初始化方法。

2.任務(wù)要求控制單片機(jī)P1口所接的8個(gè)LED管,使它們每隔1s亮滅變化一次。

3.電路設(shè)計(jì)定時(shí)亮滅小燈電路設(shè)計(jì)如圖4.1所示。圖4.1定時(shí)亮滅小燈電路

4.程序設(shè)計(jì)硬件電路中選用的晶振為12?MHz,可以用T0的工作方式1定時(shí)50?ms,1?s?=?20?×?50?ms,那么循環(huán)20次,即可達(dá)到定時(shí)1?s的目的,每隔1?s改變一次P1口的值就可實(shí)現(xiàn)。程序如下:

/*利用定時(shí)計(jì)數(shù)器,采用查詢方式實(shí)現(xiàn)P1口燈定時(shí)亮滅*/

#include<reg51.h>

voidtimer1s();//聲明定時(shí)1s的函數(shù)

voidmain()//主函數(shù)

{P1=0xff;

TMOD=0x01;//設(shè)置定時(shí)/計(jì)數(shù)器T0工作于方式1,用于定時(shí)

while(1)//每隔1s改變P1口燈的亮滅狀態(tài)

{voidtimer1s();

P1=~P1;

}

}voidtimer1s() //定義定時(shí)1s的函數(shù){unsignedchari;i=0;

TH0=(65536-5000)/256;//設(shè)置定時(shí)/計(jì)數(shù)器T0的計(jì)數(shù)初值,以確定定時(shí)時(shí)間為50msTL0=(65536-5000)%256;TR0=1; //啟動(dòng)定時(shí)

while(i<=20) //?1s時(shí)間未到

{while(TF0==0); //判斷定時(shí)時(shí)間50ms到了沒(méi)有,沒(méi)有到則等待

i++; //定時(shí)時(shí)間到,累加變量加1TH0=(65536-5000)/256; //重裝計(jì)數(shù)初值

TL0=(65536-5000)%256;TF0=0; //溢出標(biāo)志清零

}}

5.任務(wù)小結(jié)本任務(wù)中利用定時(shí)/計(jì)數(shù)器進(jìn)行定時(shí),與用循環(huán)結(jié)構(gòu)實(shí)現(xiàn)延時(shí)相比,可以實(shí)現(xiàn)精確的定時(shí)。在實(shí)際應(yīng)用中需要精確定時(shí)時(shí),不妨使用定時(shí)/計(jì)數(shù)器來(lái)實(shí)現(xiàn)。4.1C?語(yǔ)?言?函?數(shù)4.1.1C51語(yǔ)言程序的基本結(jié)構(gòu)在C51語(yǔ)言中,一個(gè)較大的程序一般由若干個(gè)小的程序模塊組成,每一個(gè)小的程序模塊用來(lái)實(shí)現(xiàn)一個(gè)特定的功能,這樣小的程序模塊就是由函數(shù)來(lái)完成的。函數(shù)是C語(yǔ)言程序的重要組成部分,使用它可以方便地實(shí)現(xiàn)程序的模塊化設(shè)計(jì),這樣可以使程序結(jié)構(gòu)清晰,可讀性好,而且易于擴(kuò)充。一個(gè)完整的C51程序是由一個(gè)主函數(shù)和若干個(gè)函數(shù)組成的,主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。

C51語(yǔ)言程序的基本結(jié)構(gòu)如表4.1所示。表4.1C51語(yǔ)言程序的基本結(jié)構(gòu)

1.指定頭文件指定頭文件的方式有如下兩種:

#include<頭文件的文件名>

#include"頭文件的文件名"

2.聲明區(qū)聲明區(qū)用于聲明程序之中所使用的常數(shù)、變量、函數(shù),其作用域?qū)U(kuò)展到整個(gè)程序,包括主程序與所有函數(shù)。建議:若程序之中使用到函數(shù),則可在此先聲明所有使用到的函數(shù)。

3.主函數(shù)主函數(shù)分為聲明區(qū)和程序區(qū),在聲明區(qū)里所聲明的常數(shù)、變量等,僅適用于主函數(shù)中,而不影響其他函數(shù)。

4.函數(shù)函數(shù)是一種具有相對(duì)獨(dú)立功能的程序,其結(jié)構(gòu)與主函數(shù)類似。小問(wèn)題在C語(yǔ)言中,自定義的函數(shù)一定要有函數(shù)聲明嗎?答:不是。如果你把自定義函數(shù)寫在主函數(shù)前面,就可不用聲明了,否則聲明是必需的。4.1.2函數(shù)分類從用戶使用角度來(lái)看,C51語(yǔ)言函數(shù)分為兩類:標(biāo)準(zhǔn)函數(shù)和用戶定義函數(shù)。

1.標(biāo)準(zhǔn)函數(shù)標(biāo)準(zhǔn)函數(shù)也稱為標(biāo)準(zhǔn)庫(kù)函數(shù),是系統(tǒng)提供的已設(shè)計(jì)好的函數(shù),用戶不必自己定義這些函數(shù),就可以直接調(diào)用。KEILC51編譯器提供了100多個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù)供用戶使用。標(biāo)準(zhǔn)庫(kù)函數(shù)中的每個(gè)函數(shù)都在相應(yīng)的頭文件(.h)中有原型聲明,因此,如果程序中使用了哪個(gè)庫(kù)函數(shù),在程序開(kāi)頭必須包含相應(yīng)的“.h”頭文件。以下為C51中常用的頭文件:

#include"reg51.h" //?MCS-51寄存器符號(hào)定義

#include"absacc.h" //絕對(duì)地址訪問(wèn)

#include"ctype.h" //字符函數(shù)

#include"string.h" //字符串處理

#include"intrins.h" //指示編譯器產(chǎn)生嵌入式固有代碼的程序原型,如空函數(shù)nop()

#include“math.h”? //數(shù)學(xué)函數(shù)

#include“stdio.h” //輸入輸出流函數(shù)標(biāo)準(zhǔn)庫(kù)函數(shù)的類型選擇考慮到了8051系列單片機(jī)的結(jié)構(gòu)特性,因此和ANSIC語(yǔ)言中的參數(shù)與格式有所不同。在C51標(biāo)準(zhǔn)函數(shù)中,盡可能使用最小的數(shù)據(jù)類型,以最大程度地發(fā)揮程序的性能及減小程序的長(zhǎng)度。如果用bit,則足以引出結(jié)果,就不要采用較大的數(shù)據(jù)類型(如char、int或long等),當(dāng)然也可以進(jìn)一步采用unsigned類型來(lái)提高程序性能。

2.用戶定義的函數(shù)用戶定義的函數(shù)是用戶根據(jù)自己的需要編寫的用來(lái)解決具體問(wèn)題的函數(shù)。用戶定義的函數(shù)必須先定義之后才能被調(diào)用。4.1.3函數(shù)定義函數(shù)定義的一般格式為類型說(shuō)明符函數(shù)名(形式參數(shù)表)

{

局部變量定義;函數(shù)體語(yǔ)句;

}“類型說(shuō)明符”用于說(shuō)明函數(shù)返回值的類型。返回值是指通過(guò)函數(shù)調(diào)用使主調(diào)函數(shù)能得到的一個(gè)確定的值。如果被調(diào)用函數(shù)有返回值,則可以通過(guò)return語(yǔ)句返回給主調(diào)函數(shù);如果不要返回值,則可在函數(shù)名稱左邊指定為void,或根本不指定?!昂瘮?shù)名”是函數(shù)的名字,是唯一標(biāo)識(shí)一個(gè)函數(shù)的名字。它的命名規(guī)則同變量完全一樣,在一個(gè)程序中不同函數(shù)的名字不能相同。從函數(shù)的形式上劃分,函數(shù)有無(wú)參函數(shù)和有參函數(shù)兩種形式。對(duì)有參函數(shù)來(lái)說(shuō),“形式參數(shù)表”給出函數(shù)被調(diào)用時(shí)傳入該函數(shù)里要處理的數(shù)據(jù)的形式參數(shù),可以傳入多個(gè)參數(shù),形式參數(shù)的類型必須說(shuō)明。對(duì)無(wú)參函數(shù)來(lái)說(shuō),無(wú)需傳入?yún)?shù),可在小括號(hào)內(nèi)選擇void,或直接為空?!熬植孔兞慷x”是對(duì)在函數(shù)內(nèi)部使用的局部變量進(jìn)行定義。“函數(shù)體語(yǔ)句”是為完成該函數(shù)的特定功能而設(shè)置的各種語(yǔ)句。4.1.4函數(shù)調(diào)用

C51語(yǔ)言程序中的函數(shù)是可以互相調(diào)用的。所謂函數(shù)調(diào)用就是在一個(gè)函數(shù)體中引用另一個(gè)已經(jīng)定義了的函數(shù),前者稱為主調(diào)函數(shù),后者稱為被調(diào)用函數(shù)。C51語(yǔ)言中主調(diào)函數(shù)通過(guò)函數(shù)調(diào)用來(lái)使用函數(shù)。

1.函數(shù)調(diào)用的格式函數(shù)調(diào)用的一般格式為函數(shù)名(實(shí)際參數(shù)表)其中“函數(shù)名”用于指出被調(diào)用的函數(shù);“實(shí)際參數(shù)表”中可以包含多個(gè)實(shí)際參數(shù),各個(gè)參數(shù)之間用逗號(hào)隔開(kāi)。實(shí)際參數(shù)的作用是將它的值傳給被調(diào)用函數(shù)中的形式參數(shù)。小提示函數(shù)調(diào)用中的實(shí)際參數(shù)必須與函數(shù)定義中的參數(shù)在個(gè)數(shù)、類型及順序上嚴(yán)格保持一致,以便將實(shí)際參數(shù)的值正確地傳遞給形式參數(shù),否則在函數(shù)調(diào)用時(shí)會(huì)產(chǎn)生錯(cuò)誤。如果調(diào)用的是無(wú)參函數(shù),則可以沒(méi)有實(shí)際參數(shù),但圓括號(hào)不能省略。

2.函數(shù)調(diào)用的方式在C語(yǔ)言中可以采用三種方式完成函數(shù)的調(diào)用。

(1)函數(shù)語(yǔ)句。在主調(diào)函數(shù)中將把函數(shù)調(diào)用作為一條語(yǔ)句。例如:

display();這時(shí)不要求被調(diào)用函數(shù)返回一個(gè)確定的值,只要求函數(shù)完成一定的操作。

(2)函數(shù)表達(dá)式。在主調(diào)函數(shù)中將函數(shù)調(diào)用作為一個(gè)運(yùn)算對(duì)象直接出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時(shí)要求被調(diào)用函數(shù)返回一個(gè)確定的值以參加表達(dá)式的計(jì)算。例如:

x=jianpanzhi();

(3)函數(shù)參數(shù)。在主調(diào)函數(shù)中將函數(shù)調(diào)用作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)。例如:

M=max(a,max(a,b));其中函數(shù)調(diào)用max(a,b)放在另一個(gè)函數(shù)調(diào)用max(a,max(a,b))的實(shí)際參數(shù)表中,以其返回值作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)。這種在調(diào)用一個(gè)函數(shù)的過(guò)程中又調(diào)用另外一個(gè)函數(shù)的方式,稱為嵌套函數(shù)調(diào)用。4.1.5函數(shù)的定義與調(diào)用應(yīng)用舉例

1.無(wú)參函數(shù)的定義與調(diào)用應(yīng)用

【例4.1】使用無(wú)參延時(shí)函數(shù),實(shí)現(xiàn)P1口最低位對(duì)應(yīng)的發(fā)光管1s閃爍一次。解:程序如下:

#include<reg51.h>//?C51單片機(jī)寄存器符號(hào)定義頭文件

sbitP1_0=P1^0; //聲明單片機(jī)P1口的最低位

voiddelay(); //聲明無(wú)參延時(shí)函數(shù)

voidmain() //主函數(shù)

{

while(1) //無(wú)限循環(huán)

{

P1_0=0; //點(diǎn)亮最低位對(duì)應(yīng)的發(fā)光二極管

delay(); //作為函數(shù)語(yǔ)句調(diào)用無(wú)參延時(shí)函數(shù)

P1_0=1; //熄滅最低位對(duì)應(yīng)的發(fā)光二極管

delay(); //作為函數(shù)語(yǔ)句調(diào)用無(wú)參延時(shí)函數(shù)

}

}

voiddelay() //無(wú)參函數(shù)定義,實(shí)現(xiàn)延時(shí)大約500ms

{

unsignedintm,n; //函數(shù)局部變量定義

for(m=0;m<500;m++)

for(n=0;n<110;n++);

}

2.有參函數(shù)的定義與調(diào)用

【例4.2】在如圖4.2所示的電路中,P3.6上輸出1kHz和500Hz的方波信號(hào)去驅(qū)動(dòng)蜂鳴器,作為報(bào)警信號(hào),要求1kHz信號(hào)響100ms,500Hz信號(hào)響200ms,如此交替進(jìn)行。解:1kHz的方波信號(hào),其周期為1ms,每半個(gè)周期(500μs)取反一次。這樣的信號(hào)持續(xù)100ms,有200個(gè)半周期就可實(shí)現(xiàn)。

500Hz的方波信號(hào),其周期為2ms,每半個(gè)周期(1ms)取反一次即可實(shí)現(xiàn)。這樣的信號(hào)持續(xù)200ms,有200個(gè)半周期就可實(shí)現(xiàn)。圖4.2蜂鳴器驅(qū)動(dòng)電路程序如下:

#include<reg51.h>//?51單片機(jī)寄存器符號(hào)定義頭文件

#defineucharunsignedchar //宏定義

sbitP3_6=P3^6; //聲明單片機(jī)P3口的第6位

voiddelay(uchari); //聲明有參函數(shù)

voidmain() //主函數(shù)

{

ucharj,k; //主函數(shù)局部變量定義

while(1) //無(wú)限循環(huán)

{

P3_6=1;

for(j=0;j<200;j++)//?1kHz方波信號(hào)響100?ms

P3_6=!P3_6; //方波高低電平轉(zhuǎn)換

delay(1);//調(diào)用有參延時(shí)函數(shù),實(shí)現(xiàn)延時(shí)大約500?μs

}

for(k=0;k<200;k++)//?500Hz信號(hào)響200?ms

{

P3_6=!P3_6;//方波高低電平轉(zhuǎn)換

delay(2);//調(diào)用有參延時(shí)函數(shù),實(shí)現(xiàn)延時(shí)大約1?ms

}

}

voiddelay(uchari)//定義有參延時(shí)函數(shù),延時(shí)時(shí)間與傳入的參數(shù)值有關(guān)

{

ucharm,n;

for(m=0;m<i;m++)

for(n=0;n<250;n++);

}小知識(shí)

#define宏定義格式:#define新名稱原內(nèi)容

#define命令用其后面的第一個(gè)字符組合(新名稱)代替該字符組合后面的所有內(nèi)容(原內(nèi)容),也就是相當(dāng)于給“原內(nèi)容”重新起一個(gè)比較簡(jiǎn)單的“新名稱”,以方便在以后的程序中直接寫簡(jiǎn)短的新名稱,而不必每次都寫煩瑣的原內(nèi)容。如例4.2中的“#defineucharunsignedchar”,此處宏定義的目的就是將“unsignedchar”用“uchar”代替,當(dāng)程序中需要定義unsignedchar型變量時(shí),沒(méi)有寫“unsignedcharj,k;”,而是寫“ucharj,k;”。注意:①#define宏定義后面沒(méi)有分號(hào);②在一個(gè)程序中,對(duì)于同一個(gè)內(nèi)容,只能宏定義一次;③只要宏定義過(guò)一次,那么在整個(gè)程序中都可以直接使用它的“新名稱”。4.2定時(shí)/計(jì)數(shù)器單片機(jī)之所以在工業(yè)控制中得到大量應(yīng)用,就是在于它有獨(dú)特的定時(shí)、計(jì)數(shù)功能。

8051單片機(jī)內(nèi)部有兩個(gè)16位可編程的定時(shí)/計(jì)數(shù)器,即定時(shí)/計(jì)數(shù)器T0和T1。它們既有定時(shí)功能又有計(jì)數(shù)功能,通過(guò)適當(dāng)?shù)卦O(shè)置與它們有關(guān)的特殊功能寄存器,可以選擇啟用定時(shí)功能或計(jì)數(shù)功能。4.2.1定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)和工作原理

1.定時(shí)/計(jì)數(shù)器的基本結(jié)構(gòu)

8051單片機(jī)定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)如圖4.3所示,由T0、T1、方式寄存器TMOD和控制寄存器TCON四大部分組成。兩個(gè)16位的定時(shí)/計(jì)數(shù)器分別由兩個(gè)專用寄存器組成,其中T0由TH0和TL0組成,T1由TH1和TL1組成。特殊功能寄存器TMOD和TCON用于定時(shí)/計(jì)數(shù)器的管理和控制:TMOD是工作方式寄存器,用于定時(shí)/計(jì)數(shù)器工作方式和功能的設(shè)置;TCON是定時(shí)/計(jì)數(shù)器控制寄存器,用于控制定時(shí)/計(jì)數(shù)器的啟動(dòng)與停止。圖4.3定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)

2.定時(shí)/計(jì)數(shù)器的工作原理單個(gè)定時(shí)/計(jì)數(shù)器的工作原理如圖4.4所示。定時(shí)/計(jì)數(shù)器的核心是16位可預(yù)置初值的加1計(jì)數(shù)器,每來(lái)一個(gè)脈沖計(jì)數(shù)器加1,當(dāng)加到計(jì)數(shù)器全為1時(shí),再輸入一個(gè)脈沖就會(huì)使計(jì)數(shù)器溢出從而回零。加1計(jì)數(shù)器輸入的計(jì)數(shù)脈沖有兩個(gè)來(lái)源:一個(gè)是由系統(tǒng)的時(shí)鐘振蕩器輸出經(jīng)12分頻后送來(lái)的(即圖4.3中的機(jī)器周期脈沖);另一個(gè)是T0或T1引腳(P3.4或P3.5)輸入的外部脈沖源。計(jì)數(shù)器溢出,如果定時(shí)/計(jì)數(shù)器工作于定時(shí)模式,則表示定時(shí)時(shí)間已到;如果工作于計(jì)數(shù)模式,則表示計(jì)數(shù)值已滿。設(shè)置為計(jì)數(shù)模式時(shí),是對(duì)外部事件進(jìn)行計(jì)數(shù),計(jì)數(shù)脈沖來(lái)自相應(yīng)的外部輸入引腳T0或T1;設(shè)置為定時(shí)模式時(shí),也是通過(guò)計(jì)數(shù)實(shí)現(xiàn)的,此時(shí)計(jì)數(shù)脈沖來(lái)自于內(nèi)部時(shí)鐘脈沖,每個(gè)機(jī)器周期使計(jì)數(shù)器加1。圖4.4定時(shí)/計(jì)時(shí)器的工作原理框圖

小提示單片機(jī)雖然具有對(duì)外來(lái)脈沖計(jì)數(shù)的功能,但并不是任意頻率的脈沖都可直接計(jì)數(shù),單片機(jī)的晶振頻率限制了所測(cè)計(jì)數(shù)脈沖的最高頻率。計(jì)數(shù)脈沖來(lái)自相應(yīng)的外部輸入引腳T0(P3.4)或T1(P3.5),CPU確認(rèn)一次脈沖負(fù)跳沿需要花兩個(gè)機(jī)器周期,即24個(gè)振蕩周期,因此外部計(jì)數(shù)脈沖的最高頻率為晶振頻率的1/24。例如選用12MHz頻率的晶振,則最高可輸入500kHz的外部脈沖。

3.定時(shí)/計(jì)數(shù)器的方式寄存器和控制寄存器單片機(jī)在使用定時(shí)/計(jì)數(shù)器功能時(shí),通過(guò)對(duì)兩個(gè)與定時(shí)/計(jì)數(shù)器有關(guān)的寄存器(方式寄存器TMOD和控制寄存器TCON)中的內(nèi)容進(jìn)行設(shè)置,從而達(dá)到對(duì)定時(shí)/計(jì)數(shù)器進(jìn)行控制的目的。TMOD用于確定定時(shí)/計(jì)數(shù)器的工作方式和功能;TCON用于控制T0、T1的啟動(dòng)、停止和設(shè)置溢出標(biāo)志等。

1)方式寄存器TMOD

TMOD的格式如下:

TMOD的高4位用于設(shè)置定時(shí)器T1,低4位用于設(shè)置定時(shí)器T0。各對(duì)應(yīng)位的含義如下:

(1)?GATE:門控制位。

GATE?=?0:軟件啟動(dòng)方式,定時(shí)/計(jì)數(shù)器的啟動(dòng)與停止僅受TCON寄存器中TR0或TR1的控制;GATE?=?1:硬件軟件共同啟動(dòng)方式,定時(shí)/計(jì)數(shù)器的啟動(dòng)與停止由TCON中的TR0或TR1和外部中斷引腳(P3.2)或(P3.3)共同控制。

(2)?C/:功能模式選擇位。

C/

=?0:定時(shí)功能模式;C/

=?1:計(jì)數(shù)功能模式。

(3)?M1、M0:工作方式選擇位。定時(shí)/計(jì)數(shù)器有4種工作方式,可由M1M0來(lái)設(shè)定,其對(duì)應(yīng)關(guān)系如表4.2所示。表4.2方式選擇位的含義

2)控制寄存器TCON

TCON的格式如下:

TCON的高4位用于定時(shí)/計(jì)數(shù)器;低4位用于外部中斷。各對(duì)應(yīng)位的含義如表4.3所示。表4.3控制寄存器TCON各位的含義4.2.2定時(shí)/計(jì)數(shù)器的工作方式

8051單片機(jī)的定時(shí)/計(jì)數(shù)器有四種工作方式,它們分別是工作方式0~3。

1.工作方式0設(shè)置M1M0為00,則定時(shí)器工作于方式0,此時(shí)為13位的定時(shí)/計(jì)數(shù)器。其邏輯結(jié)構(gòu)如圖4.5所示。以T0為例,定時(shí)/計(jì)數(shù)器T1的結(jié)構(gòu)和操作與定時(shí)/計(jì)數(shù)器T0相同。此方式下,16位寄存器(TH0和TL0)只用13位,就是TH0的8位和TL0的低5位,其中TL0的高3位沒(méi)有用。C/

=?0時(shí),計(jì)數(shù)脈沖來(lái)自于內(nèi)部時(shí)鐘脈沖12分頻的機(jī)器周期脈沖;C/

=?1時(shí),計(jì)數(shù)脈沖來(lái)自于外部事件脈沖輸入引腳T0(P3.4)。啟動(dòng)控制由TR0、GATE和共同決定,GATE?=?0時(shí),或門被封鎖,信號(hào)無(wú)效,TR0直接控制定時(shí)/計(jì)數(shù)器T0的啟動(dòng)和停止;GATE?=?1時(shí),或門被打開(kāi),和TR0共同控制定時(shí)/計(jì)數(shù)器T0的啟動(dòng)和停止。在加1脈沖的作用下開(kāi)始加1計(jì)數(shù),當(dāng)TL0的低5位計(jì)滿后向TH0進(jìn)一位,直到把TH0也計(jì)滿,向溢出標(biāo)志位TF0進(jìn)位(稱硬件置位TF0)。

TH0、TL0可設(shè)置初值,并從設(shè)置的初值開(kāi)始加法計(jì)數(shù),直到溢出,所設(shè)置的初值不同,計(jì)數(shù)值就不同。當(dāng)初值為0時(shí),就有最大的計(jì)數(shù)值M?=?213?=?8192。圖4.5定時(shí)/計(jì)數(shù)器T0方式0邏輯結(jié)構(gòu)圖

2.工作方式1設(shè)置M1M0為01,則定時(shí)器工作于方式1,此時(shí)為16位的定時(shí)/計(jì)數(shù)器。其邏輯結(jié)構(gòu)如圖4.6所示。此方式下,16位寄存器(TH0和TL0)全部用上。在加1脈沖的作用下開(kāi)始加1計(jì)數(shù),當(dāng)TL0的8位計(jì)滿后向TH0進(jìn)一位,直到把TH0也計(jì)滿,向溢出標(biāo)志位TF0進(jìn)位。最大的計(jì)數(shù)值M?=?216?=?65536。圖4.6定時(shí)/計(jì)數(shù)器T0方式1邏輯結(jié)構(gòu)圖

3.工作方式2設(shè)置M1M0為10,則定時(shí)器工作于方式2,此時(shí)為初值自動(dòng)重載的8位定時(shí)/計(jì)數(shù)器。其邏輯結(jié)構(gòu)如圖4.7所示。此方式下,TL0作為8位加1計(jì)數(shù)器使用,TH0作為初值寄存器使用,兩者由軟件在初始化時(shí)賦相同的初值。在加1脈沖的作用下開(kāi)始加1計(jì)數(shù),當(dāng)TL0的8位計(jì)滿后,向溢出標(biāo)志位TF0進(jìn)位。同時(shí)發(fā)出重裝載信號(hào),硬件電路自動(dòng)將TH0中的初值裝入TL0中,使8位計(jì)數(shù)器TL0又從初值重新開(kāi)始計(jì)數(shù)。最大的計(jì)數(shù)值M?=?28?=?256。圖4.7定時(shí)/計(jì)數(shù)器T0方式2邏輯結(jié)構(gòu)圖

4.工作方式3設(shè)置M1M0為11,則定時(shí)器工作于方式3,工作方式3僅對(duì)T0有意義。此時(shí)定時(shí)器T0被分成兩個(gè)互相獨(dú)立工作的8位計(jì)數(shù)器TH0和TL0。其邏輯結(jié)構(gòu)如圖4.8所示。

TL0既能用于定時(shí),又能用于計(jì)數(shù),它占用T0的控制位、引腳和中斷源,包括、GATE、TR0、TF0、T0(P3.4)引腳和(P3.2)引腳;TH0只能用于定時(shí)功能,不能對(duì)外部事件計(jì)數(shù),它占用T1的控制位TF1和TR1,同時(shí)還占用了T1的中斷源,其啟動(dòng)和關(guān)閉僅受TR1控制。最大的計(jì)數(shù)值M?=?28?=?256。圖4-8定時(shí)/計(jì)數(shù)器T0方式2的邏輯結(jié)構(gòu)圖小提示定時(shí)器T0工作在方式3時(shí),原則上定時(shí)器T1仍可設(shè)置為方式0~2,但由于TR1、TF1和T1中斷源均被T0占用,使T1的功能受限,只能用在不需要中斷功能和啟??刂频膱?chǎng)合。此時(shí)T1僅有控制位切換其定時(shí)或計(jì)數(shù)功能模式,計(jì)數(shù)溢出時(shí)只能將溢出送入串行口。在這種情況下,T1一般設(shè)置為方式2,用作串行口波特率發(fā)生器。方式3適用于要求增加一個(gè)額外的8位定時(shí)器的場(chǎng)合。4.2.3定時(shí)/計(jì)數(shù)器的應(yīng)用定時(shí)/計(jì)數(shù)器是單片機(jī)應(yīng)用系統(tǒng)中的重要組成部件,其工作方式的靈活應(yīng)用對(duì)提高編程技巧、減輕CPU負(fù)擔(dān)和簡(jiǎn)化外圍電路有很大好處。

1.定時(shí)/計(jì)數(shù)器的初始化由于8051的定時(shí)/計(jì)數(shù)器是可編程的,即它的功能是由軟件編程確定的,因此一般在使用定時(shí)/計(jì)數(shù)器前需對(duì)其進(jìn)行初始化,使其按設(shè)定的功能工作。

1)基本步驟

(1)確定T0和T1的工作方式,對(duì)TMOD賦值。

(2)計(jì)算初值,并將初值寫入TH0、TL0或TH1、TL1。

(3)根據(jù)需要開(kāi)放中斷,中斷方式時(shí),對(duì)IE賦值;查詢方式時(shí),此步驟沒(méi)有。

(4)對(duì)TR0或TR1置位,啟動(dòng)定時(shí)/計(jì)數(shù)器工作。

2)計(jì)算初值X

(1)計(jì)數(shù)功能:X?=?最大計(jì)數(shù)值N?-?計(jì)數(shù)值n

(2)定時(shí)功能:X?=?最大計(jì)數(shù)值N?-?t/T,其中t為定時(shí)時(shí)間;T為機(jī)器周期。

【例4.3】選擇T0方式0用于定時(shí),實(shí)現(xiàn)在P3.6上輸出頻率為1kHz的方波,晶振頻率fosc?=?12MHz。分析:1kHz的方波信號(hào)其周期為1ms,只要使P3.6每隔半個(gè)周期(即500μs)取反一次,即可得到輸出頻率為1kHz的方波。因而T0的定時(shí)時(shí)間為500μs,可選方式0和方式1,因定時(shí)時(shí)間不長(zhǎng),這里取方式0即可,M1M0?=?00。定時(shí)/計(jì)數(shù)器用于定時(shí),所以=0;在此用軟件啟動(dòng)T0,所以GATE=0。T1這里不用,方式字可任意設(shè)置,一般取0。故TMOD=0x00。TH?=?11110000B?=?0xf0TL?=?00001100B?=?0x0c

2.定時(shí)/計(jì)數(shù)器的應(yīng)用

【例4.4】單片機(jī)系統(tǒng)晶體振蕩器的頻率為12MHz,利用定時(shí)/計(jì)數(shù)器0實(shí)現(xiàn)在P3.6引腳上輸出周期為500μs的方波。分析:要在P3.6引腳上輸出周期為500μs的方波,只要每半個(gè)周期即250μs取反一次即可,因此只要利用定時(shí)/計(jì)數(shù)器實(shí)現(xiàn)定時(shí)250μs,定時(shí)時(shí)間到取反就可以實(shí)現(xiàn)。利用T0讓其在工作方式2下實(shí)現(xiàn)定時(shí),對(duì)應(yīng)TMOD?=?0X01,TH0?=?TL0?=?256?-?250?=?6。程序如下:

#include<reg51.h>

sbitP3_6=P3^6;

voidmain(){TMOD=0x01; //?T0工作于方式2,用于定時(shí)

TH0=6; //設(shè)置定時(shí)/計(jì)數(shù)器0的計(jì)數(shù)初值

TL0=6;

P3_6=1;

TR0=1; //啟動(dòng)定時(shí)

while(1)

{

if(TF0==1) //判斷定時(shí)時(shí)間到了沒(méi)有

{

P3_6=!P3_6;//定時(shí)時(shí)間到了,波形取反

TF0=0;//查詢方式下用軟件將溢出標(biāo)志位清零

}

}}

【例4.5】一交通路口設(shè)紅、黃、綠三盞交通燈,當(dāng)紅燈亮2s后,黃燈亮400ms,綠燈亮1s,試用單片機(jī)模擬交通燈控制。分析:?jiǎn)纹瑱C(jī)采用發(fā)光二極管模擬交通燈控制,即利用P1.0~P1.2分別接紅燈(LED0)、黃燈(LED1)、綠燈(LED2)三個(gè)發(fā)光二極管,電路如圖4.9所示。問(wèn)題是這里用到三個(gè)不同定時(shí)時(shí)間(2s、400ms、1s),是不是每個(gè)定時(shí)時(shí)間都編寫不同的定時(shí)程序?其實(shí)不需要,可以采用軟件定時(shí)器的方式,即找到這幾個(gè)定時(shí)時(shí)間的公約數(shù)如50ms,利用軟件定時(shí)器就可以完成不同的延時(shí)。圖4.9單片機(jī)模擬交通燈控制程序如下:

#include<reg51.h>

sbitP1_0=P1^0;

sbitP1_1=P1^1;

sbitP1_2=P1^2;

voidtimer0();//聲明定時(shí)的函數(shù)

voidmain()

{

P1=0xff;

TMOD=0x01;//設(shè)置定時(shí)/計(jì)數(shù)器0工作于方式1,用于定時(shí)

while(1){

P1_0=0; //紅燈亮

timer0(40); //延時(shí)2s

P1_0=1; //紅燈滅

P1_1=0; //黃燈亮

imer0(8); //延時(shí)400ms

P1_1=1; //黃燈滅

P1_2=0; //綠燈亮

timer0(20); //延時(shí)1s

P1_2=1; //綠燈滅

}}

voidtimer0(unsignedcharn)

//定義定時(shí)函數(shù)

{unsignedchari; i=0;

TH0=(65536-5000)/256;//設(shè)置定時(shí)/計(jì)數(shù)器0的計(jì)數(shù)初值,以確定定時(shí)時(shí)間50ms TL0=(65536-5000)%256; TR0=1;

//啟動(dòng)定時(shí)

while(i<=n) //時(shí)間未到

{

while(TF0==0); //判斷定時(shí)時(shí)間50ms到了沒(méi)有,沒(méi)有到則等待

i++; //定時(shí)時(shí)間到,累加變量加1

TH0=(65536-5000)/256;//重裝計(jì)數(shù)初值

TL0=(65536-5000)%256;

TF0=0; //溢出標(biāo)志清零

}

}

【例4.6】如圖4.10所示電路中,利用定時(shí)/計(jì)數(shù)器T0測(cè)量(P3.2)引腳上正脈沖的寬度(以機(jī)器周期數(shù)表示)。分析:利用T0、GATE?=?1時(shí),定時(shí)/計(jì)數(shù)器的啟動(dòng)或停止由TR0和共同決定,即TR0·?

=?1時(shí),定時(shí)/計(jì)數(shù)器T0才會(huì)啟動(dòng)。如果僅設(shè)置TR0等于“1”,則定時(shí)/計(jì)數(shù)器不能被啟動(dòng),還必須等外部脈沖高電平時(shí),定時(shí)/計(jì)數(shù)器才會(huì)啟動(dòng),否則定時(shí)/計(jì)數(shù)器T0停止工作。測(cè)試過(guò)程控制如圖4.11所示,在被測(cè)信號(hào)為低電平期間,讓TR0?=?1,做好測(cè)量準(zhǔn)備,此時(shí)定時(shí)/計(jì)數(shù)器不會(huì)啟動(dòng),而被測(cè)信號(hào)高電平到來(lái)的那一刻自動(dòng)啟動(dòng),直到高電平結(jié)束的時(shí)刻關(guān)閉定時(shí)/計(jì)數(shù)器,在被測(cè)信號(hào)高電平期間,統(tǒng)計(jì)單片機(jī)內(nèi)部機(jī)器周期脈沖個(gè)數(shù),即可得到相應(yīng)被測(cè)信號(hào)正脈沖的寬度。此時(shí)定時(shí)/計(jì)數(shù)器T0工作于定時(shí)模式,即=?0??紤]到讓測(cè)量范圍盡可能大,可選擇工作方式1,此時(shí)M1M0?=?01,初值取TH0?=?0,TL0?=?0。圖4.10利用定時(shí)/計(jì)數(shù)器T0測(cè)脈沖寬度圖4.11被測(cè)脈沖測(cè)試過(guò)程控制程序如下:

#include<reg51.h>

sbitP3_2=P3^2;

voidmain()

{

unsignedinti;

TMOD=0x09; //?T0用于定時(shí)

TH0=0;

TL0=0;

IE=0;

while(P3_2==1);

TR0=1; //被測(cè)信號(hào)低電平期間,TR0置1,做好測(cè)量準(zhǔn)備

while(P3_2==0); //被測(cè)信號(hào)仍為低電平,則等待

while(P3_2==1); //被測(cè)信號(hào)變?yōu)楦唠娖?,開(kāi)始自動(dòng)測(cè)量

TR0=0;//被測(cè)信號(hào)高電平結(jié)束,關(guān)閉定時(shí)/計(jì)數(shù)器

i=256*TH0+TL0; //讀取測(cè)量值

}任務(wù)6人工控制的小燈

1.任務(wù)目的通過(guò)人工控制小燈的電路制作和軟件設(shè)計(jì),了解單片機(jī)的中斷系統(tǒng)及相關(guān)的特殊功能寄存器,掌握單片機(jī)外中斷的使用,掌握C51中斷服務(wù)函數(shù)的編寫。

2.任務(wù)要求正常情況下,P1口所接的8個(gè)LED燈單燈循環(huán)右移,如果P3.2所接的按鍵按下(外部中斷0),則P1口燈變成閃爍5次后,恢復(fù)中斷前的狀態(tài),繼續(xù)單燈循環(huán)右移。

3.硬件電路硬件電路如圖4.12所示。在P3.2(外部中斷0的中斷輸入引腳)上接入一個(gè)按鍵,用來(lái)產(chǎn)生控制信號(hào),當(dāng)按鍵按下時(shí),在引腳上產(chǎn)生一個(gè)下降沿,向CPU發(fā)出中斷請(qǐng)求,利用外部中斷0來(lái)實(shí)現(xiàn)任務(wù)中所要求的功能。圖4.12人工控制小燈電路

4.程序設(shè)計(jì)人工控制小燈的源程序如下:

/*人工控制小燈,外部中斷*/

//?=======聲明區(qū)==============

#include<reg51.h>

#defineucharunsignedchar //宏定義

voiddelay();//聲明延時(shí)函數(shù)

voidright();//聲明單燈右移函數(shù)

//?======主程序================

voidmain(void)

{

P1=0xff;

EA=1;//開(kāi)總中斷

IT0=1;//外部中斷0為下降沿觸發(fā)方式

EX0=1;//開(kāi)外部中斷0

While(1)right();//無(wú)窮循環(huán),程序一直在運(yùn)行,單燈右移

}

//?======外部中斷0中斷服務(wù)函數(shù)===========

voidint0(void)interrupt0

{

ucharsaveled,i;

saveled=P1; //保護(hù)現(xiàn)場(chǎng)

P1=0xff;

for(i=0;i<10;i++) //?P1口燈閃爍5次

{

P1=~P1;

delay();

}

P1=saveled; //恢復(fù)現(xiàn)場(chǎng)

}

//?======單燈右移函數(shù)===========

voidright()

{

uchari,k;

k=0x80;

for(i=0;i<8;i++)

{

P1=~k;

delay();

k>>=1;

}

}

//?======延時(shí)函數(shù)==============

voiddelay()

{ucharm,n;

for(m=0;m<250;m++)

for(n=0;n<255;n++);

}

小問(wèn)題問(wèn):函數(shù)int0在程序中沒(méi)有被調(diào)用,它是不是沒(méi)有執(zhí)行?答:函數(shù)int0是一種特殊的函數(shù),叫做中斷服務(wù)函數(shù)。它和一般函數(shù)不同,不能在程序中軟件調(diào)用,而是在中斷響應(yīng)條件滿足的情況下,由中斷系統(tǒng)硬件自動(dòng)完成調(diào)用。因此,雖然在程序中沒(méi)有看到調(diào)用該函數(shù)的語(yǔ)句,但是在滿足中斷響應(yīng)條件時(shí),它是會(huì)被自動(dòng)執(zhí)行的。

5.任務(wù)小結(jié)本任務(wù)中,在正常情況下運(yùn)行主函數(shù),實(shí)現(xiàn)P1口對(duì)應(yīng)8個(gè)發(fā)光管單燈依次右移點(diǎn)亮;當(dāng)P3.2所接按鍵按下后,中斷當(dāng)前的顯示模式,轉(zhuǎn)去執(zhí)行中斷服務(wù)函數(shù),實(shí)現(xiàn)P1口對(duì)應(yīng)8個(gè)發(fā)光管閃爍5次。中斷功能的存在很大程度上提高了單片機(jī)處理外部或內(nèi)部事件的能力,使單片機(jī)的工作更加靈活、效率更高。中斷是為使單片機(jī)具有對(duì)外部或內(nèi)部隨機(jī)發(fā)生的事件實(shí)時(shí)處理而設(shè)置的。中斷是單片機(jī)最重要的功能之一,是學(xué)習(xí)單片機(jī)必須要掌握的內(nèi)容。4.3中斷系統(tǒng)4.3.1中斷的基本概念

1.中斷在生活中會(huì)發(fā)生一些這樣的事情,如你正在家里看書,突然電話鈴響了,這時(shí)你會(huì)放下書本,去接電話,和來(lái)電話的人交談,交談完后會(huì)放下電話,回去繼續(xù)看書,其流程如圖4.13所示。這就是生活中的“中斷”現(xiàn)象,就是正常的工作過(guò)程被另外某些事情打斷了。在單片機(jī)中,所謂中斷是指CPU正在處理A事件時(shí),突然發(fā)生另外的事件B,請(qǐng)求CPU緊急處理(中斷請(qǐng)求),CPU暫停當(dāng)前工作(中斷響應(yīng)),轉(zhuǎn)而處理B事件(中斷處理),處理完后再回到原來(lái)被打斷的地方,繼續(xù)處理A事件(中斷返回)的這一過(guò)程。其流程如圖4.14所示。圖4.13生活中的中斷流程圖4.14單片機(jī)中斷處理流程

2.中斷源引起中斷的原因或能發(fā)出中斷請(qǐng)求的來(lái)源稱為中斷源。8051單片機(jī)中共有5個(gè)中斷源:兩個(gè)外部中斷,兩個(gè)定時(shí)/計(jì)數(shù)器中斷,一個(gè)串行口中斷。

3.中斷技術(shù)的優(yōu)點(diǎn)

1)提高了CPU的利用率。有了中斷功能,就能解決快速CPU和慢速外設(shè)之間的矛盾。CPU在啟動(dòng)外設(shè)工作后,繼續(xù)執(zhí)行自己的正常工作,此時(shí)外設(shè)也在工作,只有當(dāng)外設(shè)做完一件事情后才會(huì)發(fā)出中斷請(qǐng)求,CPU中斷正在執(zhí)行的程序,轉(zhuǎn)去執(zhí)行中斷服務(wù),中斷處理完后再恢復(fù)執(zhí)行原來(lái)的工作,而不必始終在等待中。這樣CPU可以命令多個(gè)外設(shè)同時(shí)工作,從而大大提高了CPU的利用率。

(2)實(shí)現(xiàn)實(shí)時(shí)處理。在實(shí)時(shí)控制中,現(xiàn)場(chǎng)的各個(gè)參數(shù)、信息會(huì)隨時(shí)間和現(xiàn)場(chǎng)情況不斷發(fā)生變化,有了中斷功能,就可以根據(jù)要求隨時(shí)向CPU發(fā)出中斷請(qǐng)求,要求CPU及時(shí)處理,使單片機(jī)的工作更加靈活。

(3)故障處理。單片機(jī)在運(yùn)行過(guò)程中,出現(xiàn)一些事先無(wú)法預(yù)料的故障是難免的,如電源突跳、存儲(chǔ)出錯(cuò)等。有了中斷功能,單片機(jī)就能自行處理,而不必停機(jī)處理。4.3.28051單片機(jī)中斷系統(tǒng)的結(jié)構(gòu)單片機(jī)中能實(shí)現(xiàn)中斷功能的部件稱為中斷系統(tǒng)。8051單片機(jī)的中斷系統(tǒng)由中斷源、與中斷有關(guān)的特殊功能寄存器(TCON、SCON、IE、IP)、中斷入口和順序查詢邏輯電路等組成。其結(jié)構(gòu)框圖如圖4.15所示。

1.中斷源

8051單片機(jī)中斷系統(tǒng)有5個(gè)中斷源,分別為外部中斷0請(qǐng)求、外部中斷1請(qǐng)求、定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求、定時(shí)/計(jì)數(shù)器T1溢出中斷請(qǐng)求、串行口中斷請(qǐng)求RI或TI。圖4.158051中斷系統(tǒng)的內(nèi)部結(jié)構(gòu)框圖

2.與中斷有關(guān)的特殊功能寄存器與中斷有關(guān)的特殊功能寄存器有4個(gè),分別為中斷標(biāo)志寄存器TCON和SCON、中斷允許控制寄存器IE和中斷優(yōu)先級(jí)控制寄存器IP。

3.順序查詢電路

8051單片機(jī)有兩個(gè)中斷優(yōu)先級(jí):高優(yōu)先級(jí)和低優(yōu)先級(jí)。同一優(yōu)先級(jí)別的中斷源采用內(nèi)部自然優(yōu)先級(jí),由順序查詢電路形成。

4.中斷入口

5個(gè)中斷源對(duì)應(yīng)著5個(gè)中斷入口,它們之間的對(duì)應(yīng)關(guān)系如表4.4所示。對(duì)C語(yǔ)言程序而言,可以不知道中斷入口的真實(shí)地址,而用相應(yīng)的序號(hào)來(lái)代替。表4.48051單片機(jī)中斷源的入口地址和序號(hào)4.3.3中斷的特殊功能寄存器

8051單片機(jī)是通過(guò)對(duì)四個(gè)與中斷有關(guān)的特殊功能寄存器進(jìn)行內(nèi)容查詢或控制來(lái)達(dá)到中斷控制的目的。

1.中斷標(biāo)志寄存器每個(gè)中斷源都對(duì)應(yīng)一個(gè)中斷標(biāo)志位,它們分布在定時(shí)/計(jì)數(shù)器控制寄存器TCON和串行口控制寄存器SCON中。

1)?TCON在TCON中有6位與中斷有關(guān)(其中4位是中斷標(biāo)志位,2位用來(lái)設(shè)置外部中斷觸發(fā)方式),另外2位與中斷無(wú)關(guān),如4.3.2中表4.3所示。

2)?SCON在SCON中最低的兩位為串行口中斷標(biāo)志位,其他位為串行口控制設(shè)置位,在此就不詳述。

SCON的格式如下:

SCON最低兩位的含義如下:

TI:串行口發(fā)送中斷標(biāo)志,當(dāng)串行口發(fā)送完一幀數(shù)據(jù)后,該位由硬件自動(dòng)置1,供中斷系統(tǒng)的查詢電路進(jìn)行中斷查詢。

RI:串行口接收中斷標(biāo)志位,當(dāng)串行口接收完一幀數(shù)據(jù)后,該位由硬件自動(dòng)置1,供中斷系統(tǒng)的查詢電路進(jìn)行查詢。

TI和RI與其他4個(gè)中斷標(biāo)志位不同的是,串行口中斷響應(yīng)完成后不會(huì)自動(dòng)清0,須使用軟件清0。

2.中斷允許寄存器IE

8051單片機(jī)的5個(gè)中斷源都是可屏蔽中斷,中斷系統(tǒng)內(nèi)部有一個(gè)中斷允許寄存器IE,用于控制各中斷源的中斷開(kāi)放或屏蔽。

IE的格式如下:

IE各對(duì)應(yīng)位的含義如表4.5所示。表4.5中斷允許寄存器IE各位的含義

3.中斷優(yōu)先級(jí)寄存器IP

8051單片機(jī)有兩個(gè)中斷優(yōu)先級(jí):高優(yōu)先級(jí)和低優(yōu)先級(jí)。每個(gè)中斷源都可以通過(guò)中斷優(yōu)先級(jí)控制寄存器IP設(shè)置為高優(yōu)先級(jí)中斷或低優(yōu)先級(jí)中斷。

IP的格式如下:

IP各對(duì)應(yīng)位的含義如表4.6所示表4.6中斷優(yōu)先級(jí)寄存器IP各位的含義同一優(yōu)先級(jí)別的中斷源可能不止一個(gè),因此也需要進(jìn)行優(yōu)先排隊(duì)。同一優(yōu)先級(jí)別的中斷源采用內(nèi)部自然優(yōu)先級(jí),它由硬件形成,其優(yōu)先順序如下:4.3.4中斷處理過(guò)程中斷處理過(guò)程可分為三個(gè)階段:中斷響應(yīng)、中斷處理、中斷返回。中斷響應(yīng)是CPU對(duì)中斷源中斷請(qǐng)求的回答。單片機(jī)在運(yùn)行時(shí),并不是任何時(shí)刻都會(huì)去響應(yīng)中斷請(qǐng)求,而是在中斷響應(yīng)條件滿足之后才會(huì)響應(yīng)。

1.中斷響應(yīng)條件

CPU響應(yīng)中斷的基本條件為:

(1)有中斷源發(fā)出中斷請(qǐng)求;

(2)中斷總允許位EA=1,即CPU允許所有中斷源申請(qǐng)中斷;

(3)申請(qǐng)中斷的中斷源的中斷允許位為1,即CPU允許響應(yīng)中斷。若滿足上述條件,則CPU一般會(huì)響應(yīng)中斷。但如果出現(xiàn)下列任何一種情況,對(duì)應(yīng)中斷響應(yīng)會(huì)受到阻斷:

(1)?CPU正在執(zhí)行一個(gè)同級(jí)或高一級(jí)的中斷服務(wù)函數(shù);

(2)當(dāng)前指令未執(zhí)行完;

(3)正在執(zhí)行中斷返回或訪問(wèn)寄存器IE和IP。若存在任何一種阻斷情況,則中斷查詢結(jié)果即被取消,否則在緊接著的下一個(gè)機(jī)器周期,就會(huì)響應(yīng)中斷。

2.中斷處理過(guò)程如果中斷響應(yīng)條件滿足,且不存在中斷阻斷的情況,則CPU就會(huì)響應(yīng)中斷,進(jìn)行相應(yīng)的中斷處理。此時(shí)中斷系統(tǒng)會(huì)自動(dòng)產(chǎn)生中斷函數(shù)調(diào)用指令,通過(guò)硬件查詢對(duì)應(yīng)中斷入口地址,同時(shí)自動(dòng)把原來(lái)斷開(kāi)的位置(斷點(diǎn))保護(hù)起來(lái),然后執(zhí)行用戶編寫的可實(shí)現(xiàn)一定功能的中斷服務(wù)函數(shù),執(zhí)行完畢后返回原來(lái)斷點(diǎn)。中斷處理過(guò)程流程如圖4.16所示。中斷處理過(guò)程就是硬件自動(dòng)調(diào)用并執(zhí)行中斷函數(shù)的過(guò)程。圖4.16中斷處理過(guò)程流程圖小提示中斷處理過(guò)程中,只會(huì)自動(dòng)保護(hù)斷點(diǎn),但不會(huì)保護(hù)現(xiàn)場(chǎng),也就是說(shuō),CPU在進(jìn)入中斷服務(wù)函數(shù)后,有可能會(huì)破壞某些寄存器中的內(nèi)容。因此,一般在中斷服務(wù)函數(shù)中,要先保護(hù)現(xiàn)場(chǎng),然后再執(zhí)行中斷處理程序,在返回主程序以前,再恢復(fù)現(xiàn)場(chǎng),如任務(wù)6中的外部中斷函數(shù)所示。

3.中斷響應(yīng)時(shí)間所謂中斷響應(yīng)時(shí)間,是從查詢中斷請(qǐng)求標(biāo)志位開(kāi)始到轉(zhuǎn)向中斷入口地址所需要的機(jī)器周期數(shù)。

8051單片機(jī)的最短中斷響應(yīng)時(shí)間為3個(gè)機(jī)器周期。在系統(tǒng)中只有一個(gè)中斷源的情況下,中斷響應(yīng)時(shí)間都是大于3個(gè)機(jī)器周期而小于8個(gè)機(jī)器周期。但如果出現(xiàn)同級(jí)或高級(jí)中斷正在響應(yīng)或服務(wù)中需等待,則響應(yīng)時(shí)間要視具體情況來(lái)定。4.3.5中斷的應(yīng)用使用中斷功能時(shí),程序一般由主函數(shù)和中斷服務(wù)函數(shù)組成。CPU正常工作時(shí)運(yùn)行的程序稱為主函數(shù),處理隨機(jī)事件的程序叫做中斷服務(wù)函數(shù)。中斷有關(guān)特殊功能寄存器內(nèi)容的初始化在主函數(shù)中進(jìn)行設(shè)置。

1.中斷服務(wù)函數(shù)編寫中斷服務(wù)函數(shù)是一種特殊的函數(shù)。為了實(shí)現(xiàn)在C語(yǔ)言源程序中直接編寫中斷服務(wù)函數(shù)的需要,C51編譯器對(duì)函數(shù)的定義進(jìn)行了擴(kuò)展,增加了一個(gè)擴(kuò)展關(guān)鍵字interrupt。關(guān)鍵字interrupt是函數(shù)定義時(shí)的一個(gè)選項(xiàng),加上這個(gè)選項(xiàng)就可以將一個(gè)函數(shù)定義成中斷服務(wù)函數(shù)。

C51中定義中斷服務(wù)函數(shù)的一般格式如下:

void中斷函數(shù)名()interrupt中斷號(hào)using工作組

{中斷服務(wù)程序內(nèi)容

}中斷函數(shù)不能返回任何值,所以最前面用void。后面緊跟函數(shù)名,名字可以任意起,但不要與C語(yǔ)言中的關(guān)鍵字相同,最好與當(dāng)時(shí)的應(yīng)用有關(guān)。中斷函數(shù)并不傳入?yún)?shù),所以函數(shù)后面的小括號(hào)內(nèi)為空。中斷號(hào)就是指單片機(jī)中中斷源的序號(hào),詳見(jiàn)前述的表4.4,這個(gè)序號(hào)是編譯器識(shí)別不同中斷的唯一符號(hào),因此在寫中斷服務(wù)程序時(shí)一定要寫正確。最后面的“using工作組”是指該中斷函數(shù)使用單片機(jī)內(nèi)部數(shù)據(jù)存儲(chǔ)器中4組工作寄存器中的哪一組,在定義一個(gè)函數(shù)時(shí),using是一個(gè)選項(xiàng),如果不用該選項(xiàng),則由C51編譯器在編譯程序時(shí)自動(dòng)分配工作組,因此這部分通??梢允÷圆粚?。如:

voidint0(void)interrupt0

{

}上面的函數(shù)為函數(shù)名為int0的外部中斷0中斷服務(wù)函數(shù),在花括號(hào)里編寫該中斷服務(wù)函數(shù)的內(nèi)容?!谥袛喾?wù)程序內(nèi)容中,一般包括三部分:首先需要保護(hù)現(xiàn)場(chǎng),然后是中斷程序,中斷返回時(shí)還需要恢復(fù)現(xiàn)場(chǎng)。保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)是為了不使現(xiàn)場(chǎng)數(shù)據(jù)遭到破壞或造成混亂,保護(hù)現(xiàn)場(chǎng)前要關(guān)中斷,恢復(fù)現(xiàn)場(chǎng)之后再開(kāi)中斷。若有中斷嵌套,即保護(hù)現(xiàn)場(chǎng)后允許高優(yōu)先級(jí)中斷,則保護(hù)現(xiàn)場(chǎng)后應(yīng)開(kāi)中斷,同樣恢復(fù)現(xiàn)場(chǎng)前應(yīng)關(guān)中斷。小提示編寫中斷服務(wù)函數(shù)時(shí)遵循的原則:能在主程序中完成的功能就不要在中斷函數(shù)中寫,若非要在中斷函數(shù)中實(shí)現(xiàn)功能,那么一定要高效、簡(jiǎn)潔。

2.應(yīng)用舉例

【例4.7】任務(wù)5中的定時(shí)/計(jì)數(shù)器應(yīng)用除了可以用查詢方式實(shí)現(xiàn)以外,還可以用中斷方式來(lái)實(shí)現(xiàn)。解:程序如下:

#include<reg51.h>//利用定時(shí)計(jì)數(shù)器,中斷方式實(shí)現(xiàn)定時(shí)亮滅

unsignedchari;//定義全局變量i

voidmain()//主程序

{

i=0;

P1=0xff;

TMOD=0x01;//定時(shí)/計(jì)數(shù)器0工作于方式1,用于定時(shí)

TH0=(65536-5000)/256; //設(shè)置計(jì)數(shù)初值

TL0=(65536-5000)%256;

EA=1;

//開(kāi)總中斷ET0=1; //開(kāi)定時(shí)/計(jì)數(shù)器0中斷

TR0=1; //啟動(dòng)定時(shí)/計(jì)數(shù)器0while(1){if(i==20){i=0;P1=~P1;}}}voidtimer0(void)interrupt1 //定時(shí)/計(jì)數(shù)器0中斷服務(wù)函數(shù){i++; //每50ms,i加1TH0=(65536-5000)/256; //重裝初值

TL0=(65536-5000)%256;}

【例4.8】一交通路口設(shè)置有紅綠燈以及緊急按鈕,正常情況下,紅綠燈以1s的間隔輪流點(diǎn)亮,當(dāng)出現(xiàn)緊急情況(如救護(hù)車或者消防車有相應(yīng)緊急任務(wù),需要通行)時(shí),只要按一下緊急按鈕,則道路交通燈就會(huì)變成紅燈并持續(xù)1s時(shí)間,以禁止其他車輛通行,使消防車順利通過(guò)。試用單片機(jī)系統(tǒng)來(lái)模擬實(shí)現(xiàn)上述功能。分析:對(duì)于單片機(jī)而言,對(duì)通用I/O口編程可以實(shí)現(xiàn)將I/O口設(shè)置成高低電平來(lái)點(diǎn)亮或熄滅發(fā)光二極管以模擬紅綠燈,按鈕可以實(shí)現(xiàn)中斷控制。解:電路如圖4.17所示,將P1口的P1.0~P1.1分別接綠色和紅色發(fā)光二極管以模擬道路交通燈,P3.2(

)接一按鍵以模擬緊急按鈕。圖4.17用單片機(jī)系統(tǒng)來(lái)模擬交通燈控制程序如下:

#include<reg51.h>

sbitP1_0=P1^0;

sbitP1_1=P1^1;

voiddelay1s(); //聲明延時(shí)函數(shù)

voidmain()

{

unsignedchari=0;

EA=1; //開(kāi)總中斷

IT0=1; //外部中斷0下降沿觸發(fā)方式

EX0=1; //開(kāi)外部中斷0

TMOD=0x01; //定時(shí)/計(jì)數(shù)器0工作于方式1,用于定時(shí)

TH0=(65536-5000)/256; //設(shè)置計(jì)數(shù)初值

TL0=(65536-5000)%256;

TR0=1; //啟動(dòng)定時(shí)/計(jì)數(shù)器0While(1){P1_0=0; //綠燈被點(diǎn)亮

delay1s(); //延時(shí)1sP1_0=1; //綠燈被熄滅

P1_1=0; //紅燈被點(diǎn)亮

delay1s(); //延時(shí)1sP1_1=1; //紅燈被熄滅

}}voidintt0()interrupt0//外部中斷0中斷服務(wù)函數(shù){unsignedcharsaveled;saveled=P1; //保護(hù)現(xiàn)場(chǎng)P1_1=0; //紅燈被點(diǎn)亮

delay1s(); //延時(shí)1sP1_1=1; //紅燈被熄滅P1=saveled; //恢復(fù)現(xiàn)場(chǎng)}voiddelay1s(void) //延時(shí)1s的延時(shí)函數(shù){

unsignedchari;

i=0;

while(i!==20)

{

if(TF0==1)

{

i++;

TH0=(65536-5000)/256; //重裝計(jì)數(shù)初值

TL0=(65536-5000)%256;

TF0=0;

}

}}

【例4.9】圖4.18所示為故障判斷與顯示電路。四路故障信號(hào)通過(guò)與非門連接到單片機(jī)的外部中斷0輸入端,同時(shí)分別接到P1.0、P1.2、P1.4、P1.6上。當(dāng)系統(tǒng)的各部分正常時(shí),4個(gè)故障源輸入端全為低電平,顯示燈全滅;若某一部分出現(xiàn)故障,則對(duì)應(yīng)的輸入線由低電平變?yōu)楦唠娖?,從而引起中斷,?shí)現(xiàn)系統(tǒng)的故障顯示。試編程實(shí)現(xiàn)上述要求。圖4.18故障判斷與顯示電路解:程序如下:

#include“reg51.h”//包含寄存器定義頭文件

sbitP1_0=P1^0; //定義相關(guān)的位

sbitP1_1=P1^1;

sbitP1_2=P1^2;

sbitP1_3=P1^3;

sbitP1_4=P1^4;

sbitP1_5=P1^5;

sbitP1_6=P1^6;

sbitP1_7=P1^7;voidmain(){

unsignedchari;

IT0=1; //外部中斷0為邊沿觸發(fā)方式

EX0=1; //允許外部中斷0中斷

EA=1; //允許總中斷

while(1) //循環(huán)等待

{

i=P1;

if(!(i&=0x55))

P1|=0xff;

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論