按鍵中斷可控流水燈
1.流水燈
2.什么是中斷?
3.中斷的定義?
4.中斷程式的結束與退出
5.程式的優先級
6.空程式的運行
7.數字信號的列印
8…程式錯誤的檢測
1.流水燈

void setup(){
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
}
void loop(){
digitalWrite(7,HIGH);
delay(1000);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
delay(1000);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
delay(1000);
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
delay(1000);
digitalWrite(10,LOW);
}
2.什么是中斷
簡單的來說就是停止現在的事情來做另一件事情,做完在回傳繼續一開始的任務
3.中斷的定義
中斷是為使單片機具有對外部或內部隨機發生的事件實時處理而設定的,中斷功能的存在,很大程度上提高了單片機處理外部或內部事件的能力,
中斷系統特點:
①分時操作,CPU 可以分時為多個 I/O 設備服務,提高了計算機的利用率;
②實時回應,CPU 能夠及時處理應用系統的隨機事件,系統的實時性大大增強;
③可靠性高,CPU 具有處理設備故障及掉電等突發性事件能力,從而使系統可靠性提高
中斷程序
對于單片機來講,中斷是指CPU在處理某一時間A時,發生了另一事件B請求CPU立刻去處理(中斷發生或中斷請求);CPU暫時停止當前的作業(中斷回應),轉而去處理事件B(中斷服務),待CPU處理事件B完成后,再回到原來事件A被中斷的地方繼續處理事件A(中斷回傳),這一程序稱為中斷,注意是整個程序,而不是單一的停止一件事的意思,
舉例:你打開火,燒上一壺水,然后去洗衣服,在洗衣服的程序中,突然聽到水壺發出水開的報警聲,這時,你停止洗衣服動作,立即去關掉火,然后將開水灌入暖水瓶中,灌完開水后,你又回去繼續洗衣服,這個程序中實際上就發生了一次中斷


4.中斷程式的結束與退出


volatile boolean 狀態;
void attachInterrupt_fun_FALLING_2() {
狀態 = !狀態;
digitalWrite(4,狀態);
}
void setup(){
狀態 = false;
pinMode(2, INPUT_PULLUP);
pinMode(4, OUTPUT);
attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_FALLING_2,FALLING);
}
void loop(){
}
按鍵第一次按進入中斷程式,第二次按退出中斷
布爾型變數 只有兩種結果 例如非真即假 0和1 這種

注釋 :第一次狀態為真時,第二次按下就為假,這樣便可以達到一開一關的效果

不采用變數實作一開一關
注釋 第一次按下狀態假設為1,松開后變0,則第二次的初始狀態為0,按下時與前一次狀態不同,執行關閉
5.程式的優先級
單片機的運行是一個代碼運行的,中斷程式就相當于一個優先級,可以打斷單片機的運行,從而先運行其他程式
6.空程式的運行

滿足條件則運行空格里的程式,可當空語令運行,卡死在這一步,按鍵按下,數字輸入變0,按住不放時,程式不變卡在空陳述句,狀態不變,松開時,數字信號變為高電平1,則跳出中斷陳述句
執行空陳述句時,空陳述句需要放入中斷程式中,否則不運行
7.數字信號的列印

void setup(){
Serial.begin(9600);
pinMode(4, INPUT);
}
void loop(){
pinMode(4, INPUT);
Serial.println(digitalRead(4));
}
注釋:管腳模式一定要選好是輸入還是輸出

一開始想列印出按鈕按下的數字信號,因為沒有設定好管腳模式,導致檢測不出來數字信號
上圖所用的按扭為共陰按鈕,因此數字信號管腳檢測模式要設定為上拉輸入,上拉輸入可檢測出 ##低電平


上拉輸入的檢測原理
8…程式錯誤的檢測
先檢測主程式是否錯誤

若串口資料不顯示,則為設定程式模塊有問題
跟檢測主程式一樣,加入列印串口資料,便可檢測出是哪一步出現了問題

所有模塊

所有模塊代碼
#include <PinChangeInt.h>
void attachPinInterrupt_fun_FALLING_2() {
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(7,HIGH);
while (digitalRead(2) == 0) {
Serial.println("卡死了");
}
}
void setup(){
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(2, INPUT_PULLUP);
PCintPort::attachInterrupt(2,attachPinInterrupt_fun_FALLING_2,FALLING);
}
void loop(){
digitalWrite(5,HIGH);
delay(1000);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
delay(1000);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
delay(1000);
digitalWrite(7,LOW);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/305245.html
標籤:其他
上一篇:致敬一位好老師
