1. 程式人生 > >微控制器的外部中斷(二)

微控制器的外部中斷(二)

前言:微控制器的中斷系統(一)


        80C51微控制器提供兩個外部中斷口:  INT0(P3.2)和INT1(P3.3)引腳輸入。這兩個引腳是功能複用引腳,既可以作為普通V0口,也可作為外部中斷輸入引腳。下面以部中斷0來講述。80C51微控制器在每個機器週期的S5P2期間掃描外部中斷輸入引腳的電平狀態。當外部中斷設定為下降沿觸發時,若處理器在連續兩個機器週期掃描到INT0引腳的電平先後為高電平和低電平時,就會設定中斷標誌位IE0為1,表示外部有中斷申請,該中斷申請訊號會一直保持,直到該中斷被響應,該標誌由內部硬體自動清除當外部中斷設定為電平觸發方式時,在外部中斷引腳INTo變為低電平時,IE0變為1,並一直保持為1,直到引腳INTo的輸入變為高電平時,IE0位才清0。因此,選擇低電平觸發方式時

,對INT0的電平持續時間有嚴格要求,必須保持INTo引腳為低電平,直到中斷被響應才 能變高,而且在中斷返回前必須變成高電平,以撤銷中斷請求。若低電平時問太短,則可能導致中斷不會被響應;若太長,在中斷子程式執行完後仍為低電平,則IE0會一直保持為1,這時會導致一次中斷請求,得到多次響應 ——————http://www.51dzw.com/embed/embed_110007.html

 

外部中斷0實驗 

按鍵作為外部中斷的產生源,按下按鍵,led狀態反轉。

圖一:微控制器引腳圖
圖二:獨立按鍵接線圖
圖三: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;
	}
}

 

參考文章:

外部中斷0中斷請求標誌位。