關(guān)于中斷部分的小結
外部中斷信號是由P3口的P3.2和P3.3兩個(gè)管腳輸入的。
外部中斷程序編寫(xiě)流程:
一、外部中斷初始化:
在使用外部中斷前,先要設置相關(guān)特殊功能寄存器,即初始化過(guò)程;
1.開(kāi)CPU總中斷:EA=1;
2.開(kāi)外部中斷:
開(kāi)外部中斷0:EX0=1;
開(kāi)外部中斷1:EX1=1;
3.設置外部中斷觸發(fā)方式:
外部中斷0觸發(fā)控制位IT0;
當IT0=0時(shí),為電平觸發(fā)方式
當IT0=1時(shí),為邊沿觸發(fā)方式(下降沿有效)
外部中斷1觸發(fā)控制位IT1(同上);
4.外部中斷優(yōu)先級設置(可以不設置)
PX0=1;
PX1=1;
舉例如下:
void interrupt_init(void) // 中斷初始化
{
EA = 1; //開(kāi)總中斷
EX0 = 1; //開(kāi)外部中斷0
EX1 = 1; //開(kāi)外部中斷0
IT0 = 1; //外部中斷0下降沿觸發(fā)方式
IT1 = 0; //外部中斷1電平的觸發(fā)方式
}
二、主程序
主程序部分為你需要實(shí)現的功能,這部分和中斷幾乎沒(méi)什么太大關(guān)聯(lián),只不過(guò),在執行主程序時(shí),如果從外部來(lái)一個(gè)外部中斷信號,不得不放棄現在執行的任務(wù)而轉而執行中斷子程序;
三、中斷子程序
這部分主要便是對請求中斷成功后進(jìn)入中斷后,你需要執行什么任務(wù);
外部中斷子程序寫(xiě)法如下:
void INT_0() interrupt 0 using 0 //外部中斷0子程序
{
LED0 = ~LED0; //這句話(huà)代換成你所需要功能的C代碼
}
void INT_1() interrupt 2 using 2 //外部中斷1子程序
{
LED1 = 0; //這句話(huà)代換成你所需要功能的C代碼
}
完整外部中斷例程代碼如下:
#includereg52.h>
#define uchar unsigned char
sbit wr=P3^6;
sbit LED0 = P1^0;
sbit LED1 = P1^1;
void interrupt_init(void) // 中斷初始化
{
EA = 1; //開(kāi)總中斷
EX0 = 1; //開(kāi)外部中斷0
EX1 = 1; //開(kāi)外部中斷0
IT0 = 1; //外部中斷0下降沿觸發(fā)方式
IT1 = 0; //外部中斷1電平的觸發(fā)方式
}
void main(void)
{
wr=0; //低電平時(shí)第三列為獨立按鍵
interrupt_init();
while(1)
{
LED1 = 1;
}
}
void INT_0() interrupt 0 using 0 //外部中斷0子程序
{
LED0 = ~LED0;
}
void INT_1() interrupt 2 using 2 //外部中斷1子程序
{
LED1 = 0;
}
實(shí)現功能:初始燈1和2全滅;
當按下P3.2對應鍵盤(pán)1(矩陣鍵盤(pán)第三行第三列),向下降沿觸發(fā)外部中斷0子程序,按一次鍵1松手燈1亮,再按一次鍵1松手燈1滅;
當按下P3.3對應鍵盤(pán)2(矩陣鍵盤(pán)第四行第三列),送入低電平信號觸發(fā)外部中斷1子程序,按下鍵2燈2亮,松手燈2滅。
中斷的擴展:
一、定時(shí)器擴展為外部中斷源
在51單片機內部有兩個(gè)定時(shí)器/計數器T0和T1,在滿(mǎn)足中斷響應的情況下,當T0或T1的計數值從全1(0xFFFF)狀態(tài)進(jìn)入全0(0x0000)時(shí),此時(shí)就會(huì )產(chǎn)生定時(shí)器溢出中斷。
根據以上分析,我們只需要把計數器的初值設置為0xFFFF,那么只要計數輸入端再來(lái)一個(gè)脈沖就可以產(chǎn)生溢出中斷申請。設想我們把外部中斷輸入連接到計數器輸入端,就可以利用外部中斷申請的負脈沖產(chǎn)生定時(shí)器溢出中斷申請,而轉移到相應中斷服務(wù)程序入口地址。只要在(0x000B或0x001B)處存放外部中斷服務(wù)子程序,就可以達到目的。
具體步驟如下:
1.將定時(shí)/計數器T0或T1的計數輸入端(P3.3或P3.4)作為擴展外部中斷請求輸入端。
2.置定時(shí)/計數器T0或T1為工作模式2,計數方式—8位自動(dòng)裝載方式。
3.定時(shí)/計數器T0或T1的高8位和低8位都預置為全1。
4.在相應的中斷服務(wù)程序入口(0x000B或0x001B)處存放外部中斷服務(wù)子程序。
二、軟件查詢(xún)擴展外部中斷源
當需要的外部中斷源較多,采用第一種方法仍不能滿(mǎn)足實(shí)際需求,我們可以采用這種方法。
設有四個(gè)外部中斷源,INT00、INT01、 INT02 、INT03,這四個(gè)外部中斷請求源的輸入端通過(guò)一個(gè)4路的或非門(mén)連接到51單片機的/INT0引腳輸入端。只要4個(gè)外部中斷請求源中有一個(gè)或者一個(gè)以上的有效(高電平),就會(huì )產(chǎn)生一個(gè)負的/INT0信號向51單片機發(fā)出中斷申請。
為了確認在/INT0有效時(shí)究竟是INT00、INT01、 INT02 、INT03中哪個(gè)發(fā)出的中斷申請,可以通過(guò)軟件查詢(xún)的方法來(lái)確認。將四個(gè)中斷源輸入端INT00、INT01、 INT02 、INT03分別接到P1.0~P1.3這四個(gè)引腳上。一旦響應中斷,在中斷服務(wù)程序中CPU通過(guò)軟件查詢(xún)方法對P1.0~P1.3這四條線(xiàn)的電位進(jìn)行檢測,以確認提出中斷申請的中斷源。
當擴展的4個(gè)外部中斷源優(yōu)先級不同時(shí),軟件查詢(xún)的順序也應按照優(yōu)先級的的由高到低順序進(jìn)行。設擴展的4個(gè)外部中斷源的優(yōu)先級由高到低的順序是INT00到INT03,則軟件查詢(xún)順序為P1.0到P1.3。
51單片機相關(guān)文章:51單片機教程
評論