Arduino 定时器中断 外部中断

本文介绍了中断的概念,将其比喻为读书时遇到电话的中断处理。在Arduino中,中断分为定时器中断和外部中断。定时器中断通过MsTimer2库实现,每隔一定时间执行特定任务。外部中断则允许在特定事件发生时执行预设的函数,如按钮按下。Arduino UNO的D2和D3支持外部中断,不同型号的Arduino板有不同的中断引脚。中断触发模式包括低电平、电平改变、上升沿和下降沿。通过示例代码解释了如何配置和使用这些中断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中断(Interrupt)

  中断(Interrupt)是计算机的一个重要概念,现代计算机普遍采用中断技术.

什么是中断呢?

  CPU执行时原本是按照程序指令一条一条向下执行的.但如果此时发生了某一件事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务),待CPU将事件B处理完毕后,再回到原来被中断的地方继续执行程序(中断返回),这一过程成为中断.

  打个比方:加入你正在读书,这时电话响了你放下手中的书,去接电话.接娃完电话后,在继续回来读书,并从原来读的地方继续往下读.

当中断发生时,程序执行流程图示如下:

换句话讲呢:

    中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。相当于你在读书时听到了敲门声,即中断源向你发出了中断请求,你需要放下书本,先去开门,发现原来是外卖到了。你处理完之后,又回去继续读书,并从你刚才读到的地方继续往下读。如果你是一个机器人的话,你从听到敲门声到回来继续读书的过程,构成了整个的中断过程。写入你大脑中的程序即为软件处理程序,门就是中断装置。

 

备注:Arduino UNO 开发板的 2、3,可以输入外部中断信号。中断有四种触发模式:低电平触发、电平改变触发、上升沿触发、下降沿触发。

 

Arduino的定时器中断

使用定时器中断前,必须先安装MsTimer2库,并在程序中引用头文件 MsTimer2.h中。使用例程如下:

#include <MsTimer2.h>     //定时器库的头文件
int tick = 0; //计数值

//中断服务程序
void onTimer()
{
  Serial.print("timer ");
  Serial.println(tick++);
}

void setup()
{
  Serial.begin(9600); //初始化串口

  MsTimer2::set(1000, onTimer); //设置中断,每1000ms进入一次中断服务程序 onTimer()
  MsTimer2::start(); //开始计时_开启定时器中断
  //MsTimer2::stop(); //关闭定时器中断
}

void loop()
{
}

程序运行效果: 

每隔1000毫秒,产生一次时钟中断,并进入中断服务程序 onTimer(), 向串口打印一串文字。

在Arduino IDE中打开串口监视窗口,可见打印的文字

timer 0

timer 1

timer 2

...

Arduino的外部中断

    在函数 Loop() 中,里面的 if() 条件需要我们不断检测循环里面的代码,如果存在很多的语句需要判断的话,处理器就有可能在处理别的事务,来不及处理你要的判断。对于这些情况,你就可以使用中断接收这些事件,当发生这种情况时,已设置的一个函数会运行程序,即使微控制器可能正在处理其他事务也会执行这个程序。这个过程叫做硬件中断。

    Arduino开发板中,只有两个引脚为硬件中断。

    Leonardo有4个中断引脚。

    Mega2560有更多。

    Due板,所有的引脚都可以作为硬件中断。

代码示例:

int ledPIN = 13;

void setup() 
{
  pinMode(ledPIN, OUTPUT);
  attachInterrupt(0, stuffHappened, FALLING);
}

void loop() 
{
}

void stuffHappened()
{
  digitalWrite(ledPIN, HIGH); 
}

    上述代码(attachInterrupt()函数):

      第一个参数0,是中断号(在Arduino UNO中,中断0是指D2引脚,中断1是指D3引脚。其他板子并不同)   

      第二个参数stuffHappened,是指Loop()后面的自写函数stuffHappened(),这个函数叫做中断服务程序,简称ISR。该函数没有任何参数也不返回任何值。

      最后一个参数FALLING,常数,这里的意思是,只有当D2从高电平变为低电平(换句话说,它为“下降沿”)时,ISR才会被调用,这是在按下按钮时所要发生的事:D2从高电平变为低电平。

    上述可见Loop()函数中没有代码。这个ISR本身只是将“L”灯点亮。

    在测试时,当Arduino复位时,“L”LED应该熄灭。然后当你按下按钮时,“L”LED应立即点亮并保持。

    现在将attachInterrupt的最后一个参数改为RISING,并下载修改后的程序。LED应该保持熄灯状态直到Arduino完全重新启动,这是因为中断引脚上一直都是高电平,没有出现低电平,然后“上升”到高电平的时候。

    当按住按钮时,LED应保持熄灭状态直到你松开它放开它时触发中断,因为按下按钮时D2是低电平,而松开时才上升到高电平。

外部中断配置函数attachInterrupt( )

函数原型:attachInterrupt(interrupt, ISR, mode)

mode中断触发方式

  • LOW: 低电平触发。
  • CHANGE:管脚状态改变触发。
  • RISING:上升沿触发。
  • FALLING:下降沿触发。

 

官方参考文档:  https://arduino-wiki.clz.me/?file=003-高级输入输出/003-外部中断

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值