前言

本文主要介绍Arduino UNO开发板的中断和开发板上的外部中断操作。


所需材料:

1.Arduino开发环境:Arduino IDE 1.8.10
2.仿真软件:Proteus 8.13
3.开发板:Arduino UNO

一、中断

1.中断

中断(Interrupt)是计算机的一个重要概念,当CPU执行时原本是按程序指令一条一条向下顺序执行的。 但如果此时发生了某一事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务,其中中断服务中执行的中断服务函数简称为ISR). 待CPU将事件B处理完毕后, 再回到原来被中断的地方继续执行程序(中断返回),这一过程称为中断 。实现中断功能的硬件和软件统称中断系统。一个完整的中断处理过程包括中断请求、中断响应、中断处理和中断返回。
中断的示意图如图所示:
在这里插入图片描述

2.中断的类型

Arduino Uno支持三种类型的中断:
硬件中断:由特定引脚上的外部中断信号触发中断。在开发板上,有两个引脚可直接触发外部中断(D2引脚对应中断向量0,D3引脚对应中断向量1)
引脚更改引发中断:使一个端口可以触发外部中断,并且将可以触发外部中断的分配到端口任何引脚上。
定时器中断:内部定时器生成的中断,在软件中操作。

二、外部中断操作

1.外部中断函数

代码如下:

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
/*描述:配置外部中断源,使在引脚(pin)处触发符合设定模式(mode)的外部中断时,CPU进入
 *     中断服务程序(ISR)中执行。
 *参数:pin:接收外部中断信号的引脚
 *     ISR:中断服务函数名,注意:
 *            1.函数中不能使用delay( ) 函数和millis( ) 函数
 *            2.不能接收串口数据。
 *            3.仅使用全局变量,这些变量应声明为volatile。
 *            4.函数不能带有任何参数,也没有返回值。
 *     mode:外部中断触发模式,可设置为:
 *           RISING:当输入从低到高时触发。
 *           FALLING:当输入从高到低时触发。
 *           LOW:当输入保持低电平时触发。
 *           CHANGE:每当输入状态从高到低或从低到高时触发。
 *            
 */

 int_exit = digitalPinToInterrupt(pin)
 /*描述:通过数字引脚(pin)输出相应的中断向量。
  *参数:pin:数字引脚号
  *     int_exit:返回值,结果为引脚所对应的中断向量
  */

2.引脚更改引发中断

以设置端口B的引脚D12可外部中断触发为例

选择端口

根据引脚编号确定端口。要启用该端口,您将使用*引脚更改中断控制寄存器(Pin Change Interrupt Control Register)*或 PCICR。如下图所示,PCICR 有三个感兴趣的位:位 0、位 1 和位 2。每个位都与其中一个端口相关联,将其设置为 1 将启用该端口,可以启用多个端口。
在这里插入图片描述

PCICR |= 0x01;

启用/禁用端口上的引脚

启用端口后,需要启用要用于引脚更改引发中断的引脚。如下图所示,每个端口可以启用或禁用 8 个引脚,要启用引脚,请为其写入“1”,可以根据需要启用任意数量的引脚,请记住,需要找到一种方法来区分中断服务例程中的引脚。
在这里插入图片描述

PMSK0 |= 0x10

中断服务例程

使用引脚更改引发中断时,已经为定义了中断服务函数,因此需要为端口直接编写需要的函数。因为Arduino UNO有三个端口,因此有三个 中断服务函数,其名称如下图所示:
在这里插入图片描述

ISR(PCINT0_vect)
{
	...(函数程序)
}

示例

电路图如图所示,尝试实现第一次按下按键BUTTON时,板上的LED灯点亮,再次按下时,LED灯熄灭,如此往复。
在这里插入图片描述

volatile int a = 0;
void count()
{
  a = 1 - a;
}
void setup() 
{
  // put your setup code here, to run once:
  pinMode(2,INPUT_PULLUP);
  pinMode(13,OUTPUT);
  attachInterrupt(digitalPinToInterrupt(2), count, FALLING);
}

void loop() 
{
  // put your main code here, to run repeatedly:
  digitalWrite(13,a);
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