粉丝1984获赞1.1万


今天现场写一个单片机中断应用程序,为了让大家更容易了解中断的用法,就选择写一个比较简单的外部中断程序。 程序目标使用一个按键模块,通过外部中断控制。学习版 pe 上 led 灯的亮面, 按键按下时,下降沿信号触发 led 灯的交替亮面,也就是按键按一下 led 灯亮,再按一下 led 灯灭,这样交替往复。外部中断可以是下降沿,也可以是边沿触发中断请求, 这个符号代表的是边缘触发中断请求,也就是下降炎和上升炎都 会触发中断请求,这个符号代表的是下降言触发中断请求。具体哪种形式触发中断请求,可以在相应的寄存器中配置。 可能还有同学不知道什么是下降眼,什么是上升眼,什么是边眼。 用丝波器接一个按键模块给大家演示一下。将丝波器一路探针接到按键模块的输出。 ios 上探针的极硬的接按键模块供电的负极 四拨器设置成单次采集模式。按键未按下时,由于上拉电阻的作用,按键 电模块 io 输出高电瓶,当按键按下时,输出 io 电压被 gnd 拉低, io 变为低电瓶,这个高电瓶突变为低电瓶的过程就是下降盐, 当按键松开后, io 电压又恢复高电瓶,这个低电瓶突变为高电瓶的过程就是上升盐好,下降盐和上升盐就统称边沿。 我们这次程序的目标是下降严中断,也就是这个下降严信号触发中断服务函数 学习版我又改进了一下。 单片机每个 l 都增加了 led 灯,这样每个 l 电瓶高低状况就一目了然,单片机入门第一关就是要成为点灯大师,点灯点的好,单片机就入门了一半。 stc 八 g 单片机的外部中段是跟固定 io 捆绑的,我计划用外部中段零来控制 led 灯。 通过查看技术手册可以看到 p 三点二端口对应外部中断零, 将按键模块的输出开一端口连接到学习版 pe 三点二端口按键模块的 gnd 接学习板, gndvcc 接学习板为 cc。 为了代码更简单,这次程序就不考 按键防抖的问题,而是在按键模块输出 io 和井底之间焊了一个一百纳法的电容,用作按键的硬件防抖。 这个方法我在前面的视频中已经讲过,这里就不重复了。新版本学习版 pe 端口已经集成了 led 灯,就不需要在外界 led, 用旧版本学习本的同学在 pe 端口接上八位 led 灯模块就可以了。 粘上串口烧肉模块,硬件部分就搞定了,下面就开始写程序,打开开二五,新建 一个工程,选择或新建一个放置新工程的文件加工程名字最好使用英文开奥,有些版本对中文的支持并不友好, 名字里不能使用禁止的符号,比如这个斜杠就不能用 这里工程名我就用 mai pelojit, 中文就是我的工程的意思,名字起的通用一点,下个工程就可以直接拷贝粘贴,不需要每次都去新建工程。 这里我是考虑初学者比较多,就从头到尾完整做一遍工程。起好名字,单击保存按钮, 这里选择 stcmcu 数据库, 然后选择 stc 八 g e k 零八系列, 单击 ok 按钮,工程就信件好了,可以看到左边工程窗口里就出现了刚信件的工程。 工程可以理解为一个项目的资源集合,也可以理解为一个虚拟文件家, 他把项目需要用到的资源都集中在里面,比如代码图、文件、图片等。下面我们就开始向工程里添砖加瓦。 首先先建一个写原代码的文件,点击这个新建文件的图标, 会出现一个空文本文件编辑窗口,把它拧成为慢点 c 文件, 这个文件名也是可以用其他名字后缀为点 c 的文件,使 c 语言存放元容程序的文件。这个文件另存后其实还是有利于工程之外的, 我们需要把这个文件添加到工程中去。右键任务一,图标选择管理工程项目菜单,单击添加文件, 选择刚刚新建的文件,这样这个文件就会成为工程的一个项目。 另外,我们这个工程是为单片机建立的,最终要生成单边机烧录用的 h e x 文件,还需要单击一下这个任务选项卡图标, 在输出标签卡中选中生成 h e x 文件选项, 如果不选中这个选项,开要编译时就不会生成单面机需要的 h e x 五年, 这点初学者一定要注意。开药中常用到的英文单词并不多, 如果对英文不熟,可以把这些常用单词抄下来多背几遍,不建议把 ko 汉化。下面我们就开始写代码。 c 语言程序必须要有一个主函数,慢, 先写一个空白的主函数,注意这个是循环语句,不要省略,这样可以让程序一直保持执行, 如果不写这个死循环语句,根据各单篇记的执行记字,可能会出现不同的情况。 比如有些单面机执行完慢函数后会循环复位,然后再执行慢 函数,这样反复复位重启机制可能会造成逆逻中断等程序无法正常运行。组程序加上后,再把 stc 八 g 的头文键加上, 这个头文件包含了 stc 八 g 系列单面机相关的寄存器定义,用厂家现成的这个投文件,就不需要自己去定义那些寄存器,省时间。 这次要用外部中段零来实现功能。把外部中段零的中段服务函数加上, 先加个空函数,框架搭好后再写代码。下面就开始写代码,先明确一下程序的目标, 写一段小说明,这样别人或自己以后看这段代码就知道是干什么用的。下一步,定义一下要用到的变量, led 灯状态是亮是灭,可以用一个未变量来标识 第一个名字为 led flag 的未变量。外部中段零发生中断, led flag 等于一时 led 灯亮,外部中段零发生,中段 led flag 等于零时。 led 灯面 变量先定义到这里,后面如果有需要再定义。通过前面的学习,我们知道要 点亮端口上的 led 灯,要设置端口模式,使用外部中段也要做相应的设置。另外变量和净存器有些要副出词, 干脆就把这些前期工作都放到一个初始化函数里,新建一个名为 init 的初始化函数。 第一步,先设置一下 io 端口模式, pe 的八个 io 用作 led 灯端口, 为了 led 灯更亮一些,把 pe 的所有 io 设置成推碗模式,端口模式的设置在之前的视频中已经讲过 不清楚的同学可以回看一下之前的视频,或者看一下技术手册。第九点二小节, pem 一寄存器八个位设为零, pem 零寄存器八个位设为一。 p 一的所有 io 就被设成了推碗模式, 单片机上电选择不亮灯, pe 纪存器的初始值设为零。 连接按键模块输出 io 的 p 三零二端口的端口模式确诊是高组输入模式, 高左输入模式、准双向口模式和开路模式都可以用于外部中断,所以 p 三点二的端口模式用缺损的就可以,不需要单独去设置。有兴趣的同学可以分别把 p 三点二端口模式设置成准双向口,高速输入开路模式,看看实验结果会不会有什么不同。 设置完 io 端口模式,下一步就是外部中断零的相关设置。 想要搞清楚外部中段零的设置方法,最好的办法就是看外部中段零的中段结构图。 这是外部中段零的中段结构图,我们从左向右看,首先是四次中段请求的类型, it 零等于零,是边缘触发中断, i t 零等于一是下降沿触发中断。本次程序的目标是按键的下降沿触发中断,所以 it 零要设为一, 在代码中先写上。 接着看图 a, 零是中段的状态位,我们暂时用不到,不管他。接下来就到了中段,允许控制这块, ex 零等于一,允许外部中断零。这里还有一个中断的总开关, ea 要启动外部中段零, ea 也必须等, 等于一。所以外部中断零的配置当中还必须写上 ex 零等于一, ea 等于一, 再往右就是中段优先级,控制外部中段零的中段优先级确诊值为零,也就是最低中段优先级。 由于本程序中就只有一个中段,外部中段零的中段优先级用确诊值就可以了, 不需要另外再设置。在代码中敲入 ex 零等于一, ea 等于一,这样外部中断零的初始化设置就完成了。初始化函数在单面机启动 用时运行一次就可以。通常把这个初始化函数放到主函数慢中运行。最后一步就开始写中段服务函数。 这里的 interrupt 零对应的是外部中段零。各种中段对应的中段序号可以在技术手册中查到。假如按键模块要接在外部中段一上, 这里中段序号改成二,这个函数就变成外部中段一的中段服务函数。 这里的函数名是可以自定义的,可以取任意合法的名字。下面开始写这个中段函数的代码,每次按键 模块按下时产生的下降盐信号会出发执行一次这个中断函数。我们可以根据定义的 led flaggoy 变量来判断是应该亮灯还是应该灭灯。 逻辑很简单,如果 led flag 等于一,则亮灯,反之则灭灯。代码可以用 if l 时语句这么写, 当 led flag 等于一时, pe 的所有端口设为高电瓶,点亮 led 灯,否则 pe 的所有端口设为低电瓶,熄灭 led 灯。 这里条件表达是用双等于号与变量复制语句的,单等于号区分一下,这个衣服语句还可以简化为这样 执行效果也是一样的。一副语句的用法,以后会专门安排一期视频讲 一副语句执行完后,需要将 led 弗拉格词取反,以便下次执行中断时反向操作。这次亮灯,下次就灭灯。这次灭灯,下次就亮灯。 这个是取反符号,大家要记住,取反符号在未操作中经常会用到, 代码就基本写完了。编译一下,生成一个单面机能看得懂的 h e x 文件,这个 h e x 文件就相当于 p c 的 e x e 文件。 打开 stc 厂家提供的销路软件,设置好单片机型号, 选择创口 cpu 频率。打开刚刚编译好的 hex 文件,点击下载按钮,程序就开始下载到单篇记里。 这次我用的是免硬启动的下载模块,不需要手动给单面机断电。如果使用 普通下载模块的同学,需要手动观看一下学习版开关才能完成下载。下载成功后就可以测试了。按一下按键, pe 的八个 led 灯亮起, 再按一下按键, pe 的八个 led 灯熄灭,多按几次 led 都能正常亮面。交替 代码编写成功。下期视频讲定时器,今天视频比较长,主要针对初学者, 不知道这样讲大家好不好理解,麻烦大家评论区反馈一下,我好持续改进。好今天的视频就到这里,谢谢大家观看,喜欢点赞加关注!

