微控制器的外部中斷(二)
阿新 • • 發佈:2018-12-01
前言:微控制器的中斷系統(一)
80C51微控制器提供兩個外部中斷口: INT0(P3.2)和INT1(P3.3)引腳輸入。這兩個引腳是功能複用引腳,既可以作為普通V0口,也可作為外部中斷輸入引腳。下面以部中斷0來講述。80C51微控制器在每個機器週期的S5P2期間掃描外部中斷輸入引腳的電平狀態。當外部中斷設定為下降沿觸發時,若處理器在連續兩個機器週期掃描到INT0引腳的電平先後為高電平和低電平時,就會設定中斷標誌位IE0為1,表示外部有中斷申請,該中斷申請訊號會一直保持,直到該中斷被響應,該標誌由內部硬體自動清除。當外部中斷設定為電平觸發方式時,在外部中斷引腳INTo變為低電平時,IE0變為1,並一直保持為1,直到引腳INTo的輸入變為高電平時,IE0位才清0。因此,選擇低電平觸發方式時
外部中斷0實驗
按鍵作為外部中斷的產生源,按下按鍵,led狀態反轉。
程式:
#include<reg52.h> sbit key3=P3^2;//外部中斷0的引腳介面 sbit led=P2^0; void delay(int dat) { while(dat--); } void Int0Init() { IT0=1;//下降沿觸發 //IE0=0;請求標誌位,無觸發,或響應中斷後,硬體自動置0 EX0=1;//外部中斷0允許標誌 EA=1;//開啟總終端 } void main(void) { Int0Init(); while(1);//如果不寫while(1),微控制器在主程式中會不斷迴圈執行,導致不斷初始化 } void LedRever() interrupt 0 //0是外部中斷的中斷號 { delay(1000); if(key3==0) { led=~led; } }
比較有意思的是,中斷函式中增加了消抖部分。
如果不加消抖,可能想程式可能想多次執行這個中斷。如果消抖在外面,可能已經進入中斷了,還沒進行消抖。
外部中斷1實驗:
接線引腳圖如圖一、二、三。
普中教程程式碼:
/**************************************************************************************
* 外部中斷1實驗 *
實現現象:下載程式後按下K4按鍵可以對D1小燈狀態取反。
注意事項:無。
***************************************************************************************/
#include "reg52.h" //此檔案中定義了微控制器的一些特殊功能暫存器
typedef unsigned int u16; //對資料型別進行宣告定義
typedef unsigned char u8;
sbit k4=P3^3; //定義按鍵K4
sbit led=P2^0; //定義P20口是led
/*******************************************************************************
* 函 數 名 : delay
* 函式功能 : 延時函式,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數 名 : Int1Init()
* 函式功能 : 設定外部中斷1
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Int1Init()
{
//設定INT1
IT1=1;//跳變沿出發方式(下降沿)
EX1=1;//開啟INT1的中斷允許。
EA=1;//開啟總中斷
}
/*******************************************************************************
* 函 數 名 : main
* 函式功能 : 主函式
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
Int1Init(); // 設定外部中斷1
while(1);
}
/*******************************************************************************
* 函 數 名 : Int1() interrupt 2
* 函式功能 : 外部中斷0的中斷函式
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Int1() interrupt 2 //外部中斷1的中斷函式
{
delay(1000); //延時消抖
if(k4==0)
{
led=~led;
}
}
參考文章: