「STC8A8K64S4A12開發板」—微控制器外部中斷

前言

接著之前單機中斷原理,再跟大家說說外部中斷!

一、硬體電路設計

1。開發板IO口外部中斷硬體電路

STC8A8K64S4A12開發板上設計了4個使用者輕觸按鍵,其中KEY1和KEY2按鍵可以為外部中斷引腳提供觸發訊號,電路如下。

■ 開發板5個可用外部中斷引腳如下表:

表1:開發板外部中斷引腳分配

INT 對應IO口 功能描述 說明 備註

INT0 P3。2 外部中斷0 非獨立GPIO LCD顯示屏模組用。

INT1 P3。3 外部中斷1 非獨立GPIO nRF24L01模組介面J11使用。

INT2 P3。6 外部中斷2 非獨立GPIO W5500模組介面J7使用。

INT3 P3。7 外部中斷3 非獨立GPIO W5500模組介面J7使用。

INT4 P3。0 外部中斷4 非獨立GPIO 板載USB轉TTL電路用。

☆注:獨立GPIO表示開發板沒有其他的電路使用這個GPIO,非獨立GPIO說明開發板有其他電路用到了該GPIO。針對非獨立GPIO使用時需特別注意。

2。STC8A8K64S4A12系列MCU外部中斷

STC8A8K64S4A12系列MCU不是每一個GPIO口都可以作為外部中斷輸入使用,只有特定的GPIO口才可以作為特定的外部中斷輸入使用。STC8A8K64S4A12系列MCU具有5個外部中斷引腳,列表如下。

表2:STC8A8K64S4A12系列外部中斷引腳分配

序號 INT 對應IO口 功能描述 備註

1 INT0 P3。2 外部中斷0 中斷優先順序可設定0/1/2/3。

2 INT1 P3。3 外部中斷1 中斷優先順序可設定0/1/2/3。

3 INT2 P3。6 外部中斷2 只能為最低中斷優先順序0。

4 INT3 P3。7 外部中斷3 只能為最低中斷優先順序0。

5 INT4 P3。0 外部中斷4 中斷優先順序可設定0/1/2/3。

微控制器外部中斷引腳電平變化了,就有可能觸發中斷,進而執行中斷服務程式。電平變化有可能是高電平到低電平(即產生下降沿),也可能是低電平到高電平(即產生上升沿)。STC8A8K64S4A12系列外部中斷引腳支援的觸發方式是不一樣的。如下表。

表3:STC8A8K64S4A12系列外部中斷引腳觸發方式

序號 觸發方式 INT 備註

1 下降沿觸發 INT0、INT1、INT2、INT3、INT4

2 上升沿觸發 無 指只可上升沿觸發的意思。

3 上升沿或下降沿觸發 INT0、INT1

實現GPIO口電平變化的方式有很多,使用外部按鍵改變GPIO口電平是一種簡單直觀的方式。但在實際使用中微控制器的外部中斷功能是應用於一些模組或晶片的中斷引腳上,比如W5500乙太網模組、nRF24L01無線模組等。

下面介紹下帶有中斷引腳(IRQ)的模組或感測器與微控制器連線示意圖。

圖2:帶中斷引腳的模組或感測器與微控制器連線示意圖

■ 需要弄清楚的問題。

模組或感測器IRQ引腳的有效電平(低電平有效還是高電平有效)。

模組或感測器IRQ引腳一旦跳變到有效電平後需要微控制器執行的操作。

■ 延伸出的問題。

如果模組或感測器IRQ引腳是低有效電平,那麼產生的就是下降沿;如果模組或感測器IRQ引腳是高有效電平,那麼產生的就是上升沿。這就需要微控制器外部中斷引腳有匹配的觸發方式才可,如果沒有怎麼辦呢?

與模組或感測器IRQ引腳相連的微控制器引腳可以不是外部中斷引腳,而是普通的GPIO口嗎?

■ 回答延伸出的問題。

從STC8A8K64S4A12系列外部中斷引腳觸發方式表格中可以獲悉,微控制器INT0和INT1可選擇為上升沿或下降沿觸發方式,這基本可以滿足大部分的應用需求的。如果微控制器只有INT2、INT3或INT4(下降沿觸發方式)的外部中斷引腳可用,比較簡便的方式是對模組或感測器的IRQ訊號進行取反處理,硬體上加個反相器是一種做法,但務必考慮會有一個訊號延時的問題。

