一、寄存器
首先,我们需要了解寄存器。寄存器是特殊的RAM,特殊功能寄存器是控制单片机硬件的开关(例如IE)或者是指示单片机状态的信号(例如PSW),通过特殊寄存器你就可以方便的控制整个MCU,并且知道当前的MCU的工作状态。标准的51单片机中控制中断的寄存器有两个,一个是中断使能寄存器,一个是中断优先级寄存器。
1、中断使能寄存器IE:
EX0——EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。
ET0——ET0=1,允许T0中断;ET0=0,禁止T0中断。
EX1——EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。
ET1——ET1=1,允许T1中断;ET1=0,禁止T1中断。
ES——ES=1,允许串行口中断;ES=0,禁止串行口中断。
EA——EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求。
2、中断优先级寄存器IP
PS(串行口中断优先级控制位)——PS=1,串行口中断定义为高优先级中断。PS=0,串行口中断定义为低优先级中断。
PT1(定时器/计数器1中断优先级控制位)——
PT1=1,定时器/计数器1中断定义为高优先级中断。
PT1=0,定时器/计数器1中断定义为低优先级中断。
PX1(外部中断1中断优先级控制位)——PX1=1,外部中断1定义为高优先级中断。PX1=0,外部中断1定义为低优先级中断。
PT0(定时器/计数器0中断优先级控制位)——PT0=1,定时器/计数器0中断定义为高优先级中断。PT0=0,定时器/计数器0中断定义为低优先级中断。
PX0(外部中断0中断优先级控制位)——PX0=1,外部中断0定义为高优先级中断。PX0=0,外部中断0定义为低优先级中断。
中断优先级:外部中断0 > T0溢出中断 > 外部中断1 > T1溢出中断 > 串行口中断 > T2溢出中断
二、外部中断
L1一直闪烁,当按下S5时,L8亮。
寄存器配置:
IT0 = 1;//选择外部中断0为电平触发方式
EX0 = 1;//允许外部中断0
EA = 1; //总中断允许
方法一的代码(在L8亮或灭的状态下都可以控制L8):
#include <reg52.h>
sbit L1 = P0^0;
sbit L8 = P0^7;
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=(P2&0X0F)|0X80;
break;
case 5:
P2=(P2&0X0F)|0Xa0;
break;
case 6:
P2=(P2&0X0F)|0Xc0;
break;
case 7:
P2=(P2&0X0F)|0Xe0;
break;
}
}
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void working()
{
SelectHC573(4);
L1 = 0;
Delay(60000);
L1 = 1;
Delay(60000);
}
//=============================
void Init_INT0() //中断函数初始化(外部中断0)
{
IT0 = 1;//下降沿中断
EX0 = 1;//外部中断0
EA = 1; //总中断
}
void Service_INT0() interrupt 0 //中断服务函数
{
L8 = 0;
Delay(60000);
Delay(60000);
Delay(60000);
L8 = 1;
}
//================================
void InitSystem()
{
SelectHC573(5);
P0 = 0x00;
SelectHC573(4);
P0 = 0xff;
}
void main()
{
InitSystem();
Init_INT0();
while(1)
{
working();
}
}
方法二的代码(方法二并没有实现符合要求的中断,中断仅仅对L8状态赋值,然而while中依旧遵循在执行完working后,才会执行控制L8的相关函数,即必须在L1灭的状态之后才能控制L8):
#include <reg52.h>
sbit L1 = P0^0;
sbit L8 = P0^7;
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=(P2&0X0F)|0X80;
break;
case 5:
P2=(P2&0X0F)|0Xa0;
break;
case 6:
P2=(P2&0X0F)|0Xc0;
break;
case 7:
P2=(P2&0X0F)|0Xe0;
break;
}
}
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void working()
{
SelectHC573(4);
L1 = 0;
Delay(60000);
L1 = 1;
Delay(60000);
}
//=============================
void Init_INT0()
{
IT0 = 1;
EX0 = 1;
EA = 1;
}
unsigned char stat = 0;
void Service_INT0() interrupt 0
{
stat = 1;
}
void LEDINT()
{
if(stat == 1)
{
L8 = 0;
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8 = 1;
stat = 0;
}
}
//================================
void InitSystem()
{
SelectHC573(5);
P0 = 0x00;
SelectHC573(4);
P0 = 0xff;
}
void main()
{
InitSystem();
Init_INT0();
while(1)
{
working();
LEDINT();
}
}