在本教程中,我们将学习如何在PIC微控制器中使用外部中断,以及为什么/在何处需要它们。这是PIC教程序列的一部分,我们从头开始学习PIC微控制器。因此,本教程假定您熟悉如何使用MPLABX对PIC MCU进行编程以及如何将LCD与PIC接口。如果没有,请退回它们各自的链接并阅读它们的内容,因为我将跳过此处已经介绍的大多数信息。
所需材料:
- PIC16F877A性能评估板
- 16x2 LCD显示屏
- 按钮
- 连接线
- 面包板
- PicKit 3
什么是中断以及在哪里使用它们:
在开始编程PIC微控制器中断之前,让我们了解一个中断实际上是什么以及我们将在哪里使用它们。此外,单片机中的中断类型很多,PIC16F877A大约有15种中断。现在,让我们不要将它们全部混为一谈。
所以!什么是微控制器中的中断?
众所周知,微控制器用于执行一组预定义(编程)的激活,这些激活根据输入触发必要的输出。但是,当您的微控制器忙于执行一段代码时,可能会出现紧急情况,您的另一段代码需要立即关注。需要立即注意的另一段代码应视为中断。
例如:让我们考虑到您正在手机上玩自己喜欢的游戏,而手机内的控制器(假设)正忙于扔掉所有您享受游戏所需的图形。但是,突然之间,你的女朋友打了你的电话。现在,最糟糕的事情是您的手机控制器因为忙于玩游戏而忽略了女友的呼叫。为了防止发生这种噩梦,我们使用了一种称为中断的方法。
这些中断将始终处于活动状态,以列出要执行的某些特定操作,并在它们发生时执行一段代码,然后返回正常功能。这段代码称为中断服务程序(ISR)。强制中断的一个实际项目是“使用PIC单片机的数字车速表和里程表电路”
在单片机中,有两种主要的中断类型。它们是外部中断和内部中断。内部中断发生在Microntroller内部,用于执行任务,例如定时器中断,ADC中断等。这些中断由软件触发,分别完成定时器操作或ADC操作。
外部中断是可以由用户触发的中断。在此程序中,我们将学习如何通过按钮触发中断来使用外部中断。我们将使用LCD来显示从0到1000递增的数字,并且当触发中断时,我们应该从中断服务程序ISR通知它,然后继续返回递增数字。
电路图和说明:
上图给出了使用PIC16F877中断的电路图。您只需要像在连接LCD教程中所做的那样,将LCD连接到PIC。
现在连接中断引脚,我们应该查看数据表,以了解PIC的哪个引脚用于外部中断。在我们的情况下,我ÑPIC16F877A的33次销RBO / INT用于外部中断。除此引脚外,您不能使用任何其他引脚。下表显示了此电路图的引脚连接。
序号 |
针号 |
引脚名称 |
连接到 |
1个 |
21 |
RD2 |
LCD的RS |
2 |
22 |
RD3 |
LCD的E |
3 |
27 |
RD4 |
LCD D4 |
4 |
28 |
RD5 |
LCD D5 |
5 |
29 |
RD6 |
LCD D6 |
6 |
30 |
RD7 |
LCD D7 |
7 |
33 |
RBO / INT |
按钮 |
我们已经在端口B上启用了内部上拉电阻,因此我们可以通过按钮将RB0引脚直接接地。因此,只要此引脚变为低电平,就会触发中断。
可以如下所示在面包板上进行连接。
如果您一直在遵循我们的教程,那么您应该已经熟悉我在这里使用的Perf板。如果没有,您只需要按照电路图考虑就可以了,您将可以正常工作。
PIC单片机中的中断仿真:
此项目的仿真是使用Proteus进行的。
模拟项目时,您应该在LCD显示屏上看到一个数字序列递增。这在主循环内发生,每当按下按钮时,LCD都应显示它已进入ISR。您可以在代码中进行修改,然后在此处尝试进行测试。
代码说明:
该项目的完整代码可以在本教程的末尾找到。但是,该程序分为多个重要部分,为便于您更好地理解,下面对其进行了说明。
像所有程序一样,我们必须通过为程序中使用的引脚定义引脚配置来开始代码。同样在这里,我们需要定义我们使用RB0 / INT作为外部中断引脚,而不是输入或输出引脚。线下的代码使PORTB的内部上拉电阻通过使7个位为0。
OPTION_REG = 0b00000000;
然后,我们启用全局/外围中断,并声明我们将RB0用作外部中断引脚。
GIE = 1; //启用全局中断PEIE = 1; //启用外设中断INTE = 1; //使能RB0作为外部中断引脚
一旦将RB0引脚定义为外部中断引脚,每当它变为低电平时,外部中断标志INTF将变为1,并且由于将调用中断服务程序(ISR),因此将执行void中断功能中的代码。
void interrupt ISR_example(){if(INTF == 1)//检测到外部中断{Lcd_Clear(); Lcd_Set_Cursor(1,1); Lcd_Print_String(“输入的ISR”); INTF = 0; //完成后清除中断标志__delay_ms(2000); Lcd_Clear(); }}
如您所见,我将中断函数命名为ISR_example。您可以根据自己的意愿命名。在中断函数内部,我们将检查INTF标志是否为高电平并执行所需的操作。完成例程后,清除中断标志非常重要。只有这样,程序才会返回到void main函数。此清除必须通过使用生产线的软件来完成
INTF = 0; //完成后清除中断标志
在主要功能内部,我们仅每500 ms递增一个数字,并将其显示在LCD屏幕上。我们没有任何特定的行来检查RB0引脚的状态。中断将始终保持活动状态,每当按下按钮时,它将跳出void main并执行ISR中的行。
Lcd_Set_Cursor(2,1); Lcd_Print_String(“内部主循环”); 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); 数字++;
PIC16F877A中断的工作:
一旦了解了中断的工作原理,您就可以在硬件上进行尝试,并尝试解决它。此处给出的该程序是外部中断的一个非常基本的示例,其中,当检测到中断时,它仅更改LCD屏幕的显示。
可以在下面的视频中找到项目的完整工作。希望您了解中断以及在何处/如何使用它们。如果您有任何疑问,可以通过论坛或评论部分与我联系。