89C51单片机中的中断系统

89C51单片机中的中断系统

对于在单片机中的学习,中断系统是一难点,如果中断系统没有理解透彻,51单片机的学习就算是失败的。
首先,举例说明下什么是中断。
eg.当你在家正在吃着爆米花,看着电视,突然门铃响了,这时你不得不停止吃爆米花看电视,起身去开门,这个过程就是中断。
中断概念
CPU在处理某一事件A时,发生了另一件事件B请求CPU马上去处理(中断发生)
CPU暂时中断当前工作,转去处理事件B(中断响应和中断服务)
等待CPU把事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回), 这整个一个过程 称为中断
中断系统的概念:
引起CPU中断的根源,叫中断源 。 是中断源向CPU提出的中断请求。 CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(被中断的地方叫 断点,“断点”不是一个实际存在的,只是一个人为提出的概念 ), 这一过程称为中断返回。实现以上中断功能的部件称为 中断系统。

89C51单片机中的中断系统_第1张图片
中断技术解决了 快速主机与慢速I/O设备之间的数据传送 问题
中断系统优点: 1. 分时操作 CPU可以分时为多个I/O设备服务,提高了计算机的利用率
2.实时响应 CPU能够及时处理应用系统的随机事件,系统的实时性增强
3.可靠性高 CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高
eg. 89C51/52 的中断系统有5个中断源,2个优先级,可以实现二级中断嵌套
中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制

EX0(IE.0):外部中断0允许控制位
EX1(IE.2):外部中断1允许控制位
ET0(IE.1):定时/计数器T0允许控制位
ET1(IE.3):定时/计数器T1允许控制位
ES(IE.4):串行口中断允许位
EA(IE.7):CPU中断允许位(总中断允许位)
中断请求标志 TCON
在这里插入图片描述
IT0(TCON.0):外部中断0触发方式控制位
当IT0=0,则是电平触发方式,分为低电平和高电平
当IT0=1,则是边沿触发方式,那么此时为下降沿有效控制
IT1(TCON.2):外部中断1触发方式控制位
IE0(TCON.1):外部中断0中断请求标志位
IE1(TCON.3):外部中断1中断请求标志位
TF0(TCON.5):定时器/计数器T0溢出中断请求标志位
TF1(TCON.7):定时器/计数器T1溢出中断请求标志位
TR0(TCON.4):串行口R0中断请求标志位
TR1(TCON.6):串行口R1中断请求标志位

当同一优先级中的中断申请不止一个的时候,就有中断优先权排队的问题,同一优先级的中断优先权排队,是由中断系统硬件确定的自然优先级形成
外部中断0(IE0) > 定时/计数器0(TF0) > 外部中断1(IE1) > 定时/计数器1(TF1) > 串行口(RI/TI)
中断源
89C51单片机中的中断系统_第2张图片
中断优先级三条原则:

  1. CPU同时接收到几个中断时,首先响应优先级别最高的中断请求

  2. 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断

  3. 正在进行的低优先级中断服务,能被高优先级中断请求所中断
    为实现2,3原则,中断系统内部设有两个用户不能寻址的优先级状态触发器 ,其中一个触发器置为 1 ,表示正在响应高优先级的中断, 它会阻断后来所有的中断请求;另外一个同样置为 1 ,表示正在响应低优先级中断,它会阻断后来所有的低优先级的中断请求

    中断响应的条件

  4. 中断源有中断请求

  5. 中断源的中断允许位是 1

  6. CPU开启中断(EA=1)
    只有3条同时满足时,CPU才有可能会响应中断
    对于如上的概念,需经常阅读和理解,对于程序员来说,并不需要熟知硬件中的各种电路图,对于程序员来使用中断,只需要记住:
    1 想使用的中断是哪个,选择相应的中断号;
    2 触发条件是什么,低电平触发 or 下降沿触发 ;
    3 中断之后做什么

下面是不同中断的代码
外部中断0:

#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit k3=P3^2;
sbit led=P2^0;

void delay(u16 i)
{
  while(i--);
}
void zhongduan()
{
   IT0=1;
   EX0=1;
   EA=1;
 }
void Int0() interrupt 0
{
   delay(1000);
   if(k3==0);
   {
      led=~led;
	  }
}
void main()
{
  zhongduan();
  while(1);
}

定时器中断0:

#include "reg51.h"
typedef   unsigned char u8;
typedef unsigned int u16;

sbit led=P2^0;

void time0()
{
  TMOD=0x01;
  TH0=0xfc;
  TL0=0x18;
  EA=1;
  TR0=1;
  ET0=1;
}
void time01() interrupt 1{
  static u16 i;
  TH0=0xfc;
  TL0=0x18;
  i++;
  if(i==1000){
   led=~led;
   i=0;
  }
}

void main()
{
  time0();
}

本人同样也是在学习过程中,如有问题,欢迎下方留言讨论

你可能感兴趣的:(单片机)