Void函数与中断
教学目标及方法
本节课讲解Void函数的概念,以及如何写一个中断函数
主要内容
这节课来学习Void函数和中断函数的用法。
Void大家很熟悉,Arduino里面都默认包含void setup()和void loop(),简单理解,void就是一段代码的集合,除了这两个标准的void函数,我们也可以定义自己的void函数,比如,我们经常要用到彩灯,正常来说,彩灯闪烁的程序是这样的:
#include

#define LED_PIN 6
#define LED_NUM 1

ColorLED strip = ColorLED(LED_NUM,LED_PIN);

void setup(){
strip.begin();
}

void loop(){
strip.setPixelColor(0,255,0,0);
strip.show();
delay(1000);

strip.setPixelColor(0,0,0,0);
strip.show();
delay(1000);
}
点灯那一段,每次都要写一大段,重复复制粘贴又容易出错。这个时候我们就可以用void函数在一定范围内简化这个过程,我们可以在下面写两个自己的void函数如下:
void LED_Red(){
strip.setPixelColor(0,255,0,0);
strip.show();
delay(1000);
}

void LED_Off(){
strip.setPixelColor(0,0,0,0);
strip.show();
delay(1000);
}
这样,在loop中,我们只要这么写就可以了
void loop(){
LED_Red();
LED_Off();
}
是不是清楚简单了很多?

有人问了,那我要想实现多种灯的颜色,难道还要每个颜色都写一个void函数么?当然不用这么麻烦,在命名的函数后面都跟了一个(), 我们可以在这个()里面设置一些参数,这样在调用这个函数的时候,就可以修改这些参数了,比如我想调整灯光颜色和延长的时间,写法如下:
void LED(int r,int g, int b, int d){
strip.setPixelColor(0,r,g,b);
strip.show();
delay(d);
}
这里我们在()中设置了r,g,b,d四个变量,用来代表颜色和延时时间,接下来调用这个LED函数的时候,在括号中填入想要的值,就可以了,写法如下:
void loop(){
LED(255,0,0,1000);
LED(0,0,0,1000);
}
这样可以保证loop里面的程序清晰简洁,当我们编辑复杂的程序时,善用void就变得很重要了。

不过这样写的话,单个程序看着还是很长,如果你有洁癖的话,还有一个方法让程序看起来更清爽,那就是写一个.h文件。
.h文件我们也不陌生了,我们用灯和舵机的时候都用到了.h文件,它的用法跟void差不多,就是可以把一些函数、信息写进去,然后用的时候只要在开头用#include调用一下就可以了。

比如我们编写歌曲的时候,有一大段频率对应音调的程序,看起来真是头大,这样我可以写一个.h文件,把这一大段内容放到里面。创建.h文件的方法是,点击图中所示的箭头,选择新建标签
这时在最下方出现了黄色的一条,输入名称,注意以.h结尾。
点击“好”,就出现了一个空白的.h文件了
接下来,我们就可以把之前那一大段音调的内容放进来,然后在主程序中输入:
#include
这样就可以直接使用那些音符了。

做这些都是为了简化我们的程序。当然也是为了接下来的写中断函数作准备。

什么是中断呢?举个例子,你正在家打游戏,忽然有人敲门送外卖,这时你就要“中断”手中的游戏,去开门收外卖,然后回来接着玩。假设给这个过程编个程序,那打游戏是你的主程序,而收外卖就是一个中断程序,当触发相应开关(这里就是听到敲门声),就会先暂停主程序(打游戏),执行中断程序(收外卖),然后再恢复主程序(打游戏)。

首先,我们要设置触发中断程序的条件,通常Arduino会预留几个接口来接收中断信号,一般在接口说明中用int0,int1表示,在microduino core的开发板上,D2和D3就是用来接收中断信号的。
触发中断的信号通常是这么几种,对应到开关的行为也相应写在后面了:
LOW 低电平触发 开关保持抬起
CHANGE 电平从高变低再由低变高触发 按一次开关
RISING 电平从低到高触发 按下开关
FALLING 电平从高到低触发 抬起开关
HIGH 高电平触发 开关保持按下
明白这些内容,就能明白中断怎么写了。
中断的语句是 attachInterrupt(接口编号,中断函数名称,触发方式)
其中,中断函数就是用void写的一段你希望中断触发时执行的命令,注意这个函数的()中不能有参数,写在这里的时候也不用加(),另外要注意的是,中断函数只执行一次。比如,我的主程序是亮红灯,我希望在开关按下的时候闪一下绿灯,写法如下:
#include

#define LED_PIN 6
#define LED_NUM 2

ColorLED strip = ColorLED(LED_NUM, LED_PIN);

void setup() {
strip.begin();
attachInterrupt(0, LED_G, RISING);
//设置中断触发,接口int0,即D2,触发条件是RISING,即开关按下时触发
}

void loop() {
strip.setPixelColor(0,255,0,0); //主程序亮红灯
strip.show();
}

void LED_G() {
strip.setPixelColor(0,0,255,0); //中断程序,亮绿灯
strip.show();
delay(1000); //绿灯亮1s
}
中断最大的好处就是它的判断跟主程序的运行是相互独立的,不会受到主程序中延时或者循环的影响,所以结合布尔变量,特别适合用来做整个应用的总控制开关,大家可以多尝试一下。

代码展示

1. interrupt

编程语言: C/C++(Arduino)

软件工具:Arduino IDE 1.8.4


附件下载
暂无数据!
授课教师
  • 李溪

    设计出身的程序爱好者

问答专区
暂无数据!