今天我来给大家讲一下关于 alco 中断的实验。首先呢我们要知道上一次课我们给大家讲的是外部中断, 我们知道外部中断数量很少,只有特定的几个 alco 是可以作为外部终端外部中断的啊,输入引导使用的, 比如说这个 s、 t、 c 八八 k 六四 d 四呢,它有五个外部中断,但是五个在很多的场合是不能够满足需要的, 所以就是说,呃, stc 比较新的,比较新的型号的单片机都增加了 r 口,可以作为中端 换使用,那么这样的话我们就要啊,嗯,知道一些一些概念,比如说中断相关的概念,还有就是中端向量大于三十一,那么怎样去处理? 还有就是啊,针对这些 r 口中段,他的中段服务程序又该怎样去写这些呢?我们都会在接下来的啊视频中给大家进行讲解。好,首先呢,我们要知道 s、 t、 c 八八 k 六四第四单面机,它的所有的 g、 p r 口,普通的啊,输入,输入音角都可以作为 r 口中断使用,并且 支持四种触发模式,这比之前的外部中断呢啊,类型更多。我们知道之前的外部中断他只有两种啊,有的还只有一种,就是要么下降炎中断,要么另外一种呢,就是上唇炎或下降炎中断两种。而这个阿古中断呢,他支持 这是四种,比如说下降炎中断、上冲炎中断、低电瓶中断和高电瓶中断。这个呢,在后面我们会给大家讲一下这四种中断啊,它有什么区别,但大家首先要理清楚一点啊,就是这个 gdl 中断呢,它更加的 灵活,更加的灵活啊,可能大家在这个时候呢还会有一个疑惑,比如说之前的我们给大家讲,他的外部 中断零是 p 三点二,那么 p 三点二它可以作为这个 r 口中断使用吗?这个答案是肯定的,因为这里说的很清楚,就是所有的 r 口都支持中断 p 三零二,你可以把它作为外部中段使用,也可以把它作为就是 gtr, 就是 gtr 口的中段使用好。然后呢就是 rr 口的终端号呢啊, p 零到 p 七端口,它的终端号是三十七到三十四, 我们知道三十七和三十四呢大于三十一,而我们的编译软件 q 他能够支持的终端号是零到三十一,那么 当它大于一的时候,大于三十一了怎么办?因为大于三十一之后啊, r 口中段的中段服务函数 是没办法使用这些三十七到四十四的重大号来进行编译的,就是说编译会出错。这个时候呢 啊红金科技呢是给出了一些解决办法,比如说用这个第十三号中段作为他的入口地址,我们再看一下这个芯片手册的时候,我们可以看到这个十三 就是预留的,就是预留的正好啊红军科技呢把这个十三呢作为啊中段的入口地址,然后呢 嗯, 然后需要加一些说明,这个在后面例子的时候会给大家讲,就是说在 q 里面呢,会加了一些会编的程序在里面, 这样的话就很好的解决了这个终端号大于三十一的情况。 这里呢啊大家呢了解一下,就是 p 零到 p 七啊,它的中段中段号呢是多少大家有个印象,然后呢,嗯, 我们要知道就是 r 口的中段是针对于 r 口端口的,只有端口有独立的终端入口地址,不是每个 gpr 口都有独立的入口地址的, 但是每一个 gpr 口都可独立设置是否开启 io 中断以及中断模式。 好,接下来呢,我们啊来给大家就是说说一下一些 就是编程上面啊遇到的一些知识点,比如说电瓶触发和边沿触发的区别,因为我们在这之前给大家说了这个阿口中断知识四种模式, 他有啊,上升炎和下降炎都属于边沿触发,低电瓶和高电瓶呢属于这个电瓶触发,那么电瓶触发和边沿触发有什么区别呢?这个呢啊要使用这个图形给大家去诠释 最方便呢,比如说下降炎触发的话,那么这个红色的,也就是说啊, 当这个中断中断口中断口上面的电瓶有高电瓶变为低电瓶的这个过程,是产生一个下降炎,这个下降炎是可以触发中断的, 也就是说这段是有效的,其他的都不会触发中断,而上中年是恰恰相反,也就是说在他的中断引脚上面 给出来的电瓶是由低电瓶到高电瓶这样一个上升的过程,那么这个上升沿这个上升的过程是可以触发中断,其他的情况都不能触发中断。那么电瓶 中断呢啊,就是电瓶触发呢,电瓶触发呢啊,分高电瓶和低电瓶两种,这里呢我们只给出来了就是低电瓶,也就是说啊,在高电瓶的时候不会触发中断, 有高电瓶变成低电瓶的过程也不会触发中断,只有这个啊, 中断引脚上面,中断引脚上面产生一个低电瓶的时候,才会触发中断,在触发中断的时候,那么就会去执行中断服务环数里面的内容, 如果中断服务函数执行完,那么就会跳出这个中断,但此时如果这个触发就是这个中断引脚上面依然依然还 是低电瓶的话,那么会再次进行中断,那么还会再次进入这个中断服务程序,然后执行完,这时候看,如果这个时候已经啊进入其他的,比如说上升严了,或者是高电瓶了,那么就不会再触发中断 高电瓶是同样的道理啊,这里呢我们要要明白,就是说,呃, 针对于这个啊,下降也和上升压没什么好说的,主要针对于这个电瓶触发, 那么啊,我们一般有一个有一个处理办法是什么呢?就是说啊,在中断退出前关闭中断,等后面恰当的时机再打开, 什么意思呢?就是说如果这个假如说低电瓶有效啊,这个低电瓶持续的时间很长, 那么中断服务函数呢,往往往往是很快捷的,很短的,那么一旦执行完这个中断服务函数之后,那么 如果不把这个中断关掉的话,那么很因为这个低电瓶一直在保持吗,很快会再次进行中断, 那么啊,这样的话很可能不是你所需要的,因为你不需要他这么频繁的进中断,进中断服务函数,那这个时候呢,就需要就是说先关掉中断,然后呢啊,再在适适当适当的时候啊再打开, 也就是说这个关闭中断呢,你可以放在这个中断服务函数里面去做好这一点呢,大家注意了,然后我们再给大家说一下这个啊中断他的一个通常的一个步骤,也就是说这个阿口的中断, 在通常情况下我们该怎样去使用,也就是说使用的时候我们要注意哪些步骤?那么这里呢我们简单给大家捋一下, 说完这一点步骤之后呢,剩下的,剩下的我们会在啊下下一讲,下一讲也就是针对于具体的实验历程 来去给大家去分析,看看我们实验的代码是不是按照这个顺序,按照这个步骤来操作的。首先呢我们要讲就是说 啊,哪一个啊口中断要把它配置一下他的模式,那么肯定要把它配置成输入,然后呢这个上拉电阻,也就是说如果你的电路上面有外部的上拉电阻,那么你可以啊,可以忽略这一步,如果没有的话,这呢就要把它配置成 啊,就是使呢他的内部的上拉电阻。还有一个呢就是初始化阿口中断,开机总中断, 嗯,这个总中段指的就是 e a 啊, e a, 一定要把这个总中段打开,前面有一个初始化 r 口中段,这个地方呢是一个难点,为什么是一个难点呢?因为我们知道 这里的 alco 中断都是大于三十一的,那么我们如何在 q 里面去实现, 去实现,那么啊是我们啊要讲的重点,要讲的重点,当然呢这个编写中断的服务函数也是和这个 啊重点是息息相关的,息息相关的好,但这些呢我们就针对于啊下一次课关于实际的代码呢,就给大家分析好关于这个阿狗的中段呢领略部分我们就介绍这么多,谢谢大。



