MCS-51单片机外部中断详解

描述

CPU在执行的过程中,一般来说都是在执行主程序(main函数里面的代码)。如果希望处理其他的功能,可以通过查询的方式进行,判断是否需要处理或者通过中断的方式,进入中断服务函数程序里面执行。

前者是在主程序中判断条件是否成立,如果成立则执行其他功能,否则不执行;后者是CPU在执行过程中,判断是否有中断标志位,响应中断进入中断服务函数,执行相关功能。

MCS-51 单片机中,有两个外部中断(INT0与INT1),中断有两种方式低电平触发与负跳变(下降沿)触发。

下面通过讲INT0说明外部中断,INT1同理。

原理图:

P0连接8个LED,INT0引脚连接一个按钮连接到地。

寄存器

在中断系统中,INT0设计的寄存器中有IE、IP、TCON,在C51规定特殊寄存器的地址为8的倍数均可以位寻址。IE寄存器地址为:0xA8;IP寄存器地址为0xB8;TCON寄存器地址为0x88;因此它们可以被位寻址。

以下是它们的位定义。

/*  TCON  */
sbit TF1   = TCON^7;
sbit TR1   = TCON^6;
sbit TF0   = TCON^5;
sbit TR0   = TCON^4;
sbit IE1   = TCON^3;
sbit IT1   = TCON^2;
sbit IE0   = TCON^1;
sbit IT0   = TCON^0;


/*  IE  */
sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;


/*  IP  */
sbit PT2   = IP^5;
sbit PS    = IP^4;
sbit PT1   = IP^3;
sbit PX1   = IP^2;
sbit PT0   = IP^1;
sbit PX0   = IP^0;

如果需要使用外部中断,需要满足以下条件

1)中断中允许设置(置1)EA = 1;

2)中断源允许设置(置1)Ex0 = 1;

3)中断触发方式设置(置1或置0) IT0 =1 或者 IT0 = 0;

4)中断服务函数

寄存器

代码实现

#include "reg52.h"
#include "stdio.h"


void main(){
   IT0 = 1;
   EA = 1;
   EX0 = 1;
   while(1){};


}


void irq0(void) interrupt  0
{
    P0=~P0;
}

注:由于IT0 =1;设置中断触发方式为负跳变(下降沿),CPU相应中断后清除中断标志位。而由于IT0 =0;设置中断触发方式为低电平触发,CPU相应中断后不会清除中断标志位。

在上面的中断服务功能中表现,按一下LED灯亮,再按一次LED灯灭;

如果将IT0设置为0,则按下时LED会闪烁。因为中断标志位没有清除,不断进入中断服务函数。

如果需要设置外部中断1,负跳变触发。只需要改上面代码的三条语句即可。

IT0 = 1; ---- >  IT1 = 1;
 
  EX0 = 1;  ---- >  EX1 = 1;

   
void irq0(void) interrupt  0   -- >  修改终端号,将0 修改为2void irq0(void) interrupt  2    ---- >函数名irq0,可根据需要修改或不改
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分