小灰的51单片机学习之让单片机停下来(6) 中断的理解以及外部中断使用

写在之前

学习到这里大家有没有发现一个问题,我们的单片机到目前为止程序运行都是顺序结构,就是第一句话运行完过后第二句话才能开始运行,小灰最近了解FPGA知道他能并行运算,就是同时能运行好几句话,确实觉得有点神奇。原来我们的电脑包括单片机这类控制器都是采用的是冯.诺依曼结构,别急我们这就来看看大神
在这里插入图片描述
冯.诺依曼作为一代大神精通数学计算机等领域,也有人称他为现代计算机之父,而在他的理论指导下的冯诺依曼结构最大的一个特点就是,指令是按顺序结构运行的,而指令则就是是我们写的程序。

中断是什么

为什么我们要提到顺序结构这个东西呢?正是因为程序是顺序结构运行的我们才会需要像中断这样的东西。打个简单的比方,要用单片机点亮一个LED灯,但是我正在点亮这个灯的时候突然按键按下了,想让你点亮另外一个灯这个时候该怎么办?可能大家还是没办法理解,我以前看过一篇文章上面有个例子,说是你正在电脑面前打着LOL和队友奋斗着,突然门口的门铃响了,你要去拿一个外卖,这个时候你就不得不停下手上的游戏,出去拿外卖,而中断就是这样一个东西。暂停目前正在执行的动作或者指令,转而去干另外一件事,这就是中断。

中断有什么用呢

中断有什么用是我在学习51单片机时的最大疑问,他到底能干啥呢?我们都知道单片机是一个程序从头到尾一句句的运行,那么当我干a的同时还想干b怎么办呢?其实在有些处理器上能实现,这种情况叫做多线程,就是好几件事情同时干,人脑就是一个很牛逼的处理器,我们能边吃东西边走路。但是我们现在的现在是我们手上的51单片机并不能同时处理很多个事情,那么中断就是折中的方案,在一个长时间的事情运行着,比如说走路去学校,突然我口袋里的钱掉了,我要停下来去捡钱,这样用中断就能实现。

中断寄存器

说到中断就绕不开中断寄存器,其实这应该是大家第一次接触寄存器这个词。而51单片机最最重要的也就是各种寄存器,那么寄存器是什么呢?(这部分内容了解即可,后面会逐渐加深理解)
在这里插入图片描述
其实大家不用知道什么是触发器什么是内部外部访问,大家只需要知道,寄存器是一种储存单元能储存一些信息,而中断的配置寄存器,比如说中断方式是外部中断还是定时器中断,是自动填充还是手动填充等等,都是需要我们配置寄存器的,那么如此说来其实配置寄存器就是好比一个东西有许多功能,我们是选择用哪些或者哪种功能。其实寄存器有太多的功能,我们这里粗略理解就足够了。大家在实际配置的时候记住就好了,当我们有能力去深究时自然会搞懂寄存器到底是什么。

来吧外部中断

对于一个c51单片机来说有5个中断源,分别是2个定时器中断,2个外部中断还有一个串口中断,而在今天我会给大家说外部中断,定时器中断则会放在下一节,串口中断也会在后面。
外部中断和其他中断有什么区别呢?外部中断是根据特殊引出的引脚的状态来判定是否进入中断以及配置寄存器来选择什么状态。
什么叫通过状态来判定是否进入中断呢,打个比方,stc89c51rc为例,引脚P3.2就是外部中断0(还有外部中断1,上面说过有2个外部中断)的引脚,那么我们就可以通过判断这个引脚的状态,如低电平检测,下降沿检测,两种方式。(上升沿就是从低电平变成高电平的过程,同理下降沿就是高电平变成低电平的过程)而这么多检测我们到底是检测哪个呢?这就需要我们配置TCON寄存器的几位,下面就是我们的TCON寄存器。
在这里插入图片描述
IT0为外部中断0触发方式控制位
当IT0 = 0时,为电平触发方式(低电平有效)
当IT0 = 1时,为边沿触发方式(下降沿有效)
同理IT1则会外部中断1触发方式控制位
当IT1 = 0时,为电平触发方式(低电平有效)
当IT1 = 1时,为边沿触发方式(下降沿有效)