这是一颗 stc 八 h 一 k 幺六单片机,他是红金科技近年来主推的一款高性能微控制器。 stc 八系列单片机仍以五幺为内核指令代码与传统的八零 c 五幺单片机完全兼容, 一点九至五点五伏的宽工作电压范围使得他的应用场合更加的广泛。不同于以往的幺幺幺二幺五等系列单片机, stc 八系列单片机绝大多数为贴片封装,体积小巧, 如 l q f p 三十二封装银角间距为零点八毫米。 tssop 二零封装银角间距为零点六五毫米, q f n 二零封装银角间距仅为零点四毫米。同时,八系列的面积是 stc 首款集成片内 iphone c 接口的单片机。他的利益突出特点是拥有独立的 adc, 外部参考电压源输入银角,这使得他的 adc 更加准确。 s t c 八系列单片机型号众多,不同型号的单片机外设及内存容量大同小异,使用时根据需求选取相应的资源即可。我们以 s t c 八一八 k 幺六 s 四 a 幺二为例, a 代表旗舰款, 内存容量为八千字节,闪存容量为十六千字节,有四个独立串口, adc 精度为十二位。 八系列单片机拥有高精度的内部整档器成分下误差仅为正负百分之零点三,程序烧血时默认使用内部整档器。可以看出官方对这个系列 单片机的内部诊断器经络非常的自信。我们在下载界面可以选择内部诊断器的频率,如果使用外部进证,则需要软件设置相关的系统式中控制集存器。