模組或感測器IRQ引腳一般是可以和微控制器GPIO口引腳相連的,這在程式設計時採用的就是查詢方式。也就是微控制器程式設計時不斷迴圈查詢與模組或感測器IRQ引腳相連的GPIO口狀態,若檢測到GPIO口跳變到有效電平後才會執行需要的操作。當微控制器使用中斷引腳與模組或感測器IRQ引腳相連時,設計程式便可採用中斷方式,後面會詳細介紹查詢方式和中斷方式的區別。

3。微控制器中斷方式和查詢方式

微控制器中斷方式,是事件觸發的,佔用的CPU資源相對很少。換言之開啟中斷之後,CPU可以做其他事情,只有當符合條件的事件產生時才會進入中斷,去執行中斷服務程式。舉例,針對STC8A8K64S4A12系列微控制器,前面介紹的下降沿中斷或上升沿中斷都是觸發中斷的條件,在這個條件不滿足時微控制器是不用理會外部中斷引腳的,而一旦條件滿足,如果程式中沒有其他同時發生的更高優先順序的中斷的話,CPU會立即執行該外部中斷對應的中斷服務函式。

微控制器查詢方式,就是在主函數里面不停迴圈,查詢埠狀態,這會佔用大量CPU資源。這時模組或感測器IRQ引腳是可以和微控制器普通IO口引腳相連的。這種方式的弊端:

佔用過多CPU資源,影響響應速度。

在處理事件多,處理流程複雜,函式巢狀執行的情況下,由於CPU處理不過來可能會丟失事件。(往往模組或感測器IRQ引腳跳變到有效電平的時間也是有限的,如果在有限的時間內沒有捕獲到有效訊號就會丟失事件)

☆注:微控制器查詢方式的缺點就是微控制器中斷方式的優點。當然,微控制器查詢方式的優點是可以使用普通IO口甚至不使用IO口。

4。外部中斷配置步驟

針對STC8A8K64S4A12系列微控制器5個外部中斷引腳,軟體的配置過程如下:

圖3:外部中斷軟體配置步驟

☆注:實驗例程即是按照上述配置步驟操作暫存器相關位實現,後有詳述。

二、軟體設計

1。暫存器解析

首先普及一個常用知識點:在操作微控制器暫存器時常說有的暫存器支援位定址,有的暫存器不支援位定址?這裡的位定址究竟是什麼含義?

位定址定義:對位地址中的內容進行位操作的定址方式稱為位定址。由於微控制器中只有內部RAM和特殊功能暫存器的部分單元有位地址,因此位定址只能對有位地址的這兩個空間進行定址操作。

微控制器中不是每個暫存器都支援位定址的,一般如果SFR(特殊功能暫存器)的地址值能被8整除,則該SFR可以進行位定址。舉例P0埠資料暫存器是支援位定址的。

圖4:P0埠資料暫存器

☆注:微控制器中暫存器地址值如不能被8整除,則該暫存器是不支援位定址的。針對STC8A8K64S4A12系列有些SFR是位於擴充套件RAM中,這些SFR不可以按照這個總結的規則去判定是否支援位定址。訪問位於擴充套件RAM中的SFR需要先操作P_SW2的BIT7才可,這個在用到時講解。

1。1。中斷允許暫存器IE

中斷允許暫存器IE支援位定址,該暫存器的B7位是微控制器所有中斷的總閘,即其他中斷位使能後,最後還必須將這個總中斷開啟才能開啟中斷,與外部中斷有關的還有B0和B2位,含義如下圖。

圖5:中斷允許暫存器

1。2。外部中斷和時鐘輸出控制暫存器INTCLKO2

外部中斷允許和時鐘輸出暫存器INTCLKO2不支援位定址,該暫存器的B4、B5和B6位是外部中斷2、外部中斷3和外部中斷4的中斷允許位。因為AUXR2暫存器不支援位定址,所以操作該暫存器位時,不可以直接“EX2=0;”進行操作INT2中斷允許位,參考下圖。

