单片机——中断

来源:互联网 发布:满城尽带黄金甲 知乎 编辑:程序博客网 时间:2024/05/22 21:01

     什么是中断?就是打断当前要做的事,转而去执行别的事情。比如说A正在电脑前写帖子,突然家人让A下楼拿点东西,于是A就收到了家人给A的一个中断(可以叫做外部中断),当A去拿东西时,突然想上厕所(内部中断,自己身体内部的),所以这又是一个中断,!我们把引起中断的事件叫做中断源(如家人给A的任务,以及A想上厕所的需要。。。外部引起的叫外部中断,内部引起的叫内部中断),产生中断后就要去处理它,这称为中断的响应

    由于想上厕所这个内部中断的优先级比家人喊A的外部中断还要高,要上厕所了,A总得先去解决吧,所以A就先去执行上厕所这个命令。当A上完厕所后,A会返回来帮家人拿东西(高优先级的中断处理完后返回执行优先级较低的中断),拿完东西了A再回到电脑前继续写帖子(全部中断处理完后继续接手中断前的工作)。这个就叫做中断的返回。那么在单片机里面,中断有什么用呢?

    当单片机正在执行程序的时候,突然某个按键按下了(产生外部中断),单片机就必须得去处理那个按键(中断的响应),看看是发生了什么事,按键处理完后继续回来执行程序(中断的返回)。

   同样,单片机正在执行程序的时候,内部的定时器溢出,或者检测到单片机的电压低于正常值等等(单片机内部产生的中断叫内部中断),单片机就得去处理这些事情,然后再返回来。

   在单片机里面,中断是有特殊的功能寄存器控制的,单片机里面一共有两个中断,一个是中断0,一个是中断1 ,和两个定时器T0,T1,定时器就是你打开它后,它会自动数数,当数到你给它限定的值时,它就会溢出,产生中断让CPU处理(就像一个桶,你打开水龙头后,水越来越多,当达到你需要的水位时,就会产生中断叫你去处理它)。这些我们先不深入了解他是什么东西,我们只需知道中断是用下面这几个关键词控制的就行了:

(1)IT0      声明外部中断0的类型,IT0=1是边沿触发,0是电平触发
              a.边沿触发就是当检测到外部电平发生变化,即由低变高,或者由高变低时,就会产生一个中断
              b.电平触发就是检测到高电平或者低电平时,产生中断
(2)IE0      外部边沿触发产生中断后,它的值会变1,当CPU响应后,会自动变为0
(3)IT1      和IT0一样的含义
(4)IE1      和IT0一样的含义
(5)EX0      外部中断0控制器,EX0=1是允许外部中断,0是禁止外部中断,也就是不理会外部中断
(6)ET0      这个是定时器中断控制器,ET1=1是允许定时器产生中断,0是禁止
(7)EX1,ET1的含义跟上面的都一样。
(8)EA       总中断控制器,1是允许有中断产生,0是禁止所有中断,就算天打雷劈也不理会

另外,还有一个中断优先级的控制器,就是控制是去帮家人拿东西的优先级高还是去上厕所的优先级高。
(1)PX0 外部中断0的优先级控制,假如内外都产生了中断,1就是优先处理外部中断,0就是优先处理内部中断
(2)PT0 定时器0优先级控制器,1就是优先相应定时器0
(3)PT1 定时器1优先级控制器,1就是优先相应定时器1
(4)另外还有串口的RI,TI,PS等

还有个概念,就是中断请求的撤销,也就是说,产生中断后,会产生一个中断请求,为1,当CPU处理完中断后,必须清除这个请求,不然CPU又会认为这个中断没有处理又跑去处理它
    对于两个定时器产生的中断,当CPU响应后,会自动清除TF0,TF1这两个定制器中断请求,处理完后就跳出来,回到原来的地方继续执行。
    对于外部中断INT0,INT1,如果中断类型是边沿触发,单片机会自动清除中断请求IE0,IE1,若是电平触发,如果有一个电平,使中断产生后,这个电平仍然还保持着,那么这个电平还会触发中断,这样CPU就在中断中出不来了。。。

举个例子吧:

用外部中断来控制一个LED的亮灭。对了,外部中断并不是单片机的每个引脚都能产生,标有INT0或INT1的才行,我们看看11F02E的引脚图

中断的引脚是INT0:P3^2和 INT1:P3^3,我们用边沿触发(由高电平变成低电平时,就会触发)的中断方式来控制LED, 当我们没按下按键的时候,由于上拉电阻的原因,P3^2是高电平,当我们按下按键后,P3^2的电平就会变低,这个从高变低的过程就会产生一个中断(边沿触发),CPU会第一时间来相应这个中断。

 #include <reg52.h> 
sbit led=P1^7;  //定义LED 
void zhongduan() interrupt 0 using 1       //声明中断处理函数,由于是外部中断,所以 interrupt X 里X的值是 0 

  led=!led;            //CPU响应中断后会跑来这里执行(让led的状态取反) 

void main()      //主函数,程序执行的起点 

  EA=1;              //允许CPU响应所有中断 
  IT0=1;             //设外部中断0的响应模式为边沿触发 
  EX0=1;             //允许中断0产生中断 
  while(1);         //CPU不断在这里死循环,中断产生后放下工作去响应中断,处理完后然后再返回来继续死循环 
}

按下按键,CPU会跑去中断处理函数执行,执行完中断处理后返回原处继续执行

关于中断还有其他一些的举例和讲解,可以参考:中断的讲解

                                                                  中断详解


0 0
原创粉丝点击