我是一名准大三的大专生,读的专业是电子信息工程,明年就要毕业出去找工作了,自己啥也不懂,不知道找什么工作,现在开始自学单片机,希望到时候能够找到相关类似的工作。 这是我自学单片机的第九天了,今天学习外部中断的知识,这个中断有什么应用咱也不知道,先按照视频教程的来学,先学霸舍友说,外部中断, 顾名思义,由于外界输入影响,单片机由主程序跳到中断程序,我也不知道是不是真的,大概试了试,确实会进入中断程序。 先来看看代码,三十八到四十四行的代码先进行外部中断初始化,将进入中断程序设置为下降严触发, 也就是说由高电瓶变成低电瓶的瞬间就会进入中断程序。这些中断使能开关也要通通打开,然后将按键输入检测的 i o 口,接到单片机外部中断检测的 i o 口, 只要按下按键就会产生一个下降沿,然后进入到中断程序。中断程序是六十五到七十二行代码里面的代码意思是将小灯的亮灭取反。实验现象是这样的, 每次按下按键,小灯都会改变当前的状态。今天就先学到这里吧,昨晚熬夜打游戏实在是太累了。


自学单片机外部中断控制,刚学了这个外部中段控制,分享给大家看一下。主程序是让这八个灯常亮,用两个独立按键设置了外部中段零和外部中段一, 按下按键一之后,这八个灯会闪烁五次,然后再回复到主程序常亮,按一下按键之后,这八个灯会执行流水灯程序,循环五次之后恢复到常亮状态。 中断就是当他在做一个事的时候,你让他去做另外一个事,另外一个事做完了之后,他又回来接着做前面那个事。中断是有优先级的,从这个表上来看,外部中段零比外部中段一的级别要高, 这么来说到外部中段零应该还能把外部中段一给中断掉,但是我的这个就不行,在执行中段一流水灯程序的时候,按中 中断零的这个外部中断没有用,中断不了它这个是写的程序中断优先集,还需要再单独的写出来吗?请各位大神在评论区留言。

前面我们在做按键控制实验的时候,虽然能够实现 i o 口输入功能,但是代码它是一直在检测 i o 输入口的变化,因此效率不高。 特别是在一些特定的场合,如果某个按键可能一天他才会按下去一次,执行一次这个相关功能,这样我们就大大浪费了时间和资源来实时检测按键的情况。所以呢,我们本节课学习外部中断,通过外部中断实现按键控制 led。 那我们首先就要了解什么是中断,在单片机中啊,中断是指 cpu 在正常处理事件 a 时,突然发生了事件 b, 需要 cpu 去处理, 这时呢, c、 p、 u 就会暂停处理事件 a, 转而去处理事件 b, 等这个事件 b 处理完以后呢,再回到事件 a 原来中断的 地方继续执行事件 a, 这一个过程呢,就被称为中断。举一个比较形象的例子啊,你正在洗衣服,结果呢,手机突然响了,手机就是这个中断源,也就是这里你的手机突然响了, 于是你就暂停了洗衣服的工作,先去拿手机接电话,等你打完电话之后呢,再回来继续洗衣服,这个过程呢就是中断。 但是如果你在洗衣服的时候,手机响了去接电话,然后接电话的时候呢,你又发现这水烧开了,你是不是又得去把这个壶拿下来, 等把这个火关了之后,你再回来继续接电话,电话打完之后再回来继续洗衣服。我们是不是在中断一,里面又出现了一个中断二,当我们执行第一个中断 的时候,结果发生了另外一个中断级别更高的中断事件,这时候呢, cpu 就会暂停当前这个中断,先去执行优先级更高的这中断,等处理完优先级更高的,再回到这个节点继续执行。这种呢,就被称为中断的欠套。 中断的欠套呢,涉及到一个中断的优先级问题,优先级高的中段就可以打断优先级低的中段执行 中断可以根据中断源分为硬件中断和软件中断。硬件中断呢,也被称为外部中断,它是响应外部硬件事件而发生的,比如检测到触摸时,会发生一个触摸中断, 而当 gpio 银角的状态发生变化时呢,也会产生一个 gpio 中断,这个 gpio 中断和这个触摸中断都属于硬件 中断,也就是外部中断。那第二种呢,就是软件中断,他是这个触发软件事件时会产生的中断。那什么是软件事件呢?就比如这定时器,一出定时器中断,他就是软件中断中的一个例子,这个我们下节课讲, 所以呢,为了解决资源占用的问题,我们就引用了外部中断,顾名思义啊,就是当按键按下的时候,也就是产生中断才去执行相关功能,这样就大大节省了 cpu 的资源,因此中断在实际项目中应用非常的普遍。 esp 三二外部中断呢,有上升盐、下降盐、低电瓶、高电瓶触发这四种模式。什么是上升盐和下降盐啊?下降盐就是由高电瓶变为低电瓶的瞬间,而上升盐呢,就由低电瓶变成高电瓶的瞬间。 如果我们把按键对应的 gpl 配置为下降源触发,那当我们按键按下后,就会触发中断,然后再中断回掉函数内执行对应的功能。 了解完中断的原理之后,我们就可以开始搭建我们的电路了。首先需要用到的就是一个 led, 一个电阻,一个按键,还有镀光线和面包板,这 led 呢,就是用电阻接第二引脚按键呢,一端接电源,另一端接第十四。 我们之前说过啊,这个键他算是 gpl 输入,对不对啊?一端接电源,另一端接引脚了,所以我们该给我们这个按键配置一个上拉电阻还是下拉电阻? 应该是下拉对不对?因为当我们按下的时候,咱们这个电源和 gpl 联通是不是瞬间就给他了一个高电瓶,所以我们 默认呢,给它一个低电平。咱们如果想要在 r n 斗中使用外部中断的话,就需要用到呃 text interrupt 这个函数。 attach interrupt 的函数呢,它有三个参数,第一个参数呢,是要使用这个低级头 pin two interrupt 这个函数,它呢使用一个 pin 的一个参数, pin 就表示咱们的 g p i o 端口号, 接着这个 isr 呢,他是中断服务程序,就没有参数,也没有返回值。最后一个 mod 表示咱们这个中断触发的一个方式,可以是这个低电瓶触发,可以是高电瓶触发,也可以是上升盐触发,下降盐触发和电瓶变化触发。 低电瓶和高电瓶我们都可以理解,但是这个上升盐和下降盐是什么意思呢?上升盐是表示咱们这个电 屏呢,从低电瓶变为高电瓶的这个瞬间就叫上升沿。下降沿呢,就是表示从高电瓶变化为低电瓶的瞬间就叫做下降沿触发, 然后在二零六中呢,使用外部中断有以下几个关键点需要注意一下,第一就是尽量保证咱们的中断程序内容够少。 第二呢,就是尽量避免在这个中断处理函数中呢,使用阻塞函数,就比如 d 类,使用这个非阻塞的延迟类方法来处理需要延迟的操作,这样就能保证咱们中断的正常执行和系统的稳定性。 这是因为这个 d 类函数,他会阻塞整个系统,包括中断的正常执行。当咱们中断触发时呢,处理函数应该尽快执行完毕,来确保 及时响应,并避免呢这个中断的积压。第三点就是和主程序共享的变量呢,它的前面要加上一个 volatile 的关键字。 最后一点就是在阿顿斗中呢,使用中断时,应该尽量避免在这个中断处理函数中使用这个 siri 的对象打印内容,否则呢,会导致以下两个问题。第一就是时间延迟, siri 打印函数呢,通常是比较耗时的一个操作,他会阻塞中断的执行时间,从而导致中断响应的延迟,这可能会导致在中断期间丢失其他重要的中断事件,或者呢导致系统不稳定。 第二点呢,就是缓冲区的溢出,这个 siri 对象他在内部使用一个缓冲区来储存要发送的数据,如果在中 乱处理函数中呢,频繁调用 serial 打印函数,可能会导致缓冲区的溢出,造成数据丢失或者呢不可预测的行为。 所以呢,我们该如何在程序中通过咱们这个中段函数在串口中啊引内容呢? 我们的代码可以这么写,那首先就是定义咱们这个用到的引脚红定义呗,就是 defi baten 十四,接着呢就是定义咱们这个赛拉马函数和这个鹿函数, 如果我们想启用窗口屏的话,咱们是不是就需要先初始化一下它的波特率,那就是在 set up 函数中呢, serial 点 begin, 比如我们给他一个九千六,接着就配置咱们这个按键, 菱角就是 pin mode button input 杠勾档。 配置完这个输入引脚之后呢,我们就要配置中段引脚了,那就呃泰式 interrupter, 第一个参数呢是 d 指头 pin to interrupt, 然后输入咱们这个 gpl 端口号 button, 第二个参数呢是中断执行的一个程序对不对?我们就给他一个名字,就叫他 candle, 这 interrupter 名字可以随便起啊。然后我们的触发模式是什么呢?我们想哈我们这个按键其中一端接的是电源对不对?所以呢他的默认状态下是一个低电屏,联通之后呢就会得到一个高电瓶的一个输入,我们既可以用上升盐触发,也可以用下降盐触发, 上升盐触发呢就是咱们这个按键一按下获得的这个输入值呢,就会由低电瓶变为高电瓶,而我们如果使用这个下降盐触发的话,他就是在咱们这个按键松开的一瞬间就是由高电瓶变为低电瓶,那我们就使用下降盐触发吧, 他们两个呢实验效果就是不一样,上升烟触发呢,是我在按下的一瞬间他就会触发,而下降烟触发呢,他是在我这个松手的时候才会触发, 那咱们这个配置中断音角已经完成了,最后就是再写一个中断执行程序呗,名字咱们下面已经写好了,就是这个 handle 杠 interrupter, 如果你怕写错的话,其实你也可以把这个给他复制过来,对不对?内容我们就是在他触发的时候呢,我们 就让他在这个中断执行程序中啊,打印一下,就是咱们这个按键,按下的时候就让他打印一下中断触发了。接着我们稍录一下代码, 现在程序收录好了,我们就打开工具栏中的咱们这个创口监视器,接着呢我们就按一下我们的按键, 哎,咱们看打印的内容并不是这个中断触发对不对,而是一个不知道的程序,而且这里我再按一下的时候,咱们看啊,他就会出现什么问题,他就会出现报错,那所以我如果想打印内容的话,该怎么实现呢? 为了避免这种问题呢?我们呢可以是在这个落魄函数中打印这个内容,但是呢咱们不是一直循环打印,而是通过一个标志符呢,通过一变量来检查是否需要打印。就比如我们可以定义一个 可以在外部中断函数内部使用的变量,那就是 volley tell 类型呢,我给他一个布尔 flag 变量名呢叫 flag, 默认指呢是 force, 如果我按键触发的话,咱们就把这个 flag 给它改成是处,那咱们这个主循环呢,它就一直检测咱们这个 flag 的一个值,如果 flag 值呢变成了处,我们就调用 serial 这个 print line 方法, if flag, if flag 等等余处和 if flag 呢是作用相同,内容呢就是 cereal 点 print lie 打印这个外部中断不发了。但是你想想啊,如果我们现在就结束的话,我是不是按键只要一触发之后,咱们这个外部中断触发这句话就会一直打印,一直打印,一直打印就没完没了的打印,对不对? 所以呢,我们需要在打印完之后呢,把这个 flag 给它改回原来的 false 这个值, ok, 接着呢我们就上传下代码, 继续打开我们的创口电视器,现在我们再来按一下按键, 咱们看现在这个外部中断,为什么我按一下他可能会触发好几次,因为我们没有对这个按键做一个消斗处理,对不对?但是我们现在在这个创口屏中呢,打印的内容就已经正常了。 刚才我们讲了啊,我们要尽量避免在中断处理函数中使用这个 dele 方法,就为什么呢?我们现在就拿我们的实验来验证一下, 比如现在我要使用外部中断,通过这个按键控制这个 led, 每当我这个按键按下的时候呢,这个 led 就亮两秒,然后自动关闭。 那我们的代码就可以这么写,先是红定义理发 butt 十四,再是我们的 led 就是二,接着写我们的这个 cd 函数,还有我们的这个 lop 函数。 在塞纳版书中呢,我们需要给咱们的按键呢,配置一个输入模式,给咱们的这个 led 呢,配置一个输出模式,然后再配置一下中断引脚,那就拼 mod 巴特 input 杠铺下拉,对不对?当 接着就是拼 mod led, old pro led 嘛,就是咱们的输出模式,然后就配置中档引脚, 那就是台词 interrupt 低级头聘物, interrupt 银角号就是咱们的巴特 isr, 咱们的中断执行程序最后一个模式呢,我们还是这个否令, 那我们就接着写我们的这个中断执行函数,那就 void i s r y 名字可以随便起,对不对? 那内容什么呢?内容其实就是我们让这个按键呢,触发之后让他点亮这个 led, 接着呢延时两秒,延时完之后再让他熄灭,再给他一个低电瓶就可以了。所以就是先是一个低级头 rat, 那么这个 led 引角一个嗨 延时 delete, 那两秒就是两千毫秒嘛。最后再来一个低级头 rat 的 led 漏 运行,我们来看一下会有一个什么结果,因为之前我们说过了,在咱们这个中断处理程序中呢,不能使用这个阻塞函数,就这个 d 类, ok, 现在烧录完成了,我们点击一下这个按键来看,哎,并没有任何变化,对不对?这就是为什么我们不能在这个中断执行函数中使用这个 dele 的一个原因。 所以呢,我们就继续使用一个中断的一个标志位,刚才我们使用了 flag, 那么这次继续使用 flag, 那就定义可以在外部中断中使用的变量, 那就 volatile 哦, flag 默认呢是一个 false, 那所以我们中档函数中执行的内容呢,就是一个 flag, 把这个 flag 的值改成处,把它改成处之后,我们就在主循环中呢执行我们的相应的操作,就比如先判断我们的标志符它的值呢?是不是处,如果是处的话,我们就可以写我们的内容啊,就比如 d g 头 ret led i 先给它高电瓶延时上两秒,两秒之后呢,我们就再给它写入一个低电瓶 led 漏。 执行完相关操作之后呢,我们还需要把咱们这个 flag 这个变量呢,给它重置一下,那就重置中断标志位,那就 flag 就等于一个 boss, 我们再来运行看一下啊。 ok, 收录完代码之后,我们来点击一下这个按键试一下,哎,我们看我只要一点击它之后,它就会亮上两秒对不对?但是如果我在它亮的期间呢,一直点击的话, 哎,看见没?就是他依然还是两秒之后自动熄灭,对不对?咱们来数一下哈,一二 一二,对不对?这是因为什么呢?这就是我们说的这个 delay, 它是一个阻塞函数,它会暂停代码的执行来达到延时一定时间的一个效果。 意思就是在 delei 执行的期间呢,阿顿总就无法执行其他的任务,包括处理中断。因此为了避免 中断积压和确保系统的实时性呢,应该尽量避免在中断处理函数中使用阻塞函数,就比如 dea 函数可以使用非阻塞的延迟方式,比如使用计时器了,或者是 micros 方法来实现延迟,这样可以保证中断处理函数的快速执行。