圖6:外部中斷和時鐘輸出控制暫存器

1。3。定時器/計數器中斷控制暫存器TCON

定時器/計數器中斷控制暫存器TCON支援位定址,該暫存器的B0位和B2位是選擇INT0和INT1中斷源型別的(可理解成中斷觸發方式),暫存器B1位和B3位是INT0和INT1中斷請求標誌,含義如下圖。

圖7:定時器/計數器中斷控制暫存器

☆注:微控制器中很多暫存器都像TCON暫存器一樣,暫存器關聯的微控制器外設不止一個,這就需要我們在操作暫存器時一定要按位操作,用不到的位千萬不要操作,否則在程式比較複雜、用到的外設比較多時,往往會遇到不可知問題。

2。外部中斷0實驗(下降沿中斷方式)

☆注:本節的實驗原始碼是在“實驗2-2-2: GPIO輸入按鍵檢測(多個c檔案)”的基礎上修改。本節對應的實驗原始碼是:“實驗2-4-1:外部中斷0(下降沿中斷方式)”。

2。1。工程需要用到的c檔案

本例需要用到的c檔案如下表所示,工程需要新增下表中的c檔案。

表4:實驗需要用到的c檔案

序號 檔名 字尾 功能描述

1 led 。c 包含與使用者led控制有關的使用者自定義函式。

2 exint 。c 外部中斷有關的使用者自定義函式。

3 delay 。c 包含使用者自定義延時函式。

2。2。標頭檔案引用和路徑設定

■ 需要引用的標頭檔案

#include “delay。h”

#include “led。h”

#include “exint。h”

1

2

3

■ 需要包含的標頭檔案路徑

本例需要包含的標頭檔案路徑如下表:

表5:標頭檔案包含路徑

序號 路徑 描述

1 …\ Source led。h、exint。h和delay。h標頭檔案在該路徑,所以要包含。

2 …\User STC8。h標頭檔案在該路徑,所以要包含。

MDK中點選魔術棒,開啟工程配置視窗,按照下圖所示新增標頭檔案包含路徑。

圖8:新增標頭檔案包含路徑

2。3。編寫程式碼

首先,在exint。c檔案中編寫外部中斷0初始化函式INT0_Init,程式碼如下。

程式清單:外部中斷0初始化函式

/***********************************************************

功能描述:外部中斷0初始化

入口引數:無

返回值:無

************************************************************/

void INT0_Init(void)

{

IE0 = 0; //將INT0中斷請求標誌位清“0”

EX0 = 1; //使能INT0中斷允許位

IT0 = 1; //選擇INT0為下降沿觸發方式

}

1

2

3

4

5

6

7

8

9

10

11

然後,編寫外部中斷服務函式,一旦進入中斷會執行翻轉藍色指示燈D3的任務,程式碼如下。

程式清單:中斷服務函式

/***********************************************************

功能描述:外部中斷服務程式

入口引數:無

返回值:無

************************************************************/

void INT0_Isr (void) interrupt 0

{

led_toggle(LED_3); //翻轉藍色指示燈D3

}

1

2

3

4

5

6

7

8

9

最後,在主函式中呼叫INT0初始化函式,開啟總中斷,在主迴圈中沒有任務,藍色指示燈D3變化來自於中斷。

程式碼清單:主函式

int main(void)

{

INT0_Init(); //外部中斷0的初始化配置

EA = 1; //允許總中斷

while (1)

{

; //無任務,說明LED亮滅來自於中斷

}

}

1

2

3

4

5

6

7

8

9

10

2。4。硬體連線

本實驗需要使用P3。2(外部中斷0引腳)連線到J26端子KEY1,因此需要按下圖所示連線杜邦線。

圖9:開發板連線圖

3。外部中斷0實驗(上升沿或下降沿中斷方式)

☆注:本節的實驗原始碼是在“實驗2-4-1:外部中斷0(下降沿中斷方式)”的基礎上修改。本節對應的實驗原始碼是:“實驗2-4-2:外部中斷0(上升沿或下降沿中斷方式)”。

3。1。程需要用到的c檔案

