无法逃避的宿命--中断(51启动代码中的关键字详解)

通过前面几贴 应该已经大概了解51单片机是如何进行简单的使用 今天一起聊聊单片机系统里面非常重要的一个特性--中断。可以这么说,如果不能够熟练使用单片机的中断功能,基本上,也等同于不会使用单片机,So,咱还是先了解一下啥是中断。

所谓中断,其实就是单片机在执行一般代码时,被更加重要的事情所打断,暂时放下一般代码的执行,先处理这件重要的事情,举个栗子吧:看书事件

假设你正在图书馆自习看书,四周静悄悄,大家都在认真地看书,这个时候;,突然你的手提电话(你的铃声是“江南style”)大声地唱出来:我爸刚弄死它……正常的你反应应该是停止看书,看向你的手机,根据情况,决定做出挂机、调为静音还是赶紧拿起手机跑到门外接听等等。对手机铃声响起这件事情的处理,同时,如果没有外界干扰的话,你会记下桌面上的书看到第55页第7行。合上课本,进行对手机的操作。等到你完成对手机的处理,这个时候,你再回到桌面上,继续手机铃声响起前的工作,翻到书的第55页,从第7行接着看。当然,如果你两耳不闻窗外事,一心只读圣贤书,也可以把手机调成静音放进书包,完全不理会进来的电话。

选择Open document<reg51.h>即可

看看这里,做些简单的解释吧

/* TCON */ 8个寄存器位如下

sbit TF1 = 0x8F;

sbit TR1 = 0x8E;

sbit TF0 = 0x8D;

sbit TR0 = 0x8C;

sbit IE1 = 0x8B; 外部中断1请求标志

sbit IT1 = 0x8A; 外部中断1 触发方式选择位

sbit IE0 = 0x89; 外部中断0请求标志

sbit IT0 = 0x88; 外部中断0 触发方式选择位

/* IE */6个寄存器位如下,另外2个保留

sbit EA = 0xAF; 全局中断允许位

sbit ES = 0xAC;

sbit ET1 = 0xAB;

sbit EX1 = 0xAA; 外部中断1中断允许位 interrupt 2(外部中断1中断服务程序入口)

sbit ET0 = 0xA9;

sbit EX0 = 0xA8; 外部中断0中断允许位 interrupt 0(外部中断0中断服务程序入口)

/* IP */ 优先级配置寄存器

sbit PS = 0xBC;

sbit PT1 = 0xBB;

sbit PX1 = 0xBA; //外部中断1优先级控制位

sbit PT0 = 0xB9;

sbit PX0 = 0xB8; //外部中断0优先级控制位

上面有注释的便是51单片机外部中断相关的寄存器,如果我们只使用外部中断0(INT0)的话,需要处理的寄存器便只有EA、EX0和IT0了。和看书事件,特别要注意的是,51单片机外部中断,仅支持电平触发和下降沿触发,EX0这个寄存器位是用于决定是否响应INT0,EA则是决定是不是对中断进行响应。IT0这个寄存器位是用于选择触发方式,置0为低电平中断,置1为下降沿中断

注:INT0端口在P32口

详见下面的管脚分配

51启动代码中的关键字详解(无法逃避的宿命--中断)(1)


看粗来了么?外部中断INT0和INT1其实是从P3.2和P3.3管脚输入的 上面的非号表示低电平或者下降沿有效。

上代码

#include <reg51.h>

sbit Led1 = P1^1;

sbit Key = P0^1;

void delay_ms(unsigned int xms)

{

unsigned int i j;

for(i=xms;i>0;i--)

{

for(j=124;j>0;j--);

}

}

void main()

{

EA = 1; //允许响应中断

EX0 = 1; //允许响应外部中断0

IT0 = 0; //电平触发

Led1 = 1;关灯

while(1) {

}

}

void int0() interrupt 0 //INT0中断服务程序

{

Led1 = ~Led1; //Led端口取反

delay_ms(500);//延时0.5s

}

代码中,完成EA、EX0、IT0等寄存器的设置后,外部中断配置为低电平触发。直接进入while(1)的死循环,51没有任何其它操作,如果P32口有低电平出现,就会进入中断服务程序int0();特别提出,中断服务程序执行的代码、变量越少越好。执行时间越少越好,切记最好不要出现延时之类的函数,这里使用延时,只是为了演示这个中断确实由低电平引起。进入中断后,Led每0.5s闪烁

有图有真相

51启动代码中的关键字详解(无法逃避的宿命--中断)(2)

从图中可以发现:只有一直按住按键,led才会发生闪烁现象,验证确实是按键低电平才能进入中断服务函数。可能由童鞋会问,现场保护和现场恢复在哪?其实51在响应中断的时候,自己就已经完成了这些工作。但是由于51单片机压栈空间是比较有限的。所以才会建议中断服务程序要尽可能的精简,最好是设置一个标志位就退出中断。具体操作由单片机在主循环中完成,特别引起注意的是,51单片机的中断标志位自行清除。可以一直被触发该中断!相当一部分单片机需要手动软件清除,下一次才能进该中断。

再来试试下降沿触发

#include <reg51.h>

sbit Led1 = P1^1;

sbit Key = P0^1;

void delay_ms(unsigned int xms)

{

unsigned int i j;

for(i=xms;i>0;i--)

{

for(j=124;j>0;j--);

}

}

void main()

{

EA = 1; //中断允许

EX0 = 1; //开外部中断0

IT0 = 1; //下降沿触发

Led1 = 1;

while(1) {

}

}

void int0() interrupt 0

{

Led1 = ~Led1;

delay_ms(500);

}

上图

51启动代码中的关键字详解(无法逃避的宿命--中断)(3)

按键按住不放,给外部中断0口一直低电平,Led并没有闪烁,也就说明IT0=1时,就是下降沿触发了

了解更多51系列教程,请关注“云汉电子社区”官方微信公众号,还可以将疑问发给公众号平台,我们会及时答复!

〖特别声明〗:本文内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。如有侵犯您的原创版权或者图片、等版权权利请告知 wzz#tom.com,我们将尽快删除相关内容。

赞 ()
打赏 微信扫一扫 微信扫一扫

相关推荐