理论基础
EX0口导通为1
中断嵌套
外部中断0是所有中断里面优先级最高的->INT0
单片机优先级 P3.2-P3.7都是和中断有关的I/O口
INT0外部中断0>TO定时计数器0>INT1>T1
中断涉及的几个环节
①中断源 (前面提到的甲方)
②中断申请 (甲方发出信号提出申请)
③开放中断 (乙方同意传送)
④保护现场 (安排好当前的工作)
⑤中断服务 (响应乙方的要求)
⑥恢复现场 (完事后,回去……)
⑦中断返回 (继续做打断前的工作)
中断响应条件
1.中断源有中断请求;
2.此中断源的中断允许位为1;
3.CPU开中断(即EA=1)。
以上三条同时满足时,CPU才有可能响应中断。
一次中断过程的完整步骤
中断请求
中断使能->全局中断=0 外部中断=0、
中断响应
中断处理
中断返回
中断优先级的三条原则:
1.CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。
2.正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。
3.正在进行的低优先级中断服务,能被高优先级中断请求所中断。
EA :全局中断使能位(总允许位)。
=0:全局中断禁止;
=1:全局中断允许。
中断函数的书写
void functionName()interrupt n
{
...
}//interrupt表示成中断服务函数,n是中断号,中断号是编译器识别不同中断的唯一编号
中断函数与普通函数的区别
不需要声明
不能传参、
不能直接调用中断函数,它是由硬件触发的
实践部分
下降沿触发
独立按键部分默认先输入0X0F就是高电平,那么按下他就会实现高电平到低电平的下降沿从而触发中断
低电平触发
当按下独立按键的时候电平高转低,不松手的时候一直处于低电平,那么中断函数内的P2就会一直翻转,
而由于反转速度过快,人眼无法识别,所以呈现的是全亮状态。
外部中断
INT0
INT1
/*********************************************************************************
*实验名 :外部中断实验(低电平触发)
*实验效果 :按住学习板上第三排任意按键 LED灯8位全亮
松开按键后 随机上4个或下4个灯亮
*
*********************************************************************************/
#include<reg52.h>
//按下独立按键的时候电平高转低,不松手的时候一直处于低电平,那么中断函数内的P2就会一直翻转,
而由于反转速度过快,人眼无法识别,所以呈现的是全亮状态。
void main()
{
P1=0X0F;//0000 1111 前四个灯灭 后四个灯亮
P3=0X0F;//独立按键部分默认先输入0X0F就是高电平,那么按下他就会实现高电平到低电平的下降沿从而触发中断
EA=1;//全局中断打开
EX0=1;//INT0中断开启
IT0=0;//低电平触发
while(1)
{
;
}
}
void ISR_KEY()interrupt 0 //中断服务函数
{
P1=~P1;
}
/*********************************************************************************
*实验名 :外部中断实验(下降沿触发)
*实验效果 :按下学习板上第三排任意按键,LED灯前后四位状态调换
*
*********************************************************************************/
#include<reg52.h>
//按一次就跳变,也就是说开始前四个灯不亮后四个亮,按下之后就反过来
void main()
{
P1=0X0F;//0000 1111 前四个灯灭 后四个灯亮
P3=0X0F;
EA=1;//全局中断打开
EX0=1;//INT0中断允许
IT0=1;//触发方式为下降沿触发
while(1)
{
;
}
}
void ISR_KEY()interrupt 0
{
P1=~P1;
}
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断0允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU中断允许(总允许)位。