51启动代码中的关键字详解(无法逃避的宿命--中断)
51启动代码中的关键字详解(无法逃避的宿命--中断)sbit TF0 = 0x8D;sbit TR1 = 0x8E;看看这里,做些简单的解释吧/* TCON */ 8个寄存器位如下sbit TF1 = 0x8F;
通过前面几贴 应该已经大概了解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口
详见下面的管脚分配
看粗来了么?外部中断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闪烁
有图有真相
再来试试下降沿触发
#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);
}
上图
按键按住不放,给外部中断0口一直低电平,Led并没有闪烁,也就说明IT0=1时,就是下降沿触发了
了解更多51系列教程,请关注“云汉电子社区”官方微信公众号,还可以将疑问发给公众号平台,我们会及时答复!