外部中断的使用方法

1.什么是中断?

试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得不去开门,同时不得不放停下生命中最重要的事情------吃饭。打开门后,你发现只是一个查水表的,你检查了水表读数并告诉了查水表的人。关上门,你马不停蹄的又投入了于食物的作战中。我们来分析一下这个颇具传奇性的故事,在这里人生的主旋律------吃饭,就是你的主程序 ,而敲门声,就是一个中断信号 ,它让你不得不去执行你的人生插曲------开门接客这个中断函数 。完成这个小插曲后,你又要投入到主线剧情 吃饭这个主程序上。

现在我想告诉你一个惊天秘密,其实你妈欺骗了你,你根本不是他们亲生的,你是人造人,而你的大脑里装备了一个arduino控制器!你的型号是 Arduino 吃货,之所以叫这么2的名字,是因为你的loop的写法问题。我们来看看你的loop函数。

mw_shl_code=cpp,true\]void loop() { 吃();}\[/mw_shl_code\]吃,是的,你没有看错,你的人生是如此的幸福,就是不断的 **吃();循环** 但实际上,你还有附加功能 **开门();** \[mw_shl_code=cpp,true\]void 开门(){打开门;if(门口的人==女神) 跪舔();if(门口的人==查水表的) 报告水表读数();}\[/mw_shl_code\]为了让你能顺利执行 **开门();** 动作,你的亲生父母还得在**Setup函数** 中设置 **开门();** 这个动作何时启动。(也可能是你后妈设定的),具体的方法是**attachInterrupt(中断通道, 中断函数, 触发方式);** ,在这里中断通道就是你的**耳朵** (不要问为什么不是屁股),触发 **开门();** 这个函数的方式是 **敲门声**。\[mw_shl_code=cpp,true\]void setup(){ attachInterrupt(耳朵, 开门, 敲门声);//耳朵传感器在此不做介绍,有兴趣的自行研究}\[/mw_shl_code\]这样设定后,你每次听到敲门声,就不得不去打开门,并执行相应的动作了。也许你对这样的人物设定不太满意,但这就是你的宿命,少年。忘记你蛋碎的屌丝设定吧,我们要开始严肃的讨论问题了 {:soso_e197:} # 2.各种型号Arduino外部中断引脚 外部中断在不同的Arduino型号上位置也不同,只有外部中断发生在以下端口,Arduino才能捕获到,以下例举了常见的几种型号的外部中断引脚标号。 ![](https://file.jishuzhan.net/article/1780972781345705986/b76e3a1f2df37eac33cdbb0a402f05ac.webp) # 3.中断函数,中断触发模式与设置中断中断函数 就是你要去执行的函数,这个函数不能带任何参数,且没有返回类型。如:\[mw_shl_code=cpp,true\]void hello(){ Serial.println("hello");}\[/mw_shl_code

中断模式就是你的中断触发方式。

在大多数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.例程

外部中断的使用也是非常简单的,下面我们来看一个官方提供的例程

mw_shl_code=cpp,true\]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;}\[/mw_shl_code

5.应用

利用外部中断,可以在很多地方提高你程序的运行效率.同时你也可以运用以上知识,使用

旋转编码器 或者最一个 简单监控装置

相关推荐
沪漂阿龙35 分钟前
面试题详解:智能客服 Agent 系统全栈拆解——Rasa Pro、对话管理、意图识别、GraphRAG、Qwen 与 RAG 优化实战
人工智能·架构
x_yeyue1 小时前
三角形数
笔记·算法·数论·组合数学
辰海Coding2 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
念何架构之路2 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星2 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑2 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
云边云科技_云网融合2 小时前
企业大模型时代的网络架构五层演进:从连接到智能的范式重构
网络·重构·架构
Yunzenn2 小时前
字节最新研究cola-DLM第 01 章:语言生成的三次范式之争 —— 从 RNN 到 AR 到扩散
架构·github
黎阳之光3 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
她的男孩3 小时前
从零搭一个企业后台,为什么我把能力拆成 Starter 和 Plugin
java·后端·架构