在本文中,我将向您介绍中断的概念、中断的工作方式、矢量地址、中断优先级以及如何编写中断服务例程。

“中断”在英语中的意思是偏离常规。我们知道处理器总是忙于执行某种指令。如果出现紧急情况,需要将处理器从当前活动中暂停一段时间,并让它执行/做其他事情,该怎么办?我们还需要在执行我们的“紧急状况”.为了满足这样的需求,8051单片机得到了一个叫做“中断”.中断通常是来自外部世界的信号或来自内部程序的命令(称为软件中断),它迫使处理器暂停当前活动,然后跳转到另一个位置来执行另一组预定义的活动。在这样做的同时,处理器将保存它当前的状态和位置到一个临时存储区域(以便在中断结束后恢复当前的活动)。在接收到中断信号后跳到另一个位置的过程称为“服务中断”

中断源

在8051微控制器中有2个外部中断,2个定时器中断和1个串行中断。外部中断是-外部中断0(INT0)和外部中断1 (INT1)。定时器中断是定时器0中断和定时器1中断。给出一个串行中断与微控制器(发送和接收)进行串行通信。

当被调用时,所有这四个中断都服务于或执行一组特定的预定义活动,称为“中断服务例程”.它的运作方式和“子程序”我们一边写一边开发一个完整的程序。在8051的情况下,每个中断的中断服务程序(ISR)必须从程序存储器中相应的地址开始。ISR的起始地址称为中断的矢量地址。

中断源

向量地址

中断优先级

外部中断0 -INT0

0003 h

1

定时器0中断

000年波黑

2

外部中断1 -INT1

0013 h

3.

定时器1中断

001年波黑

4

串行中断

0023 h

5

中断优先级

8051的所有5个中断都有不同的优先级。中断是根据它的优先级顺序来服务的。从上表中可以看出,INT0的优先级最高,为1,Timer 0的优先级次之,为2。优先级的顺序是这样的——考虑一个同时引发两个中断的情况——一个来自INT0,另一个来自Timer 1中断。现在先上哪一个?在这种情况下,处理器将根据中断的优先级为其服务。在我们的例子中,INT0优先级高(优先级顺序1),Timer 1中断优先级低(优先级顺序4),所以处理器会先执行INTO的ISR,在完成INT0的ISR后,处理器会开始执行Timer 1中断的ISR。

从上图中可以看出,INTO是P3.2的一个替代函数,INT1是P3.3的一个替代函数。在这些引脚处接收到的信号将相应地引起中断。但并不是所有的信号都能引起中断!在引脚处接收到的信号应该是低电平信号,或者应该是引起相应中断的下降沿信号。然而,为了在引脚上接收到信号后提供中断服务,编写8051程序的人应该对几个比特3 SFR进行预处理,即TCON、IE和IP。让我们看看他们。

TCON

TCON是一个有点可寻址的SFR。在8位中,只有较低的4位与外部中断有关。上4位处理来自计时器的中断。下面四位是TCON.0 (IT0)、TCON.1 (IE0)、TCON.2 (IT1)和TCON.3 (IE1)。为了更好地理解,你可以参考下面给出的图。在这4位中,位0和位1 -即- TCON.0和TCON.1与外部中断0 (INT0)有关,而位2和位3 - TCON.2和TCON.3与外部中断1 (INT1)有关。在处理外部中断时,只有TCON.0和TCON.2由程序员直接操作。位TCON.1 (IE0)和TCON.3 (IE1)由处理器本身操作。在INTO接收到的外部信号将设置位TCON.1(也称为IE0),并在它分支到位于0003H的相应ISR之后由处理器本身清除。类似地,当在INT1接收到中断信号时,TCON.3被设置,并在分支之后被处理器清除。 The other 2 bits TCON.0 and TCON.2 are used for selecting “type of signal” received.

TCON.0(或IT0)设置为0 -如果INT0的中断是由低电平信号引起的。如果TCON.0设置为高,则INT0处的中断将由下降沿信号(高到低过渡)引起。TCON.1的情况也一样,如果设置为0,那么低电平信号将在INT1处引发中断,如果设置为高电平,则下降沿信号将完成该工作。

IE(中断启用)

8051年中断

IE中有3位与外部中断相关联-它们是位0,2和7。这个SFR的主要目的是根据是否设置了相应的位来启用/禁用不同的中断。参考下图。

ie7 -被称为全局中断位-当设置为“0”时-在8051中禁用所有类型的中断。只有当该位被设置为' 1″,任何类型的中断将在8051中启用。如果该位设置为1,则程序员可以单独启用或禁用所有其他中断INT0, INT1,定时器中断(0和1)和串行中断。

IE.0 -如果设置为' 1 ' -它启用INT0,如果设置为' 0 ' - INT0将被禁用。因此,为了启用外部中断0 (INT0) - IE.7和IE.0应该设置为' 1 '。

IE.2 -类似于IE.0 - IE.1启用/禁用外部中断1 (INT1)。

中断优先级(IP)

该SFR的基本功能是设置中断优先级(IP)。默认情况下,INT0优先级为1(最高),INT1优先级为3(低于INT0)。如果程序员愿意,他可以改变这个优先级!如果IP.0设置为' 0 ',然后IP.2设置为' 0 ',则优先级顺序改变。与INT1相比,INT1的优先级将变为高优先级,而INT0的优先级将变为低优先级。

如何编写ISR(中断服务程序)