本實驗需要用到的標頭檔案以及新增標頭檔案包含路徑的方法請參考“實驗2-4-1:外部中斷0(下降沿中斷方式)”部分。

3。2。編寫程式碼

首先,在exint。c檔案中編寫外部中斷0初始化函式INT0_Init,程式碼如下。

程式清單:外部中斷0初始化函式

/***********************************************************

功能描述:外部中斷0初始化

入口引數:無

返回值:無

************************************************************/

void INT0_Init(void)

{

IE0 = 0; //將INT0中斷請求標誌位清“0”

EX0 = 1; //使能INT0中斷允許位

IT0 = 0; //選擇INT0為上升沿或下降沿觸發方式

}

1

2

3

4

5

6

7

8

9

10

11

然後,編寫外部中斷服務函式,一旦進入中斷會執行翻轉藍色指示燈D3的任務,程式碼如下。

程式清單:中斷服務函式

/***********************************************************

功能描述:外部中斷服務程式

入口引數:無

返回值:無

************************************************************/

void INT0_Isr (void) interrupt 0

{

led_toggle(LED_3); //翻轉藍色指示燈D3

}

1

2

3

4

5

6

7

8

9

最後,在主函式中呼叫INT0初始化函式,開啟總中斷,在主迴圈中沒有任務,藍色指示燈D3變化來自於中斷。

程式碼清單:主函式

int main(void)

{

INT0_Init(); //外部中斷0的初始化配置

EA = 1; //允許總中斷

while (1)

{

; //無任務,說明LED亮滅來自於中斷

}

}

1

2

3

4

5

6

7

8

9

10

3。3。硬體連線

本實驗需要使用P3。2(外部中斷0引腳)連線到J26端子KEY1,因此需要按下圖所示連線杜邦線。

圖10:開發板連線圖

4。外部中斷0實驗(上升沿或下降沿中斷方式)

☆注:本節的實驗原始碼是在“實驗2-4-1:外部中斷0(下降沿中斷方式)”的基礎上修改。本節對應的實驗原始碼是:“實驗2-4-3:外部中斷1(下降沿中斷方式)”。

4。1。工程需要用到的c檔案

本實驗需要用到的標頭檔案以及新增標頭檔案包含路徑的方法請參考“實驗2-4-1:外部中斷0(下降沿中斷方式)”部分。

4。2。編寫程式碼

首先,在exint。c檔案中編寫外部中斷1初始化函式INT1_Init,程式碼如下。

程式清單:外部中斷1初始化函式

/***********************************************************

功能描述:外部中斷1初始化

入口引數:無

返回值:無

************************************************************/

void INT1_Init(void)

{

IE1 = 0; //將INT1中斷請求標誌位清“0”

EX1 = 1; //使能INT1中斷允許位

IT1 = 1; //選擇INT1為下降沿觸發方式

}

1

2

3

4

5

6

7

8

9

10

11

然後,編寫外部中斷服務函式,一旦進入中斷會執行翻轉藍色指示燈D3的任務,程式碼如下。

程式清單:中斷服務函式

/***********************************************************

功能描述:外部中斷服務程式

入口引數:無

返回值:無

************************************************************/

void INT1_Isr (void) interrupt 2

{

led_toggle(LED_3); //翻轉藍色指示燈D3

}

1

2

3

4

5

6

7

8

9

最後,在主函式中呼叫INT1初始化函式,開啟總中斷,在主迴圈中沒有任務,藍色指示燈D3變化來自於中斷。

程式碼清單:主函式

int main(void)

{

INT1_Init(); //外部中斷1的初始化配置

EA = 1; //允許總中斷

while (1)

{

; //無任務,說明LED亮滅來自於中斷

}

}

1

2

3

4

5

6

7

8

9

10

4。3。硬體連線

本實驗需要使用P3。3(外部中斷1引腳)連線到J26端子KEY1,因此需要按下圖所示連線杜邦線。

圖11:開發板連線圖

5。外部中斷1實驗(上升沿或下降沿中斷方式)

☆注:本節的實驗原始碼是在“實驗2-4-3:外部中斷1(下降沿中斷方式)”的基礎上修改。本節對應的實驗原始碼是:“實驗2-4-4:外部中斷1(上升沿或下降沿中斷方式)”。

