Arduino 中断的使用

中断的定义

程序运行过程中时常需要监控一些事件的发生,如对某一传感器的检测结果做出反应。使用轮询的方式进行检测时效率较低,等待时间较长,而使用中断方式进行检测时则可以达到实时检测的效果。

当中断被触发时,控制器会暂停当前正在运行的主程序,而跳去运行中断程序,当中断程序运行完后,会再回到之前主程序暂停的位置,继续运行主程序。如此便可以达到实时响应处理事件的效果。

外部中断是由外部设备发起请求的中断。要想使用外部中断,就需要了解中断引脚的位置,根据外部设备选择中断模式,以及编写一个中断被触发后需要执行的中断函数。

中断引脚

ARDUINO中的外部中断通常是由Pin口电平改变触发的。每种型号的ARDUINO板都有数个PIn口可以用来注册中断

常见开发板外部引脚图:常见开发板引脚图

中断模式

为了设置中断模式,还需要了解设备触发外部中断的输入 信号类型。中断模式也就是中断触发的方式。在大多数ARDUINO上支持以下几个中断触发方式

LOW 低电平触发

CHANGE 电平变化触发

RISING 上升沿触发,即高电平变低电平

FALLING 下降沿触发,即低电平变高电平

中断函数

除了设置中断模式外,还需要编写一个响应中断的处理程序——中断函数,当中断被触发后,便可以让Arduino运行该中断函数。中断函数就是当中断被触发后要去执行的函数,该函数不能带有任何参数,且返回类型为空

这些准备工作完成后,还需要在setup()中使用attachInterrrupt()函数对中断引脚进行初始化配置,以开启arduino的外部中断功能,其用法如下:

attachInterrupt(interrupt, function,mode)

功能:对中断引脚进行初始化配置

参数:

interrupt,中断编号,注意,这里的中断编号并不是引脚编号

function,中断函数名,当中断被触发后即会运行此函数所代表的中断函数。

mode,中断模式

detachInterrupt(interrupt)

功能:禁用外部中断

参数:

interrrupt,需要禁用的中断编号

实验代码


#define LED  A2
#define KEY 2

volatile byte  state;
volatile unsigned long last_time;
void setup() {

  Serial.begin(115200);

  // put your setup code here, to run once:
  pinMode(LED, OUTPUT);
  pinMode(KEY, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(KEY), keyInterrupt, RISING);
  state = LOW;
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(LED, state);
}

void keyInterrupt() {
  if ((millis() - last_time) > 500) {
    Serial.println("检测到中断");
    if (state == LOW) {
      state = HIGH;
    } else {
      state = LOW;
    }
    last_time = millis();

  }

}

尝试自己模拟运行下吧:https://wokwi.com/projects/347197223040189011

可能会遇到的问题

当实际操作的时候你会发现你的中断函数被触发很多次,这个当然不是我们想要看到的。这是由于我们按键是机械结构所造成的抖动,而需求就是消除这个抖动。

if ((millis() - last_time) > 500) {
    Serial.println("检测到中断");
    if (state == LOW) {
      state = HIGH;
    } else {
      state = LOW;
    }
    last_time = millis();

  }

此方法是加入时间函数利用时间差进行处理抖动效果。

当然还有另外的一种方案笔者没有尝试过,利用在按钮两端并联一颗电容利用它的特性过滤按钮的抖动,感兴趣的可以自己测试。

定时器库的使用

引入库: TimerOne
代码中使用:#include "TimerOne.h"

#include "TimerOne.h"

#define LED 7

volatile byte state = LOW;

void setup() {
  Serial.begin(115200);
  // put your setup code here, to run once:
  pinMode(LED, OUTPUT);

  digitalWrite(LED, state);

  Timer1.initialize( 500000  ); // 初始化,   interval 以 micro sec 为单位
  Timer1.attachInterrupt( timer_task ); // attach the service routine here
}

void loop() {
  digitalWrite(LED, state);
}

void timer_task() {
  Serial.println("timer_task 执行了");
  state = ~state;
}

运行范例:https://wokwi.com/projects/347208147574719058

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容