文章目录
- 前言
- 一、中断嵌套是什么?
- 二、两个同级别中断
-
- [2.1 中断运行关系](#2.1 中断运行关系)
- [2.2 测试程序](#2.2 测试程序)
- 三、两个不同级别中断实现中断嵌套
-
- [3.1 中断运行关系](#3.1 中断运行关系)
- [3.2 测试程序](#3.2 测试程序)
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
课程需要:
提示:以下是本篇文章正文内容,下面案例可供参考
一、中断嵌套是什么?
二、两个同级别中断
2.1 中断运行关系
主函数->中断0->主函数
主函数->中断1->主函数
主函数->中断0->中断1->主函数
主函数->中断1->中断0->主函数
2.2 测试程序
关键:
PX0=0; //外部中断0为低优先级
PX1=0; //外部中断1为低优先级
代码如下(示例):
c
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i) //延时函数Delay( )
{
unsigned int j;
for(;i > 0;i--)
for(j=0;j<125;j++)
{;} //空函数
}
void main( ) //主函数
{
uchar display[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//流水灯显示数据组
uchar a;
for(;;)
{
EA=1; //总中断允许
EX0=1; //允许外部中断0中断
EX1=1; //允许外部中断1中断
IT0=1; //选择外部中断0为跳沿触发方式
IT1=1; //选择外部中断1为跳沿触发方式
PX0=0; //外部中断0为低优先级
PX1=0; //外部中断1为高优先级
for(a=0;a<9;a++)
{
Delay(500); //延时
P1=display[a]; //流水灯显示数据送到P1口驱动LED显示
}
}
}
void int0_isr(void) interrupt 0 using 0 //外中断0中断函数
{
for(;;)
{
P1=0x0f; //低4位LED灭,高4位LED亮
Delay(400); //延时
P1=0xf0; //高4位LED灭,低4位LED亮
Delay(400); //延时
}
}
void int1_isr (void) interrupt 2 using 1 //外中断1中断函数
{
uchar m;
for(m=0;m<5;m++) //8位LED全亮全灭5次
{
P1=0; //8位LED全亮
Delay(500); //延时
P1=0xff; //8位LED全灭
Delay(500); //延时
}
}
中断 1无法打断中断0 同级
三、两个不同级别中断实现中断嵌套
3.1 中断运行关系
中断0 高级中断
中断1 低级中断
主函数->高级中断->主函数
主函数->低级中断->主函数
主函数->低级中断-->高级中断->主函数
主函数->高级中断->低级中断->主函数
嵌套:
主函数->低级中断(执行到一半)->高级中断->低级中断(执行下一半)->主函数
3.2 测试程序
关键:
PX0=0; //外部中断0为低优先级
PX1=1; //外部中断1为高优先级
代码如下(示例):
c
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i) //延时函数Delay( )
{
unsigned int j;
for(;i > 0;i--)
for(j=0;j<125;j++)
{;} //空函数
}
void main( ) //主函数
{
uchar display[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//流水灯显示数据组
uchar a;
for(;;)
{
EA=1; //总中断允许
EX0=1; //允许外部中断0中断
EX1=1; //允许外部中断1中断
IT0=1; //选择外部中断0为跳沿触发方式
IT1=1; //选择外部中断1为跳沿触发方式
PX0=0; //外部中断0为低优先级
PX1=1; //外部中断1为高优先级
for(a=0;a<9;a++)
{
Delay(500); //延时
P1=display[a]; //流水灯显示数据送到P1口驱动LED显示
}
}
}
void int0_isr(void) interrupt 0 using 0 //外中断0中断函数
{
for(;;)
{
P1=0x0f; //低4位LED灭,高4位LED亮
Delay(400); //延时
P1=0xf0; //高4位LED灭,低4位LED亮
Delay(400); //延时
}
}
void int1_isr (void) interrupt 2 using 1 //外中断1中断函数
{
uchar m;
for(m=0;m<5;m++) //8位LED全亮全灭5次
{
P1=0; //8位LED全亮
Delay(500); //延时
P1=0xff; //8位LED全灭
Delay(500); //延时
}
}
中断 1能打断中断0 不同级
总结
同级别不能中断嵌套,不同级别实现中断嵌套