按键中断可控流水灯
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);
}