在本教程中,我們將學(xué)習(xí)如何 在PIC微控制器中使用外部中斷 ,以及為什么/在哪里需要它們。
所需材料:
- PIC16F877A 性能板
- 16x2 液晶顯示屏
- 按鈕
- 連接線
- 面包板
- 圖片套件 3
什么是中斷以及在哪里使用它們:
在介紹如何對PIC微控制器中斷進行編程之前,讓我們了解中斷實際上是什么以及我們需要在哪里使用它們。此外,微控制器中有很多類型的中斷,PIC16F877A大約有15種中斷。讓我們暫時不要將它們?nèi)炕煜轿覀兊哪X海中。
所以!什么是微控制器中的中斷?
眾所周知,微控制器用于執(zhí)行一組預(yù)定義(編程)激活,根據(jù)輸入觸發(fā)必要的輸出。但是,當(dāng)您的微控制器忙于執(zhí)行一段代碼時,可能會出現(xiàn)需要立即關(guān)注另一段代碼的緊急情況。另一段需要立即注意的代碼應(yīng)被視為中斷。
例如:讓我們考慮您正在手機上玩自己喜歡的游戲,而手機內(nèi)的控制器(假設(shè))正忙于拋出您享受游戲所需的所有圖形。但是,突然你的女朋友撥打了你的號碼。現(xiàn)在,最糟糕的事情是您的手機控制器忽略了您的女朋友電話,因為您正忙于玩游戲。為了防止這種噩夢的發(fā)生,我們使用了一種稱為中斷的東西。
這些中斷將始終處于活動狀態(tài),列出某些特定操作的發(fā)生,當(dāng)它們發(fā)生時,它們執(zhí)行一段代碼,然后返回正常功能。這段代碼稱為 中斷服務(wù)例程 (ISR)。 一個必須中斷的實際項目是“使用PIC微控制器的數(shù)字車速表和里程表電路”
在微控制器中,有兩種主要 類型的中斷 。它們是外部中斷和內(nèi)部中斷。內(nèi)部中斷發(fā)生在微型控制器內(nèi)部,用于執(zhí)行任務(wù),例如定時器中斷、ADC 中斷等。這些中斷由軟件觸發(fā),分別完成定時器操作或ADC操作。
外部中斷是可以由用戶觸發(fā)的中斷。在這個程序中,我們將學(xué)習(xí)如何通過使用按鈕觸發(fā)中斷來 使用外部中斷 。我們將使用 LCD 顯示從 0 到 1000 遞增的數(shù)字,當(dāng)觸發(fā)中斷時,我們應(yīng)該從中斷服務(wù)例程 **ISR **通知它,然后繼續(xù)返回到遞增數(shù)字。
電路圖及說明:
使用PIC16F877中斷的電路圖如上圖所示。您只需將LCD連接到PIC,就像我們在接口LCD教程中所做的那樣。
現(xiàn)在要連接中斷引腳,我們應(yīng)該查看數(shù)據(jù)表,以了解PIC的哪個引腳用于外部中斷。在我們的例子中,PIC16F877A 33^RD^引腳 RBO/INT 用于外部中斷。您不能使用此引腳以外的任何其他引腳。此電路圖的引腳連接如下表所示。
S.No: | 引腳編號 | 引腳名稱 | 已連接到 |
---|---|---|---|
1 | 21 | RD2 | 液晶顯示器的 RS |
2 | 22 | RD3 | 液晶顯示器的E |
3 | 27 | RD4 | 液晶屏D4 |
4 | 28 | RD5 | 液晶屏D5 |
5 | 29 | 太平洋地區(qū)技術(shù) | 液晶屏D6 |
6 | 30 | RD7 | 液晶屏D7 |
7 | 33 | RBO/INT | 按鈕 |
我們在端口 B 上啟用了內(nèi)部上拉電阻,因此我們可以通過按鈕將 RB0 引腳直接接地。因此,每當(dāng)該引腳變?yōu)榈碗娖綍r,就會觸發(fā)中斷。
可以在面包板上進行連接,如下所示。
如果您一直在學(xué)習(xí)我們的教程,您應(yīng)該已經(jīng)熟悉我在這里使用的這個 Perf 板。如果沒有,你不需要考慮太多,只需按照電路圖,你就會讓事情正常。
PIC微控制器中的中斷仿真:
模擬項目時,您應(yīng)該會在LCD顯示屏上看到一系列數(shù)字遞增。這發(fā)生在主回路內(nèi),每當(dāng)按下按鈕時,LCD都應(yīng)顯示它已進入ISR。您可以在代碼中進行修改并嘗試在此處進行測試。
代碼說明:
可以在本教程末尾找到此項目的完整代碼。但是,該程序被分成重要的塊,并在下面解釋,以便您更好地理解。
像所有程序一樣,我們必須通過定義程序中使用的引腳的引腳配置來開始代碼。同樣在這里,我們需要定義我們使用RB0 / INT作為外部中斷引腳,而不是輸入或輸出引腳。下面的代碼行使能端口B上的內(nèi)部上拉電阻,方法是使7^千^位為 0。
OPTION_REG = 0b00000000;
然后我們啟用全局/外設(shè)中斷,并聲明我們使用RB0作為外部中斷引腳。
GIE=1; //Enable Global Interrupt
PEIE=1; //Enable the Peripheral Interrupt
INTE = 1; //Enable RB0 as external Interrupt pin
一旦RB0引腳被定義為外部中斷引腳,每次它變低時,外部中斷標志INTF將變?yōu)?,并且void中斷函數(shù)中的代碼將被執(zhí)行,因為將調(diào)用中斷服務(wù)例程(ISR)。
void interrupt ISR_example()
{
if (INTF==1) //External Interrupt detected
{
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Print_String(" Entered ISR");
INTF = 0; // clear the interrupt flag after done with it
__delay_ms(2000);
Lcd_Clear();
}
}
如您所見,我將中斷函數(shù)命名為 ISR_example。您可以根據(jù)自己的意愿命名。在中斷函數(shù)中,我們將檢查 INTF 標志是否為高并執(zhí)行所需的操作。完成例程后清除中斷標志非常重要。只有這樣,程序才會返回到 void 主函數(shù)。這種清算必須通過使用生產(chǎn)線的軟件來完成
INTF = 0; // clear the interrupt flag after done with it
在主功能中,我們只需每 500 毫秒增加一個數(shù)字并將其顯示在 LCD 屏幕上。我們沒有任何特定的線路來檢查RB0引腳的狀態(tài)。中斷將始終保持活動狀態(tài),每當(dāng)按下按鈕時,它都會跳出空主線并執(zhí)行 ISR 中的行。
Lcd_Set_Cursor(2,1);
Lcd_Print_String("Inside Main Loop");
Lcd_Set_Cursor(1,1);
Lcd_Print_String("Number: ");
Lcd_Print_Char(ch1+'0');
Lcd_Print_Char(ch2+'0');
Lcd_Print_Char(ch3+'0');
Lcd_Print_Char(ch4+'0');
__delay_ms(500);
number++;
PIC16F877A 的工作中斷:
一旦您了解了 中斷的工作原理 ,您就可以在硬件上嘗試并擺弄它。這里給出的這個程序是一個非常基本的外部中斷示例,它只是在檢測到中斷時改變LCD屏幕的顯示。
-
PIC16F877A
+關(guān)注
關(guān)注
2文章
43瀏覽量
21781 -
PIC微控制器
+關(guān)注
關(guān)注
0文章
17瀏覽量
7390 -
外部中斷
+關(guān)注
關(guān)注
1文章
131瀏覽量
15801
發(fā)布評論請先 登錄
相關(guān)推薦
評論