Toggle navigation
科创
{{ getSearchSuggestionLabel(suggestion) }}
{{ part.text }}
查看更多
登录
 
注册
电波
论坛
专栏
应用
登录
注册
{{ getSearchSuggestionLabel(suggestion) }}
{{ part.text }}
查看更多
论坛
>
电子信息
>
电子技术
>
嵌入式
文号
t60405
阅读
3887
回复
0
收藏
1
所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
转帖:Arduino教程——外部中断的使用
kc2038
2013/09/07
电子技术
IP:广西
Arduino教程——外部中断的使用
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1.
什么是中断?
试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得不去开门,同时不得不放停下生命中最重要的事情——吃饭。打开门后,你发现只是一个查水表的,你检查了水表读数并告诉了查水表的人。关上门,你马不停蹄的又投入了于食物的作战中。
我们来分析一下这个颇具传奇性的故事,在这里人生的主旋律——吃饭,就是你的
主程序
,而敲门声,就是一个
中断信号
,它让你不得不去执行你的人生插曲——开门接客这个
中断函数
。完成这个小插曲后,你又要投入到主线剧情 吃饭这个
主程序
上。
现在我想告诉你一个惊天秘密
,
其实你妈欺骗了你,你根本不是他们亲生的,你是人造人,而你的大脑里装备了一个
arduino
控制器!你的型号是
Arduino
吃货
,之所以叫这么
2
的名字,是因为你的
loop
的写法问题。我们来看看你的
loop
函数。
代码:
void loop() {
吃
();
}
吃,是的,你没有看错,你的人生是如此的幸福,就是不断的
吃
();
循环
但实际上,你还有附加功能
开门
();
代码:
void
开门
(){
打开门
;
if(
门口的人
==
女神
)
跪舔
();
if(
门口的人
==
查水表的
)
报告水表读数
();
}
为了让你能顺利执行
开门
();
动作,你的亲生父母还得在
Setup
函数
中设置
开门
();
这个动作何时启动。
(
也可能是你后妈设定的
)
,具体的方法是
attachInterrupt(
中断通道
,
中断函数
,
触发方式
);
,在这里中断通道就是你的
耳朵
(不要问为什么不是屁股),触发
开门
();
这个函数的方式是
敲门声
。
代码:
void setup(){
attachInterrupt(
耳朵
,
开门
,
敲门声
);//
耳朵传感器在此不做介绍,有兴趣的自行研究
}
这样设定后,你每次听到敲门声,就不得不去打开门,并执行相应的动作了。
也许你对这样的人物设定不太满意,但这就是你的宿命,少年。
忘记你蛋碎的屌丝设定吧,我们要开始严肃的讨论问题了
2.
各种型号
Arduino
外部中断引脚
外部中断在不同的
Arduino
型号上位置也不同,只有外部中断发生在以下端口,
Arduino
才能捕获到,以下例举了常见的几种型号的外部中断引脚标号。
型号
int.0
int.1
int.2
int.3
int.4
int.5
UNO\Ethernet
2
3
Mega2560
2
3
21
20
19
18
Leonardo
3
2
0
1
Due
所有
IO
口均可
3.
中断函数,中断触发模式与设置中断
中断函数
就是你要去执行的函数,这个函数不能带任何参数,且没有返回类型。如:
代码:
void holle()
{
Serial.println("holle");
}
中断模式
就是你的中断触发方式。在大多数
arduino
上有以下四种触发方式:
LOW
低电平触发
CHANGE
电平变化,高电平变低电平、低电平变高电平
RISING
上升沿触发
FALLING
下降沿触发
HIGH
高电平触发
(
该中断模式仅适用于
Arduino due)
在定义中断函数后,要使用外部中断,你只需要在程序的
Setup
部分配置好中断函数即可,配置函数如下:
attachInterrupt(interrupt, function, mode);
//interrupt
为你中断通道编号,
function
为中断函数,
mode
为中断触发模式
需要注意的是在
Arduino Due
中,中断设置有点不同:
attachInterrupt(pin, function, mode);
//due
的每个
IO
均可以进行外部中断,所以这里第一个参数为
pin
,即你使用的引脚编号。
如果在程序中途,你不需要使用外部中断了,你可以用中断分离函数
detachInterrupt(interrupt );
来取消这一中断设置。
同样在
Arduino Due
上,该函数为
detachInterrupt(interrupt );
。
4.
例程
外部中断的使用也是非常简单的
,
下面我们来看一个官方提供的例程
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);//
当
int.0
电平改变时
,
触发中断函数
blink
}
void loop()
{
digitalWrite(pin, state);
}
void blink()//
中断函数
{
state = !state;
}
5.
应用
利用外部中断
,
可以在很多地方提高你程序的运行效率
.
同时你也可以运用以上知识
,
使用
旋转编码器
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
或者最一个
简单监控装置
来自:
电子信息
/
电子技术
/
嵌入式
0
0
全部
只看作者
全部
只看作者
在列表中查看
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
编辑
删除
{{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
保存
取消
我也是有底线的
保存中...
保存