|
把單片機當(dāng)做一個APP,中斷系統(tǒng)就是其中的一項功能。這個功能強不強大,是衡量一個APP的標(biāo)準(zhǔn)。
這項功能的作用是幫助你處理突發(fā)事件的。我們做事都有個優(yōu)先級。你放在中斷系統(tǒng)里的事情肯定是要優(yōu)先處理的事情,所以當(dāng)中斷觸發(fā)的時候,單片機要停下它當(dāng)前做的事,來處理中斷中的事。也就是說,單片機要在中斷觸發(fā)時,停止運行主函數(shù)里的代碼,轉(zhuǎn)而運行中斷里的代碼。等到中斷的代碼運行完畢之后,再繼續(xù)運行主函數(shù)的代碼。
中斷這一項功能是要手動打開的,所以在主函數(shù)的一開始就要先打開中斷系統(tǒng)的開關(guān)。也就是EA=1,
EA=0表示關(guān)掉所有的中斷,EA=1表示打開。
中斷可以被6種方式觸發(fā),有以下六種。
1.外部中斷0,當(dāng)P3.2口輸入低電平時觸發(fā)
2.外部中斷1,當(dāng)P3.3口輸入低電平時觸發(fā)
3.串行口中斷,當(dāng)串口完成一幀數(shù)據(jù)的傳輸時
剩下的自己看書或者數(shù)據(jù)手冊╮(╯▽╰)╭
既然是六種觸發(fā)方式,那你就要在主函數(shù)一開始就要告訴單片機是那種。比如你想用P3.2口低電平觸發(fā),那么就要寫EX0=1,表示是外部中斷0,再寫IT0=1,表示低電平觸發(fā)。
如果你想要用串行口中斷,你首先得把單片機串口這項功能打開。寫下:
EA=1;//打開總中斷
ES=1;//打開串口中斷
REN=1;//允許串口接收
理論上就可以使用串口中斷。但是串口中斷的方式也不止一種。最常用的一種就是工作方式1。
將串口設(shè)置成工作方式1的代碼是SM0=0; SM1=1; 這種方式下,單片機與計算機,或者單片機與單片機之間傳輸數(shù)據(jù)是一幀一幀的傳輸。一幀數(shù)據(jù)有十位,第一位和最后一位是標(biāo)志位,用來告訴單片機發(fā)送的那一幀數(shù)據(jù)的開始和結(jié)束的,單片機會自動把這兩位剔除。每一幀數(shù)據(jù)發(fā)送完畢之后,一個叫TI的參數(shù)就會被置1,這時串行口中斷就會被觸發(fā);每一幀數(shù)據(jù)接收完畢之后,也會有一個參數(shù)被置1,叫RI,也會觸發(fā)中斷。
下面看一段代碼:
void main()
{
TMOD=0x20; //用定時器設(shè)置串口波特率 9600
REN=1; //串口初始化
SM0=0;
SM1=1;
EA=1; //開啟總中斷
ES=1;
while(1)
{
if(num==1) //判斷是否有串口數(shù)據(jù)的傳送
{
ES=0;
num=0;
SBUF=a; //發(fā)送數(shù)據(jù)a到SBUF,即將單片機的數(shù)據(jù)發(fā)送到計算機
while(!TI);
TI=0;
ES=1;
}
}
}
void ser() interrupt 4
{
RI=0;
P2=SBUF; //接收數(shù)據(jù)SBUF,即將計算機的數(shù)據(jù)接收。
a=SBUF;
num=1;
}
這段程序會先進行初始化,把該打開的打開,把串口中斷的模式設(shè)置好,然后進入while循環(huán)。while循環(huán)里的第一步,是計算機向單片機發(fā)送數(shù)據(jù),此時單片機已經(jīng)接收到了數(shù)據(jù),RI被置1,程序進入中斷,RI被清零,緩存在SBUF的數(shù)據(jù)賦值給a。然后跳出中斷,執(zhí)行if語句,關(guān)閉中斷,再將a賦值給發(fā)送緩存區(qū)。當(dāng)數(shù)據(jù)從發(fā)送緩存區(qū)進入計算機時,TI會被置1,進而通過while循環(huán)。然后在清零TI,打開中斷,以便發(fā)送下一幀數(shù)據(jù)。
|
評分
-
查看全部評分
|