中断嵌套

问题描述:

STC89C52单片机的P1口高4位连接发光二极管,P1口低4位连接开关,P3口的P3.2连接按键开关K2,P3.3连接按键开关K1,接口电路如图5-4所示,请编程实现按键中断以及中断嵌套(外部中断1为高优先级,外部中断0为低优先级),按下按键K1产生外部中断1中断请求信号,中断响应后读取键值去驱动发光二极管点亮,按下按键K2产生外部中断0的中断请求信号,中断响应后驱动发光二极管循环点亮。请编写驱动程序。建议:编程时,为了更好观察二极管亮灭状态,加入适当的延时程序。调试运行时,先按按键K2,执行外部中断0的低级中断;再按按键K1,执行外部中断1的高级中断,观察中断嵌套。

相关电路图:
中断嵌套_第1张图片

效果:当按下K2键,发光二极管循环点亮,当按下K1键一次,发一次中断申请,读取P1口低四位键值去驱动相应的发光二极管的亮灭,K2触发低级中断,K1触发高级中断。

C语言代码:

#include 
#include 
sbit K1=P3^3;
sbit K2=P3^2;
void delay(int time)
{
    int i;
    while(--time!=0)
    {
        for(i=0;i<125;i++);
    }
}
//外部中断0
void exint() interrupt 0
{
    unsigned char p1_value;
    unsigned int i ,j;
    //循环的嵌套,实现循环点亮二极管
    for(i=0;i<255;i++)
    {
        p1_value=0X08;
        for(j=0;j<4;j++)
        {
            p1_value=p1_value<<1;
            P1=p1_value;
            delay(1000);
        }
    }
}
//外部中断1
void exint1() interrupt 2
{
    unsigned char  p1_value=0;
    P1=0XFF;                
    p1_value=P1&0X0F;           
    p1_value=p1_value<<4;       //读取低四位的键值
    P1=p1_value;
    delay(800);
}
void main()
{
    //应题目要求设置中断的开关和优先级
    SP=0X50;
    EA=1;
    EX1=1;
    EX0=1;
    IT1=1;
    IT0=1;
    PX0=0;
    PX1=1;
    while(1)
    {
        ;
    }
}

最终仿真效果图:
中断嵌套_第2张图片
中断嵌套_第3张图片
中断嵌套_第4张图片

你可能感兴趣的:(单片机)