Arduino 教学 |[arduino学习笔记 #01] Interrupt 中断

1、中断函数的概念

什么是中断?实际上,中断在人们的日常生活中非常常见,例如:
中断的概念
你在看书的时候,电话铃声响起,于是你在书上做上记号,去接电话,与对方通话;门铃响了, 有人敲门,你让打电话的对方稍等一下,你去开门,并在们旁与来访者交谈,谈话结束,关好门;回到电话机旁,继续通话,接完电话后再从做记号的地方接着看书。
同样的道理,在单片机中也存在中断概念,在计算机或者单片机中中断是由于某个随机事件的发生,计算机暂停原程序的运行,转去执行另外一程序(随机事件),处理完毕后又自动返回原程序继续运行的过程,也就是说,高优先级的任务中断了低优先级的任务。在计算机中中断包括如下几部分:
- 中断源——引起中断的原因,或能发生中断请求的来源
- 主程序——计算机现行运行的程序
- 中断服务子程序——处理突发事件的程序

2、内部中断与外部中断

定时中断/内部中断

  • 内部中断主要为定时中断,定时中断是指主程序在运行一段程序过后自动进行的中断服务程序。

外部中断

  • 一般由外设发出中断请求,如:键盘中断、打印机中断、外部中断需外部中断源发出中断请求才能发中断。

3、外部中断例程:

3.1 函数 attachlnterrupt ( interrupt,function,mode )

该函数用于设置中断,函数有3个参数,分别表示:中断源中断处理函数、和触发模式

中断源 可选 0 或者 1 ,对应 2 或者 3 号数字引脚。

中断处理函数 是一段子程序,当中断发生时执行该子程序部分(此函数必须不带参数,不返回任何内容)。

触发模式 有 4 种类型:LOW(低电平触发)/HIGH(高电平触发)、CHANGE(变化时触发)、RISING (低电平变为高电平触发)、FALLING(高电平变为低电平触发)。

1、低电平触发——LOW(低电平触发)、HIGH(高电平触发);

2、 边沿触发——CHANGE(电平变换)、RISING (上升沿触发)、FALLING(下降沿触发)。

例程功能如下:
数字 ~D2 口接按钮开关~ ,D4 口接LED1(红色),D5 口接LED2(绿色)。在例程中,LED3 为板载的LED灯,每秒闪烁一次,使用中断 0 来控制LED1,中断 1 来控制LED2。按下按钮,立即响应中断,由于中断响应速度快,LED3 不受影响,继续闪烁。使用不同的 4 个参数,例程 1 实验 LOW 和 CHANGE 参数,例程 2 试验 RISING 和 FALLING参数。

按钮Debounce例程:

//boolean state = false;
boolean buttonUp = true;//flag旗标-之前被按下过为true,按钮又弹起来

void setup()
{
	//pinMode(13,OUTPUT);
	//digitalWrite(13,LOW);
	pinMode(7,INPUT);
	digitalWrite(7,HIGH);//初始化为HIGH,上拉电阻为“1”
}
void loop()
{
	if(digitalRead(7) == LOW && buttonUp == true)//按钮按下的一瞬间
		//digitalRead(7)!= HIGH && buttonUp ==true
	{
	digitalWrite(13,!digitalRead(13));//测试点亮LED灯
	buttonUp = false;
	}
	else if(digitalRead(7)== HIGH && buttonUp == false)//按钮没有按下
		//digitalRead(7)== HIGH && buttonUp !=true
	{
		buttonUp = true;
	}
	
	delay(100);
}

中断函数相较于Debounce更加简洁:
用一个按钮D2控制,当按下按钮并松手时,led13灯亮;当再次按下按钮并松手时,led13灯灭。

#define led 13
#define button 0 //中断源可选择 0 或 1
int state = LOW;
void setup() {
  
  pinMode(led, OUTPUT);
  attachInterrupt(button, use, RISING);// 中断源、中断处理子程序、触发模式
}
 
void loop() {
  
  digitalWrite(led, state);//按钮按下,LED亮/灭
}
void use() {
  state = !state;// LOW -> HIGH  ,高/低电平互相翻转
}
 

例程1:

volatile int statel = LOW ,state2 = LOW;
int LED1 = 4;
int LED2 = 5;
int LED3 = 13;
//为什么没有设置D2(按钮)int button = 2;
void setup()
{
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
//为什么没有设置D2(按钮) pinMode(button ,INPUT);

attachInterrupt(0,LED1_Change,LOW);
attachInterrupt(1,LED2_Change,CHANGE);

}
void loop()
{
digitalWrite(LED3,HIGH);
delay(500);
digitalWrite(LED3,LOW);
delay(500);

}

void LED1_Change()
{
state1 = !state1;
digitalWrite(LED1, state1);
delay(100);

}

void LED2_Change()
{
state2 = !state2;
digitalWrite(LED2, state2);
delay(100);

}




例程2:

volatile int statel = LOW ,state2 = LOW;
int LED1 = 4;
int LED2 = 5;
int LED3 = 13;
void setup()
{
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);

attachInterrupt(0,LED1_Change,RISING);
attachInterrupt(1,LED2_Change,FALLING);

}
void loop()
{
digitalWrite(LED3,HIGH);
delay(500);
digitalWrite(LED3,LOW);
delay(500);

}

void LED1_Change()
{
state1 = !state1;
digitalWrite(LED1, state1);
delay(100);

}

void LED2_Change()
{
state2 = !state2;
digitalWrite(LED2, state2);
delay(100);

}

3.2 detachlnterrupt ( interrupt )
该函数用于取消中断,参数interrupt表示要取消的中断源。

  • detachInterrupt(digitalPinToInterrupt(pin))(推荐)
  • detachInterrupt(interrupt)(不推荐)
  • detachInterrupt(pin)(不推荐。此外,此语法仅适用于Arduino SAMD板,Uno WiFi Rev2,Due和101.)
    (2019/09/08)

[1] Arduino-1-Arduino中的中断及其编程应用举例

一、arduino 中断 与 51单片机相比较
二、arduino外部中断及实验(实验1、2)
三、arduino内部中断(计时中断)及实验(实验3、4)
四、实验感想

在这里插入图片描述

发布了75 篇原创文章 · 获赞 58 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/Naiva/article/details/100628341
今日推荐