5。1。工程需要用到的c檔案

本實驗需要用到的標頭檔案以及新增標頭檔案包含路徑的方法請參考“實驗2-4-1:外部中斷0(下降沿中斷方式)”部分。

5。2。編寫程式碼

首先,在exint。c檔案中編寫外部中斷1初始化函式INT1_Init,程式碼如下。

程式清單:外部中斷1初始化函式

/***********************************************************

功能描述:外部中斷1初始化

入口引數:無

返回值:無

************************************************************/

void INT1_Init(void)

{

IE1 = 0; //將INT1中斷請求標誌位清“0”

EX1 = 1; //使能INT1中斷允許位

IT1 = 0; //選擇INT1為上升沿或下降沿觸發方式

}

1

2

3

4

5

6

7

8

9

10

11

然後,編寫外部中斷服務函式,一旦進入中斷會執行翻轉藍色指示燈D3的任務,程式碼如下。

程式清單:中斷服務函式

/***********************************************************

功能描述:外部中斷服務程式

入口引數:無

返回值:無

************************************************************/

void INT1_Isr (void) interrupt 2

{

led_toggle(LED_3); //翻轉藍色指示燈D3

}

1

2

3

4

5

6

7

8

9

最後,在主函式中呼叫INT1初始化函式,開啟總中斷,在主迴圈中沒有任務,藍色指示燈D3變化來自於中斷。

程式碼清單:主函式

int main(void)

{

INT1_Init(); //外部中斷1的初始化配置

EA = 1; //允許總中斷

while (1)

{

; //無任務,說明LED亮滅來自於中斷

}

}

1

2

3

4

5

6

7

8

9

10

5。3。硬體連線

本實驗需要使用P3。3(外部中斷1引腳)連線到J26端子KEY1,因此需要按下圖所示連線杜邦線。

圖12:開發板連線圖

6。外部中斷2實驗(下降沿中斷方式)

☆注:本節的實驗原始碼是在“實驗2-4-1:外部中斷0(下降沿中斷方式)”的基礎上修改。本節對應的實驗原始碼是:“實驗2-4-5:外部中斷2(下降沿中斷方式)”。

6。1。工程需要用到的c檔案

本實驗需要用到的標頭檔案以及新增標頭檔案包含路徑的方法請參考“實驗2-4-1:外部中斷0(下降沿中斷方式)”部分。

6。2。編寫程式碼

首先,在exint。c檔案中編寫外部中斷2初始化函式INT2_Init,程式碼如下。

程式清單:外部中斷2初始化函式

int main(void)

/***********************************************************

功能描述:外部中斷2初始化

入口引數:無

返回值:無

************************************************************/

void INT2_Init(void)

{

INTCLKO |= 0x10; //使能INT2中斷允許位

}

1

2

3

4

5

6

7

8

9

10

然後,編寫外部中斷服務函式,一旦進入中斷會執行翻轉藍色指示燈D3的任務,程式碼如下。

程式清單:中斷服務函式

/***********************************************************

功能描述:外部中斷服務程式

入口引數:無

返回值:無

************************************************************/

void INT2_Isr (void) interrupt 10

{

led_toggle(LED_3); //翻轉藍色指示燈D3

}

1

2

3

4

5

6

7

8

9

最後,在主函式中呼叫INT2初始化函式,開啟總中斷,在主迴圈中沒有任務,藍色指示燈D3變化來自於中斷。

程式碼清單:主函式

int main(void)

{

INT2_Init(); //外部中斷2的初始化配置

EA = 1; //允許總中斷

while (1)

{

; //無任務,說明LED亮滅來自於中斷

}

}

1

2

3

4

5

6

7

8

9

10

6。3。硬體連線

本實驗需要使用P3。6(外部中斷2引腳)連線到按鍵KEY2,因此需要按下圖所示連線短路帽。

圖13:開發板連線圖

7。外部中斷3實驗(下降沿中斷方式)

==☆注:本節的實驗原始碼是在“實驗2-4-1:外部中斷0(下降沿中斷方式)”的基礎上修改。本節對應的實驗原始碼是:“實驗2-4-6:外部中斷3(下降沿中斷方式)”。 ==