ISR就像我们在程序中编写的其他子例程一样,不同之处在于ISR必须总是以RETI指令和不带受潮湿腐烂指令(如子程序)。当调用ISR时,执行执行某种操作的特定代码行。它可以是程序员定义的任何东西。唯一的条件是ISR的第一行必须从对应的向量地址开始。INT0的向量地址为0003H, INT1的向量地址为0013H。

注意:在某些情况下,ISR太长了,不可能写所有从0003H或其他向量地址开始的代码。在这种情况下,ISR可以放在程序内存中的任何其他位置,程序员必须提供从相应的向量地址到ISR起始地址的无条件跳转。例子:-INT0的ISR已经从位置2000H写入。现在程序员必须在INT0 - 0003H的向量地址上放一条指令——' LJMP 2000H '。

注意:-每当一个引起的中断被确认并且处理器分支到它相应的向量地址时,它自动在IE寄存器中禁用中断。这个被禁用的中断只有在执行RETI指令放置在ISR中。这就是程序员必须在ISR中使用RETI而不是RET指令的唯一原因。放置RET也可以完成从中断例程返回到主程序(调用程序)的工作,但是RET指令不会在IE寄存器中重新启用被禁用的中断。因此,如果使用RET,中断将在第一次ISR服务后被永久禁用(除非程序员在同一程序的其他部分再次启用它)。

因此,为了为INT0编写ISR,你必须记住以下事情

1)将INT0的ISR从它的向量地址- 0003H开始。如果ISR太长,则从0003H无条件跳转到ISR的起始地址(该地址位于程序内存的其他位置)。ISR必须以RETI指令结束。

2)通过设置/清除TCON.0位选择中断触发信号类型。0=1 -表示中断将由下降沿信号触发。0 =0 -表示中断将由低电平信号触发。

3)设置IE.0 =1使能外部中断0 (INT0)

4)设置IE.7=1 -使能全局中断控制位。

5)程序员可以选择通过设置/清除IP.0来改变INT0的优先级(注意:此步骤是可选的)。

现在,当它涉及到外部中断1 - INT1 -进程都是相同的,除了要被编程的位的变化。

1)将ISR放在INT1 - 0013H的向量地址中。或者如果ISR很长,在INT1的ISR的相应起始地址上放置一个位于0013H的LJMP。

2)通过设置/清除TCON.2来选择触发信号类型。tcon 2 = 0 -由低电平信号触发。TCON.2 = 1 -由下降沿信号触发。

3)设置IE.2 = 1使能INT1

4)设置IE.7 =1使能全局中断控制位。

5)可以通过改变IP.2的值来改变中断优先级(可选)。参考上面给出的IP寄存器图。

如何在8051中生成软件中断?

软件中断只不过是由控制器内部的程序产生的中断。为了产生一个外部中断,我们需要在8051微控制器的INT0或INT1引脚上输入一个信号。我们已经看到,当中断信号在INTo引脚接收时,TCON.1位将自动被设置,这就是处理器如何知道中断信号已经在INT0引脚接收。当设置TCON.1时,处理器立即确认中断,并将中断转移到相应的INT0 ISR。当分支到ISR时,处理器也会清除TCON.1位。同样的情况也发生在INT1的情况下,关联的位是TCON.3。

为了产生一个软件中断,程序员可以在程序中手动操作这些位TCON.1和TCON.3。这样的指令“SETB TCON.1”将激活控制器内部的INT0中断(在INT0引脚没有任何外部信号)。现在处理器将确认中断并将其转移到ISR的相应位置(向量地址0003H)。在分支到ISR之后,处理器将清除位TCON.1。这样的指令“SETB TCON.3'将激活INT1的中断,处理器将分支到位于向量地址0013H的INT1 ISR。当分支时,它会自动清除位TCON.3,这样程序员就可以在循环或程序的其他部分中再次激活中断。

示例程序:

以前,我们已经开发了一个电路,用一个按钮开关切换两个LED -在8051。它是为教育目的而开发的。

1)学习如何将LED接口到8051

2)如何使用按键开关控制LED的输出状态

3)如何使用中断和为8051开发一个ISR。

你可以在这里看到电路和文章:-使用8051切换2个LED -学习外部中断的使用

注意:在上面例子的程序中,你可以学习如何为8051编写ISR。程序中使用INT0。还要注意——程序如何从INT0 - 0003H的向量地址分支到其他位置。

任何疑问/查询?在这里发表评论!

注意:-如果你对AVR感兴趣,那么这里有一篇好文章给你:-在AVR中处理外部中断

作者

10评论

  1. Venkiteswaran T.K.

    非常感谢你给我的学习材料。这仅仅是为了我的学习,而不是为了任何其他目的。

    忠实,T.K.Venkiteswaran。

  2. Pradeep

    很好,非常感谢

  3. 普拉卡什

    中断优先级
    Px0是清楚的,int0去较低的优先级,它正确地解释了u.but
    Px1只被设置为int1优先级更高。
    但是u的解释就像如果px1也是清楚的,那么int1就会优先解释。在图表中是正确的。所以哪一个是正确的,请给我解释一下
    ....

  4. 丹尼斯

    不错的帖子,但我的问题是,哪种编程语言最适合编写软件

    • 乔乔

      你可以使用汇编语言或嵌入式C语言。

  5. 乔乔

    @srihari和@rowan -谢谢你们的赞美

  6. 罗文·沃尔特斯

    谢谢,我买了一些薯片月底,然后我要开始我离开的地方
    罗文

  7. SrihariRao

    不错的职位。

Baidu