于此同时还有一个中断允许寄存器IE
在这里插入图片描述
EX0(IE.0),外部中断0允许位;

ET0(IE.1),定时/计数器T0中断允许位;

EX1(IE.2),外部中断0允许位;

ET1(IE.3),定时/计数器T1中断允许位;

ES(IE.4),串行口中断允许位;

EA (IE.7), CPU中断允许(总允许)位。

上面这些是啥呀,不用担心,知道有这个玩意就可以了

show me the code

#include <reg52.h>
#define uint unsigned int	//宏定义
sbit LED = P2^0;	//2个lED灯的定义
sbit LED1 = P2^1;
void delay_ms(uint z)	//定义一个函数延时1毫秒
{
   int i, j;
   for(i = 0; i < z; i++)
   {
      for(j = 0; j < 122; j++)
      {
         ;
      }
   }
}
void main()	//主函数
{
   IT1 = 0;	//外部中断1模式设定为低电平有效
   EX1 = 1;	//允许进入外部中断1 ,可以看到上面有EX1也有写,其实这个就是允许我们进行外部中断
   EA = 1;	//开启总中断
   //其实打个比方EX1就是某个教室门,EA是学校大门,我只有进入了学校之后才能进入某个教室,EA是控制所有中断的总开关,有点像家里的总电闸
   LED1 = 0;
   while(1)
   {
      LED = 0;	//LED状态改变
      delay_ms(100);
      LED = 1;
      delay_ms(100);
   }
}
void init0 () interrupt 2	//中断服务函数
{
	LED1 = ~LED1;	//LED1状态改变
}

想必大家对这段代码有许多不理解的地方对吧我们一一说来
EX1 和EA到底是干嘛的呢?
其实打个比方EX1就是某个教室门,EA是学校大门。而让EX1等于1就相当于打开了这扇门,也就是进入中断的门,同理EA,就是控制进入学校大门,如果让他等于0就是不给进。而且我只有进入了学校之后才能进入某个教室,EA是控制所有中断的总开关,有点像家里的总电闸。

后面的中断服务函数是什么鬼?
中断服务函数,就是我整个程序进入中断之后到底要干什么事情,就比如说我在走路的时候有个事情要打断我,到底是什么事情呢?我需要写在这里面。init()0是这个中断服务函数的名字 这个可以任取,而后面的interrupt 是一定要有的 这是固定格式加上就好了,没什么特别的含义,无非就是给单片机说我这个函数不是普通的函数 是中断服务函数 。最后的数字2则代表着中断号,不同的中断有不同的中断号,需要的时候查一下就好了,具体的内容我会在下一章给大家详细讲解这里先这么记住就行。所以在外部中断1 的中断服务函数后面大家就按照我的格式去写就好了。

写在最后

小灰在第一次接触寄存器的时候是在那个图书馆,结果看寄存器看睡着了,寄存器这个概念在一开始确实不好理解,包括小灰现在也不能完全说出寄存器的全部,对于这种情况小灰是这么做的,比如说这个外部中断1我只需要是这么配置的,然后每次都按照这样配置,时间长了之后,小灰接触了更多的这方面的知识,就自然而然可以看懂这些文字了,随着自己配置的次数多了也慢慢明白了,这就是书读百遍其义自见,代码可能也是这样吧!当然你一开始要尝试去理解不能直接Ctrl c 然后Ctrl v 这样一点意义都没有,别人的代码我看懂了搞会了,就是我自己的代码,就是这样!
我是小灰,一个努力用平实的语言写出困难内容的探索者!^ _ ^!

发布了15 篇原创文章 · 获赞 35 · 访问量 3403

猜你喜欢

转载自blog.csdn.net/weixin_44065323/article/details/102509335