7。1。工程需要用到的c檔案

本實驗需要用到的標頭檔案以及新增標頭檔案包含路徑的方法請參考“實驗2-4-1:外部中斷0(下降沿中斷方式)”部分。

7。2。編寫程式碼

首先,在exint。c檔案中編寫外部中斷3初始化函式INT3_Init,程式碼如下。

程式清單:外部中斷3初始化函式

/***********************************************************

功能描述:外部中斷3初始化

入口引數:無

返回值:無

************************************************************/

void INT3_Init(void)

{

INTCLKO |= 0x20; //使能INT3中斷允許位

}

1

2

3

4

5

6

7

8

9

然後,編寫外部中斷服務函式,一旦進入中斷會執行翻轉藍色指示燈D3的任務,程式碼如下。

程式清單:中斷服務函式

/***********************************************************

功能描述:外部中斷服務程式

入口引數:無

返回值:無

************************************************************/

void INT3_Isr (void) interrupt 11

{

led_toggle(LED_3); //翻轉使用者指示燈D3

}

1

2

3

4

5

6

7

8

9

最後,在主函式中呼叫INT3初始化函式,開啟總中斷,在主迴圈中沒有任務,藍色指示燈D3變化來自於中斷。

程式碼清單:主函式

int main(void)

{

INT3_Init(); //外部中斷3的初始化配置

EA = 1; //允許總中斷

while (1)

{

; //無任務,說明LED亮滅來自於中斷

}

}

1

2

3

4

5

6

7

8

9

10

7。3。硬體連線

本實驗需要使用P3。7(外部中斷3引腳)連線到按鍵KEY1,因此需要按下圖所示連線短路帽。

圖14:開發板連線圖

8。外部中斷4實驗(下降沿中斷方式)

==☆注:本節的實驗原始碼是在“實驗2-4-1:外部中斷0(下降沿中斷方式)”的基礎上修改。本節對應的實驗原始碼是:“實驗2-4-7:外部中斷4(下降沿中斷方式)”。 ==

8。1。工程需要用到的c檔案

本實驗需要用到的標頭檔案以及新增標頭檔案包含路徑的方法請參考“實驗2-4-1:外部中斷0(下降沿中斷方式)”部分。

8。2。編寫程式碼

首先,在exint。c檔案中編寫外部中斷4初始化函式INT4_Init,程式碼如下。

程式清單:外部中斷4初始化函式

/***********************************************************

功能描述:外部中斷4初始化

入口引數:無

返回值:無

************************************************************/

void INT4_Init(void)

{

INTCLKO |= 0x40; //使能INT4中斷允許位

}

1

2

3

4

5

6

7

8

9

然後,編寫外部中斷服務函式,一旦進入中斷會執行翻轉藍色指示燈D3的任務,程式碼如下。

程式清單:中斷服務函式

/***********************************************************

功能描述:外部中斷服務程式

入口引數:無

返回值:無

************************************************************/

void INT4_Isr (void) interrupt 16

{

led_toggle(LED_3); //翻轉使用者指示燈D3

}

1

2

3

4

5

6

7

8

9

最後,在主函式中呼叫INT4初始化函式,開啟總中斷,在主迴圈中沒有任務,藍色指示燈D3變化來自於中斷。

程式碼清單:主函式

int main(void)

{

INT4_Init(); //外部中斷4的初始化配置

EA = 1; //允許總中斷

while (1)

{

; //無任務,說明LED亮滅來自於中斷

}

}

1

2

3

4

5

6

7

8

9

10

8。3。硬體連線

本實驗需要使用P3。0(外部中斷4引腳)連線到J26端子KEY1,因此需要按下圖所示連線杜邦線。

圖15:開發板連線圖

9。多個外部中斷實驗

==☆注:本節的實驗原始碼是在“實驗2-4-1:外部中斷0(下降沿中斷方式)”的基礎上修改。本節對應的實驗原始碼是:“實驗2-4-8:多個外部中斷”。 ==

9。1。工程需要用到的c檔案

本實驗需要用到的標頭檔案以及新增標頭檔案包含路徑的方法請參考“實驗2-4-1:外部中斷0(下降沿中斷方式)”部分。

