Arduino篇—外部中断

电子说

1.3w人已加入

描述

课程目标

  • 中断程序的应用
  • arduino的中断函数
  • 中断程序的实际应用

相关知识

中断程序: 中断程序可以看作是一段独立于主程序之外的程序,当中断触发时,控制器会暂停当前正在运行的主程序,而跳转去运行中断程序,中断程序运行完后,会再回到之前主程序暂停的位置,继续运行主程序。

外部中断

在程序的运行中,我们时常需要监控一些事件的发生,比如对某一传感器的返回数据进行解析。随着程序功能增加,轮询到指定功能时需要等待的时间变长,效率会很低。而使用中断方式检测,可以到达实时检测的效果。

**Arduino的中断函数:**外部中断和定时中断

外部中断的定义: 一般由外设发出中断请求,如:键盘中断、打印机中断、外部中断需外部中断源发出中断请求才能发中断。

attach interrupt(interrupt,function,mode)

1)interrupt: 中断号,UNO只用0,1,即代表D2,D3口

2)function:调用中断函数,中断发生时调用的函数

3)mode:中断触发模式

low 当针脚输入为低时,触发中断

change 当针脚输入发生变化时,触发中断

rising 当针脚由低变高时,触发中断

falling 当针脚由高到低时,触发中断

定时中断的定义: 是指主程序在运行一段程序过后自动进行的中断服务程序。

常见的定时库有FlexiTimer2.h和Ms.Timer2.h

void start() 开启定时中断

void stop() 关闭定时中断

#include< MsTimer2.h >
void flash()
{
static boolean cutput=HIGH;
digitalWrite(13,OUTPUT);
OUTPUT=!OUTPUT;
MsTimer2:set(500,flash);
MsTimer2:start();
}
void loop()
{}

使用外部中断注意:

1.中断服务程序不能够有参数和返回值,即void Function name(void){}
2.在中断函数中delay()函数将不起作用
3.在中断函数中millis()函数的值不会增加
4.得到的串行数据将会丢失
5.需在中断函数内部更改的值需声明为volatile类型

电路搭建

所需材料

ArduinoUNO * 1
震动传感器模块 * 1
LED * 1
220Ω电阻 * 1
杜邦线若干

电路连接

外部中断

程序编写

练习一:震动监测

不使用中断的方式实现监测到震动后,LED点亮两秒后熄灭,再次监测到震动后,再次点亮。

图形化方式:

直接用条件判断的方式实现了这个功能

外部中断

代码方式:

/* 项目名称:条件判断制作震动监测
 * 项目时间:2022.03.15
 * 项目作者:MRX
 */
const int LedPin = 9;
const int SensorPin = 2;
void setup() {
  pinMode(LedPin,OUTPUT);
  pinMode(SensorPin,INPUT);
  digitalWrite(LedPin,LOW);
}


void loop() {
  if(digitalRead(SensorPin) == LOW){
    digitalWrite(LedPin,HIGH);
    delay(1000);
  }
  else{
    digitalWrite(LedPin,LOW);
  }


}

练习二:震动监测

使用中断方式实现上述功能。

图形化方式:

外部中断

代码方式:

/* 项目名称:中断制作震动监测
 * 项目时间:2022.03.15
 * 项目作者:MRX
 */
const int LedPin = 9;
const int SensorPin = 2;
char state = LOW;
void setup() {
  pinMode(LedPin,OUTPUT);
  pinMode(SensorPin,INPUT);
  attachInterrupt(0, blink, FALLING);
  digitalWrite(LedPin,LOW);
}
void loop() {
   if (state == HIGH) {        // 如果state为HIGH
    state = LOW;
    digitalWrite(LedPin, HIGH);  // 亮灯
    delay(500);          //延时500ms
  }
  else {
    digitalWrite(LedPin, LOW);    // 否则,关灯
  }
}
void blink() {               //中断函数blink()
  state = !state;             //一旦中断触发,state状态反转
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分