中斷:
當出現需要時,CPU暫時停止當前程序的執行轉而執行處理新情況的程序,執行完之后回到原程序繼續執行原程序的過程稱之為中斷
中斷的分類:Arduino中的中斷可以分為兩類:外部中斷和定時中斷
外部中斷:一般是指由外設發出的中斷請求,即中斷源在外部。如鍵盤中斷、打印機中斷等。外部中斷需要外部中斷源發出中斷請求才能發中斷。
定時中斷:主程序在運行的過程中停一段時間就進行一次中斷,執行中斷服務程序,不需要中斷源的中斷請求觸發,這有時是自動進行的。
外部中斷:
外部中斷需要外部的觸發,在Arduino UNO中數字引腳2和3是連接外部觸發電路的,它們的中斷號分別是0和1【0表示用引腳2,1表示用引腳3】。在寫程序時通常把中斷函數寫在setup()中
例子:
volatile int state=LOW;//需要在中斷函數內部更改的值需要聲明為volatile類型 void setup(){ pinMode(13,OUTPUT); attachInterrupt(0,blink,CHANGE); //設置外部中斷函數 //參數1 中斷號 0表示用引腳2,1表示用引腳3 //參數2 中斷函數 //參數3 中斷觸發模式: // LOW:當針腳輸入為低時,觸發中斷。 // CHANGE:當針腳輸入發生改變時,觸發中斷。 // RISING:當針腳輸入由低變高時,觸發中斷。 // FALLING:當針腳輸入由高變低時,觸發中斷。 //不同型號的Arduino板,其外部中斷的觸發的引腳和引腳數目,以及中斷觸發方式都不太一樣,在使用外部中斷時一定要弄清楚使用的Arduino板的型號。 } void loop(){ digitalWrite(13,state); } void blink(){ state=!state;} //中斷服務程序不能有參數和返回值 //在中斷函數中delay()函數將不再起作用。在中斷函數中millis()函數的值將不會增加 //得到的串行數據將會丟失
取消中斷:
detachInterrupt(0); //參數 中斷號
取消中斷和關中斷是兩個不同的概念。當關中斷之后,所有的中斷都不能執行,但是取消某個中斷之后,其他的中斷還是可以執行的
定時中斷---定時器:
常用的庫有FlexiTimer2.h和MsTimer2.h,這兩個庫的用法是大同小異的
例子:
#include <MsTimer2.h> //定時器庫的頭文件 volatile int state=LOW; void setup(){ pinMode(13,OUTPUT); MsTimer2::set(500,blink); //中斷設置函數,每500ms進入一次中斷 //參數1 時間 單位毫秒 //參數2 中斷函數名 MsTimer2::start(); //開始計時 } void loop(){ digitalWrite(13,state); } void blink(){ state=!state; }
MsTimer2::stop(); //停止計時
天子驕龍