9。2。編寫程式碼

首先,在exint。c檔案中編寫外部中斷0初始化函式INT0_Init和外部中斷1初始化函式INT1_Init,程式碼如下。

程式清單:外部中斷0初始化函式

/***********************************************************

功能描述:外部中斷0初始化

入口引數:無

返回值:無

************************************************************/

void INT0_Init(void)

{

IE0 = 0; //將INT0中斷請求標誌位清“0”

EX0 = 1; //使能INT0中斷允許位

IT0 = 1; //選擇INT0為下降沿觸發方式

/* 將INT0優先順序設定為最低優先順序 */

IP &= 0xFE; //將PX0位置0

IPH &= 0xFE; //將PX0H位置0

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

程式清單:外部中斷1初始化函式

/***********************************************************

功能描述:外部中斷1初始化

入口引數:無

返回值:無

************************************************************/

void INT1_Init(void)

{

IE1 = 0; //將INT1中斷請求標誌位清“0”

EX1 = 1; //使能INT1中斷允許位

IT1 = 1; //選擇INT1為下降沿觸發方式

/* 將INT1優先順序設定為最高優先順序 */

IP |= 0x04; //將PX1位置1

IPH |= 0x04; //將PX1H位置1

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

然後,編寫外部中斷服務函式,一旦進入外部中斷0會執行翻轉4次藍色指示燈D3的任務,進入外部中斷1會執行翻轉4次藍色指示燈D4的任務,程式碼如下。

程式清單:中斷服務函式

/***********************************************************

功能描述:外部中斷服務程式

入口引數:無

返回值:無

************************************************************/

void INT0_Isr (void) interrupt 0

{

led_on(LED_3); //點亮使用者指示燈D3

delay_ms(200);

led_off(LED_3); //熄滅使用者指示燈D3

delay_ms(100);

led_on(LED_3); //點亮使用者指示燈D3

delay_ms(200);

led_off(LED_3); //熄滅使用者指示燈D3

delay_ms(100);

led_on(LED_3); //點亮使用者指示燈D3

delay_ms(200);

led_off(LED_3); //熄滅使用者指示燈D3

delay_ms(100);

led_on(LED_3); //點亮使用者指示燈D3

delay_ms(200);

led_off(LED_3); //熄滅使用者指示燈D3

delay_ms(100);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

程式清單:中斷服務函式

/***********************************************************

功能描述:外部中斷服務程式

入口引數:無

返回值:無

************************************************************/

void INT1_Isr (void) interrupt 2

{

led_on(LED_4); //點亮使用者指示燈D4

delay_ms(200);

led_off(LED_4); //熄滅使用者指示燈D4

delay_ms(100);

led_on(LED_4); //點亮使用者指示燈D4

delay_ms(200);

led_off(LED_4); //熄滅使用者指示燈D4

delay_ms(100);

led_on(LED_4); //點亮使用者指示燈D4

delay_ms(200);

led_off(LED_4); //熄滅使用者指示燈D4

delay_ms(100);

led_on(LED_4); //點亮使用者指示燈D4

delay_ms(200);

led_off(LED_4); //熄滅使用者指示燈D4

delay_ms(100);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

最後,在主函式中呼叫INT0和INT1初始化函式,開啟總中斷。在主迴圈中沒有任務,藍色指示燈D3和藍色指示燈D4變化來自於中斷。

程式碼清單:主函式

int main(void)

{

INT0_Init(); //外部中斷0的初始化配置

INT1_Init(); //外部中斷1的初始化配置

EA = 1; //允許總中斷

while (1)

{

; //無任務,說明LED亮滅來自於中斷

}

}

1

2

3

4

5

6

7

8

9

10

11

9。3。硬體連線

本實驗需要使用P3。2(外部中斷0引腳)連線到J26端子KEY1,P3。3(外部中斷1引腳)連線到J26端子KEY2,因此需要按下圖所示連線杜邦線。

圖16:開發板連線圖

總結

以上就是今天要講的內容,大家看完不妨思考一下:根據本例實驗現象分析INT0和INT1誰的中斷優先順序高?為什麼?