Arduino中的中斷函數,定時中斷的實現

海椰人 發佈 2022-07-29T07:24:57.184117+00:00

通過生活中一個簡單的例子來說明中斷。當你正在家中看書時,突然電話鈴響了,你停止看書,去接電話,和來電話的人進行交談,通話結束後回來繼續從剛才停止的位置看你的書。這就是生活中的「中斷」的現象,就是正常的工作過程被外部的事件打斷了。

通過生活中一個簡單的例子來說明中斷。當你正在家中看書時,突然電話鈴響了,你停止看書,去接電話,和來電話的人進行交談,通話結束後回來繼續從剛才停止的位置看你的書。這就是生活中的「中斷」的現象,就是正常的工作過程被外部的事件打斷了。程序中的中斷是指在主程序執行過程中被中斷,執行中斷服務程序,待中斷服務程序執行完之後繼續接著執行主程序。

Arduino 中的中斷可以分為兩類:外部中斷和定時中斷。
外部中斷: 一般是指由外設發出的中斷請求,即中斷源在外部如:鍵盤中斷、印表機中斷等。外部中斷需要外部中斷源發出中斷請求才能發中斷。有關外部中斷的詳細用法見《Arduino 外部中斷的使用》一文。
定時中斷:主程序在運行的過程中過一段時間就進行一次中斷服務程序,不需要中斷源的中斷請求觸發,而是自動進行。

我們可以根據實際情況的不同來確定使用什麼樣的中斷。
中斷的函數:
首先介紹關中斷和開中斷即Interrupt()和noInterrupt()函數,用法如下。


{
可以被中斷的代碼
Interrupt()
不可以被中斷的代碼
noInterrupt()
可以被中斷的代碼
}

定時中斷

Arduino已經為我們寫好了定時中斷的庫函數了,我們可以直接直接使用,這對於對底層了解較少的同學來說真是一個好消息。常用的庫有FlexiTimer2.h和MsTimer2.h,這兩個庫的用法是大同小異的。下面對其中的幾個常用的函數進行詳細的介紹。這兩個庫你可以很輕鬆的從網上下載。


這個函數設置定時中斷的時間間隔和調用的中斷服務程序。ms表示的是定時時間的間隔長度,單位是ms,void(*f)()表示被調用中斷服務程序,只寫函數名字就可以了。

2.void start()
開啟定時中斷

3.void stop()
關閉定時中斷

注意:以上三個函數都是在MsTimer2的作用於中進行的,在使用時都要加上作用域,如:MsTimer2::start();可以通過下面這個例子來詳細的了解一下定時中斷。

//定時器庫的 頭文件
#include <MsTimer2.h>
//中斷處理函數,改變燈的狀態
void flash()
{
static boolean output = HIGH;
digitalWrite(13, output);
output = !output;
}
void setup()
{
pinMode(13, OUTPUT);
// 中斷設置函數,每 500ms 進入一次中斷
MsTimer2::set(500, flash);
//開始計時
MsTimer2::start();
}
void loop(){}
關鍵字: