缘缘学单片—经验手记——10、中断,断不了,理还乱(外部中断)

  • 缘缘
  • LV3工程师
  • |      2013-07-23 12:12:47
  • 浏览量 17045
  • 回复:238

       在这一节中,缘缘给大家说说单片机一个有趣的事,那就是中断了

从这张图中我们看到,中断源接在了P3口上,那么,什么是中断,中断又是如何工作的,原理是什么呢?请亲们放下心,不要紧张,一起跟缘缘来看看这些有趣的问题吧,缘缘为了很好地说明这个抽像难懂的概念,用拉肚子来说明这个事情,相信你看了会笑破肚皮,那么请亲们在看这个之前先深呼吸,闭目、养神,是不是感觉好一些了呢,那就回贴吧,回完贴你可以大声的笑了,为了防止你一看就笑,所以缘缘极端可耻地设置成了回复可见,亲们还要见谅哦

       我们先来了解一下,什么是中断,打个比方,缘缘在这里给大家编写帖子,结果突然间缘缘肚子痛得不行了,必须得上厕所去,上完回来后继续编写帖子,那么在这里,编写帖子是一个常规事件,肚子痛就是一个信号,上厕所就是另一个事件了。

      这里,假设编写帖子是一个执行的程序,那么肚子痛就是一个中断源了,上厕所就是一个中断程序了,看了这个是不是明白很多了呢,其实中断就是在当前的任务中插入或是进行其它任务,完了又返回当前状态的过程,对于中断的名词解释,缘缘就不说了,大家可以去看看相关的资料。

       所以我们每个人的生活都是在无数的中断中渡过的,这样,我们的生活才会足够多彩,假设,人这一生只会有睡觉这一件事事,不中断,那么会怎么样呢? 呵呵,效果可想而知,那么中断多了也好吗?缘缘有天写帖子时闹肚子,就厕所中断事件进行了N次,结果,缘缘又进入了另一个中断中,就是打吊针,完了回来,发现自己很虚弱,又进行了另一个中断事件,熬米粥,喝完了才觉得好一些,于是继续写帖子。

通过上面的过程我们发现一些特点:

       1、所有的中断都是有原因的,我们把这个称为中断源,即由某种情况或是条件引起中断,如上面,肚子痛就是中断的原因,如果没有这条原因的话,就不会有中断,有人可能会说,我不肚子痛也会上厕所,那么你上厕所的原因是什么呢,你会说,尿胀,那么,尿胀就是中断源了。

       2、有中断源后就会立即执行中断响应,即执行中断的事件,当事件执行完成后,会返回到原先的任务中,在程序执行中断时,在原程序处理中断时,会有标示,当处理完了也会有标记。比如上面说缘缘在写帖子时发生了上厕所的中断事件,缘缘上完厕所后就马上回来了,缘缘不可能一直会处在中断事件中——上厕所,谁愿意在那里面一直呆着啊。当中断事件完成后,中断就算是关闭了,所以一个中断的开始与结束是有标志的,上面的过程中缘缘写帖子的过程是常规事件,是手离开键盘是上厕所中断的开始,那么来了,再次接触键盘,这就是中断的结束了。

       3、中断不是唯一的,也就是说在中断中可以有多个中断进行,只不过多个中断进行的时候,时间上肯定会有延迟,上面中,缘缘因为肚子痛上厕所了,在上厕所的过程中,恰好有人打了一个重要的电话,这时缘缘还得接电话,不管怎么样,电话接不完是不能离开厕所的,这样只有电话接完了才会离开厕所,继续编写帖子,但这个时间却比单纯的上厕所的时间要长得多,在这里,我们就会发现接电话就是另一个中断事件了,而这个事件却是在上厕所的中断中产生的,这种情况称为中断嵌套。

      4、所有的中断是一个事件相应,不是一起运行的,有优先级的,就是那个比较急,那个放在最前面,比如要上厕所时恰好来了一个电话,那么是先接电话呢还是先上厕所呢,对于缘缘,如果是闹肚子,不能忍受的情况下,那先得上厕所了,这个就是一个在当时来说非常急的中断事件了,如果在放后面点,那后果就不堪设想了,这里,上厕所就变成了第一级别了,接电话是第二级别,如果这时,电话是国家某个检查组打来的,上厕所还能忍受一会,这时,接电话就变成了第一选择了,级别也就成第一级别了。

       5、在中断事件中,有些是外部引起的,有些是内部引起的,我们把外部引起的称为外部中断,内部引起的称为内部中断,在上述情况中,肚子痛引起的上厕所中断称为内部中断,因为这是我们本身就决定是不是要进行上厕所的中断响应,而接电话就是外部中断了,电话的产生是因为其他人拨打给你的,不是你自己的原因造成的,但是,当有人给你打电话了,你还得执行接电话的中断过程,这就是典型的外部中断。

明白了这点,我们来看看我们的单片机中的中断是怎么回事:

在我们的单片机中,只有P3口具备与中断相关的第二节能,大体情况如下图

 

      我们看到,这些图感觉真的很乱,不明白是怎么回事,那么我们继续来看看,它们是干什么的:

相信看到这里还是不太明白,这些东西到底是怎么一回事,那么缘缘让你再看看一张图吧:

看了这个是不是大概有个影响了呢,我们再看看它们的关系:

            看了这些,是不是很迷糊呢,呵呵,不迷糊才怪呢,这里缘缘就给你们一一说明这些乱七八糟的东西,看看它们是怎么工作的,亲们,一定好记好哦:

      1、从第一张图上我们看到,我们的P3口有6个管脚是关于中断的,两个是外部中断接口,两个是内部中断接口,两个是串行口的接口:

      这里我们要知道一个情况,那么就是所有的这些管脚都是有特殊功能的寄存器控制的,那些寄存器的功能是干什么的,缘缘常把它们看成是一组开关,用来管理这些接口的工作状态的。我们看到外部与内部中断占用了一个寄存器TCON,而串行口占用了一个寄存器SCON,我们看到它的说明是中断标志,我们在前面说过,中断标志就是中断开始的标志了,这里我们把它与中断源归为一类,也就是有中断源时,会产生中断,当进行中断时,肯定会从标志处进行中断事件的。

       2、从所有的图中我们看到这样一种情况,就是外部中断是两个,内部中断也是两个,串行中断是一个,其实外部中断的两个的工作原理是一样的,两个内部中断工作原理也是一样的,口行口的工作原理是另一回事,这样,我们要了解的中断只有三种,外部、内部、串行口,那么我们把它们的工作分开说是不是就很明了,我们在后面对它们分别说明吧:

3、在第一张图中,有个IE,中断充许位,我们再来看看IE是干什么的,在了解这个之前,缘缘先来给亲们讲个故事吧

       记得那是很久很久以前,那是一个风急夜黑的夜晚,没有月亮,也没有太阳,更没有星星,黑得不见五指……

       刚才缘缘说了什么——废话!下面,故事才真正开始:

      在一个安宁的夜晚,11点了,你瞌睡得不行了,就睡下了,这时你的一个好朋友要来了,有重要的事情找你在楼下按动了门铃,然后你起床了,打开了灯,开了门,然后在一起聊天,这时,客人说有点渴了,所以你又用电水炉炖了一炉水,然后接着聊天,聊了一会,客人把事说完了就走了,完了你把门关了,把灯关了,然后再回上床上睡觉。

在这里,你的睡觉是一个正常的事情,而这中间却有许多的中断事件产生,我们可以看到,在这一系列事件中,有种条件会惯穿始终,那就是电,为了更明确点,我们看看下图:

 

       在这里,我们看到,不管怎么样,我们得让总开关开启,这样,后面的开关才会产生作用,如果总开关开启了,那么下面四个一组的开关就会控制每一条线路的动作,假设门铃的一个开关关了,那么你在睡觉时,有人按门铃你也听不到,这样就进不了你起来开门的中断事件了,而门铃是在房子外面的,我们就称为外部中断,如果我们按照第二张图的说明,把它们都连到一起会是怎么样的情况呢:

      通过这张图(因为串中比较特殊些,所以没有画),我们更明确地知道这些寄存器是怎么回事了,原来它们就跟开关一样,来控制中断的产生与执行的,其实它们就是三个类别,我们把它们分开来一个个地去说:

那么这些中断在程序中是怎么产生的呢,在程序中怎样去执行的呢,缘缘跟你们一一去了解吧,我们就先看看外部中断吧,串行口中断和内部中断我们放到后面再讲:

我们了知道了外部中断有两个,缘缘上面说过,说它们的工作方法是一样的,那么我们就先操作一个,把一个学会了,那我们就把与外部中断有关的这些开关先归纳到一起,我们就以外部中断0,也称INT0(P3.2)来说说吧:

首先,我们要让INT0工作,先得打开总开关,就是EA,那么就是EA=1有效,打开了这个,我们就得打开分开关,我们通过前面的图得知,控制INT0的分开关是EX0,这里当然是打开了,那么EX0=1有效,完了我们还可以看到,控制INT0的工作方式是IT0,工作方式中,设置为0即为电平触发有效,即当接触到低电平0时,它就会产生中断,设置成1时,为负跳变有效,什么时负跳变呢,就是它原来设置的是高电平,当检测到电平从高瞬间变低,就产生中断,在产生中断后,电平还是高的,等待下次中断产生。

这样,我们通过上面的分析,得知了外部中断0在应用时总共就这么几个开关,是其它的对这个中断是没有用的,所以我们只要管好这几个有关的开关就行了:

 

     这里,我们看到,我们就控制了这么三个开关,就完成了对外部中断0的操作,是不是很简单呢,其实,把这一大堆的开关分开,一个个地去分析就会很简单的,至于优先级的意思是如果这个程序中包含多个中断,应该先执行那一个,而为了区分,所以在中断函数中用了数字代替它们了,但不管程序中是一个还是多个,中断的代号是定死的,如果程序中只有一个中断,不写代号中断也是无法进行的。

下面缘缘就写一个关于外部中断的程序吧,亲们可要记下了,中断函数是单独的函数,要写在主函数外面,中断函数是不用声明的:

我们先做一个流水灯的程序,然后在流水灯的程序中加入中断就行了

 

 看看是不是很简单,其实我们明白了它的控制方式,是很容易理解的,完了我们烧进去发现,当P3.2口接触到低电平时,缘缘用P2.0接的继电器就会吸合,但吸合了不会停止,这时我们在主程序中加入关闭的处理即可:

      看了以上的介绍,中断是不是很简单的,你只要找到它们对应的开关控制,然后管理这些开关就行了,在程序中是,要那个中断,就把中断的序号写上就行了,刚才用到的是外部中断0,外部中断1也一样的,亲们可以把那个程序改改,改成外部中断1来玩玩,只要把开关找对就行了,对于外部中断的内容,就算是说完了,具体的应用在以后的其它程序中都会用到,这里先明白它是怎么回事就行了,当以后用到时,就会慢慢明白的,为了让大家更方便地提问解答,缘缘建议加入 本论坛的群222951503,那里有缘缘和群中的高手们联合为你排忧解难。

通过这一节,我们明白了中断与外部中断是怎么回事,下节,我们就看看内部中断中的定时器/计数器是怎么回事了。

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:222
3a9cb9983c5d1de 2018-12-19
了解一下,这段有些模糊
0   回复
举报
发布
ligaojie 2017-07-11
说的虽然很有道理 但貌似和我无关的样子
0   回复
举报
发布
ligaojie 2017-07-11
这个虽然粗鲁 但
0   回复
举报
发布
cds 2017-07-07
回复看看,好像回复也看不到哟!
0   回复
举报
发布
橙橙橙橙橙橙 2017-06-29
学习了 谢谢楼主 很有用
0   回复
举报
发布
纵横捭阖00 2017-06-25
确实不错,分数送上
0   回复
举报
发布
kawenlong 2017-06-05
看看吧,
0   回复
举报
发布
rtmain 2017-04-17
怎么看呢?
0   回复
举报
发布
sheng88888 2017-04-13
讲的不错哦,看了你的文档 我学到了很多
0   回复
举报
发布
hsiang 2017-03-20
真的不错啊
0   回复
举报
发布
查看更多
x
收藏成功!点击 我的收藏 查看收藏的全部帖子