各种Arduino外部中断程序

一、中断(Interrupt)的基本概念

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


什么是中断呢?

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

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


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


计算机为什么要采用中断?
为了说明这个问题,再举一例子。假设你有一个朋友来拜访你,但是由于不知道何时到达,你只能在大门等待,于是什么事情也干不了。如果在门口装一个门铃,你就不必在门口等待而去干其它的工作,朋友来了按门铃通知你,你这时才中断你的工作去开门,这样就避免等待和浪费时间。计算机也是一样,例如键盘输入,如果不采用中断技术,CPU将不断扫描键盘有否输入,经常处于等待状态,效率极低。而采用了中断方式,CPU可以进行其它的工作,只键盘有按键并发出中断请求时,才予以响应,暂时中断当前工作转去执行读取键盘按键,读完成后又返回执行原来的程序。这样就大大地提高了计算机系统的效率。

二、Arduino的外部中断例程1

我们把一个按键开关,接在数字管脚上,触发外部中断事件。

不是所有数字管脚都支持外部中断,对于Arduino NANO,  D2, D3两个脚支持外部中断。


1, 准备元器件和器材

     按键开关  一个

     面包板一块

     1K 电阻一个

      杜邦线若干


2 电路原理图


图中:  开关接在5V与GND之间,串接一个电阻R作为限流电阻。D2接到开关上。

当开关闭合, D2的电平为0V(低电平),  当中断有效时,将触发外部中断。


3,用面包板接线

把开关, 电阻插入面包板, 按上述电路原理图,用杜邦线接好线


4, 在Arduino IDE中写个Arduino程序

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int pinInterrupt = 2; //接中断信号的脚  
  2.   
  3. void onChange()  
  4. {  
  5.    if ( digitalRead(pinInterrupt) == LOW )  
  6.       Serial.println("Key Down");  
  7.    else  
  8.       Serial.println("Key UP");  
  9. }  
  10.   
  11. void setup()  
  12. {  
  13.    Serial.begin(9600); //打开串口  
  14.   
  15.    pinMode( pinInterrupt, INPUT);//设置管脚为输入  
  16.      
  17.    //Enable中断管脚, 中断服务程序为onChange(), 监视引脚变化  
  18.    attachInterrupt( digitalPinToInterrupt(pinInterrupt), onChange, CHANGE);  
  19. }  
  20.   
  21. void loop()  
  22. {  
  23.   // 模拟长时间运行的进程或复杂的任务。  
  24.   for (int i = 0; i < 100; i++)  
  25.   {  
  26.     // 什么都不做,等待10毫秒  
  27.     delay(10);   
  28.   }  
  29. }  


运行效果: 在Arduino IDE中打开串口监视窗口,可见打印的文字

当按键按下,进入中断服务程序,打印  "Key Down"

当按键抬起,进入中断服务程序,打印  "Key Up"


上述程序如果在Arduino 1.0版本编译时,出现错误“NOT_AN_INTERRUPT' was not declared”,则在程序最开始处加一句

#define NOT_AN_INTERRUPT -1


附:attachInterrupt()函数的语法介绍
attachInterrupt( digitalPinToInterrupt(pin) , function, mode)

digitalPinToInterrupt(pin) :取得引脚pin的中断号 
function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数称为中断服务程序。 
mode:定义何时发生中断以下四个contstants预定有效值:

LOW 当引脚为低电平时,触发中断
CHANGE 当引脚电平发生改变时,触发中断
RISING 当引脚由低电平变为高电平时,触发中断
FALLING 当引脚由高电平变为低电平时,触发中断.

三、Arduino的外部中断官方例程(外部中断函数的具体用                     法:http://arduino.cc/en/Reference/AttachInterrupt

int pin = 13;

volatile int state = LOW;

void setup()

{

  pinMode(pin, OUTPUT);

  attachInterrupt(0, blink, CHANGE);//当int.0电平改变时,触发中断函数blink

} 

void loop()

{

  digitalWrite(pin, state);

}

void blink()//中断函数

{

  state = !state;

}





  • 11
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值