所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
转帖:Arduino教程——外部中断的使用
kc20382013/09/07电子技术 IP:广西
Arduino教程——外部中断的使用

XXXXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXml
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()
{
  XXXXXXXXXintln("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.应用

利用外部中断,可以在很多地方提高你程序的运行效率.

同时你也可以运用以上知识,使用  
旋转编码器  
XXXXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXml

或者最一个
简单监控装置
来自:电子信息 / 电子技术严肃内容:教程/课程
0
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
kc2038
学者 机友 笔友
文章
37
回复
268
学术分
1
2009/01/06注册,5年8个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}