外部中断
常用arduino开发板外部中断引脚
不同的Arduino开发板外部中断引脚不同,总结常用的有如下几个:
- UNO
int.0 | int.1 |
---|---|
2 | 3 |
具体见图:
- Ethernet
int.0 | int.1 |
---|---|
2 | 3 |
- Nano
int.0 | int.1 |
---|---|
2 | 3 |
具体见图:
- Mini
int.0 | int.1 |
---|---|
2 | 3 |
具体见图:
- Mega2560
int.0 | int.1 | int.2 | int.3 | int.4 | int.5 |
---|---|---|---|---|---|
2 | 3 | 21 | 20 | 19 | 18 |
具体见图:
- Leonardo
int.0 | int.1 | int.2 | int.3 |
---|---|---|---|
3 | 2 | 0 | 1 |
具体见图:
- micro
int.0 | int.1 | int.2 | int.3 |
---|---|---|---|
3 | 2 | RX1 | TX1 |
- Yun(详情见图)
int.0 | int.1 | int.2 | int.3 |
---|---|---|---|
18 | 19 | 20 | 21 |
具体见图
- 2009
int.0 | int.1 | int.2 | int.3 |
---|---|---|---|
18 | 19 | 20 | 21 |
具体见图:
int.0 | int.1 |
---|---|
2 | 3 |
- pro
int.0 | int.1 |
---|---|
2 | 3 |
具体见图:
- promini
int.0 | int.1 |
---|---|
2 | 3 |
具体见图:
外部中断程序编写
外部中断函数
中断函数即执行的函数,这个函数无返回值且没有参数。
定义中断函数后,在Setup初始化函数中配置如下函数:
attachInterrupt(interrupt, function, mode);
//interrupt为中断号,function为中断函数,mode为中断触发模式
在Arduino Due中,中断设置为:
attachInterrupt(pin, function, mode);
//due 的每个IO口均可进行外部中断,故引脚号为中断号。
退出中断所有型号的控制板都可用中断分离函数detachInterrupt(interrupt );
来取消中断设置。
外部中断模式
外部中断分为四种模式:
LOW | 低电平触发 |
---|---|
CHANGE | 电平变化时触发(高电平变低电平、低电平变高电平) |
RISING | 上升沿触发 |
FALLING | 下降沿触发 |
HIGH | 高电平触发(该中断模式仅适用于Arduino due) |
例程
以按键触发为例,准备材料:
-
Uno\Nano板
-
下载数据线
-
面包板及杜邦线
-
LED灯
-
常用限流电阻
如图连接
int LED = 13; //定义LED为数字引脚13
int key = 2; //按键触发中断0
char state = LOW;//标志位
void setup() {
pinMode(LED, OUTPUT); //LED为输出模式
pinMode(key, INPUT_PULLUP); //输入模式
attachInterrupt(0, blink, FALLING);//下降沿触发中断0,调用blink函数
}
void loop() {
if (state == HIGH) { // 如果state为HIGH
state = LOW;
digitalWrite(LED, HIGH); // 亮
delay(500); //延时500ms
}
else {
digitalWrite(LED, LOW); // 否则,灭
}
}
void blink() { //中断函数blink()
state = !state; //一旦中断触发,state状态反转
}
效果为,每按下一次按键LED灯就闪一次。
类似可套用于其他工程中。
定时器中断
首先需要添加MsTimer2库,并在程序中引用头文件 MsTimer2.h。
例程
使用例程如下:
#include <MsTimer2.h> //定时器库的头文件
int num = 0; //计数
//中断服务程序
void onTimer()
{
Serial.print("The num is : ");
Serial.println(num++);
}
void setup()
{
Serial.begin(9600); //初始化串口
MsTimer2::set(1000, onTimer); //设置定时器中断,(时长,中断函数)
MsTimer2::start(); //开始计时
}
void loop(){
}
打开串口查看器
效果为:
The num is : 0
The num is : 1
The num is : 2
……
以此类推