課程目標
- 中斷程序的應(yīng)用
- arduino的中斷函數(shù)
- 中斷程序的實際應(yīng)用
相關(guān)知識
中斷程序: 中斷程序可以看作是一段獨立于主程序之外的程序,當中斷觸發(fā)時,控制器會暫停當前正在運行的主程序,而跳轉(zhuǎn)去運行中斷程序,中斷程序運行完后,會再回到之前主程序暫停的位置,繼續(xù)運行主程序。
在程序的運行中,我們時常需要監(jiān)控一些事件的發(fā)生,比如對某一傳感器的返回數(shù)據(jù)進行解析。隨著程序功能增加,輪詢到指定功能時需要等待的時間變長,效率會很低。而使用中斷方式檢測,可以到達實時檢測的效果。
**Arduino的中斷函數(shù):**外部中斷和定時中斷
外部中斷的定義: 一般由外設(shè)發(fā)出中斷請求,如:鍵盤中斷、打印機中斷、外部中斷需外部中斷源發(fā)出中斷請求才能發(fā)中斷。
attach interrupt(interrupt,function,mode)
1)interrupt: 中斷號,UNO只用0,1,即代表D2,D3口
2)function:調(diào)用中斷函數(shù),中斷發(fā)生時調(diào)用的函數(shù)
3)mode:中斷觸發(fā)模式
low 當針腳輸入為低時,觸發(fā)中斷
change 當針腳輸入發(fā)生變化時,觸發(fā)中斷
rising 當針腳由低變高時,觸發(fā)中斷
falling 當針腳由高到低時,觸發(fā)中斷
定時中斷的定義: 是指主程序在運行一段程序過后自動進行的中斷服務(wù)程序。
常見的定時庫有FlexiTimer2.h和Ms.Timer2.h
void start() 開啟定時中斷
void stop() 關(guān)閉定時中斷
#include< MsTimer2.h >
void flash()
{
static boolean cutput=HIGH;
digitalWrite(13,OUTPUT);
OUTPUT=!OUTPUT;
MsTimer2:set(500,flash);
MsTimer2:start();
}
void loop()
{}
使用外部中斷注意:
1.中斷服務(wù)程序不能夠有參數(shù)和返回值,即void Function name(void){}
2.在中斷函數(shù)中delay()函數(shù)將不起作用
3.在中斷函數(shù)中millis()函數(shù)的值不會增加
4.得到的串行數(shù)據(jù)將會丟失
5.需在中斷函數(shù)內(nèi)部更改的值需聲明為volatile類型
電路搭建
所需材料
ArduinoUNO * 1
震動傳感器模塊 * 1
LED * 1
220Ω電阻 * 1
杜邦線若干
電路連接
程序編寫
練習(xí)一:震動監(jiān)測
不使用中斷的方式實現(xiàn)監(jiān)測到震動后,LED點亮兩秒后熄滅,再次監(jiān)測到震動后,再次點亮。
圖形化方式:
直接用條件判斷的方式實現(xiàn)了這個功能
代碼方式:
/* 項目名稱:條件判斷制作震動監(jiān)測
* 項目時間: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);
}
}
練習(xí)二:震動監(jiān)測
使用中斷方式實現(xiàn)上述功能。
圖形化方式:
代碼方式:
/* 項目名稱:中斷制作震動監(jiān)測
* 項目時間: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); // 否則,關(guān)燈
}
}
void blink() { //中斷函數(shù)blink()
state = !state; //一旦中斷觸發(fā),state狀態(tài)反轉(zhuǎn)
}
-
傳感器
+關(guān)注
關(guān)注
2550文章
51035瀏覽量
753063 -
led燈
+關(guān)注
關(guān)注
22文章
1592瀏覽量
107950 -
外部中斷
+關(guān)注
關(guān)注
1文章
131瀏覽量
15816 -
Arduino
+關(guān)注
關(guān)注
188文章
6468瀏覽量
186950 -
定時中斷
+關(guān)注
關(guān)注
0文章
19瀏覽量
8553
發(fā)布評論請先 登錄
相關(guān)推薦
評論