如何使用51单片机实现两个以上外部中断

     在STC89C51单片机中,外部中断的个数是两个,通过外部中断引脚P3.2和P3.3实现。然而很多现实场景需要有两个以上的外部中断,这时候单片机自带的外部中断端口就不够用了。那么,该怎么解决这个问题呢?本文应用89C51单片机为例,介绍一种简单的通过外部中断0实现3个外部按键中断的方案。
  这里采用三个K1~K3按键分别控制通风电机、采光控制电机及水泵电机开关。当按下按键K1启动通风电机;按下按键K2启动采光电机,按下按键K3启动水泵电机。
     拓展中断设计思路:外部中断由P3.2或者P3.3引脚输入,通过IT0位来决定是低电平有效还是下降有效,一旦输入信号有效,即向CPU发出申请中断,并建立中断标志位。所以只要能让K1、K2、K3的按键变为低电平的时候能够触发触发P3.2或者P3.3引脚,中断就会发出请求。

     硬件实现电路如下图所示:这里按键K1、K2、K3三个按键状态通过一个逻辑与门接到P3.2引脚,这样只要有其中一个按键按下与门都会输出低电平,即P3.2引脚被接地,中断信号有效,则中断成功。

图片

按键软件处理:当K1、K2、K3的按键变为低电平的时候能够触发触发P3.2或者P3.3引脚,中断就会发出请求。但是具体是那个按键按下的这个就需要中断服务函数中,根据P1.5、P1.6、P1.7的高低电平状态来判断。当P1.5的为低电平时,表示按键K1按下;当P1.6的为低电平时,表示按键K2按下;当P1.7的为低电平时,表示按键K3按下。具体处理代码如下:

//-----------------------------------------------------------------
// INT0中断函数处理
//-----------------------------------------------------------------
void INT0_ISR() interrupt 0
{
   if(K1==0)
     {
        delay_ms(10);
          if(K1==0) if(LED_1==1)
         { F_IN1=1;F_IN2=1;LED_1=0;}else
         { F_IN1=1;F_IN2=0;LED_1=1;}
     }
     if(K2==0)
     {
        delay_ms(10);
          if(K2==0) if(LED_2==1)
         { F_IN3=1;F_IN4=1;LED_2=0;}else
         { F_IN3=1;F_IN4=0;LED_2=1;}
     }
     if(K3==0)
     {
        delay_ms(10);
          if(K3==0) if(LED_3==1)
         { RELAY=1;LED_3=0;}else
         { RELAY=0;LED_3=1;}
     }

}
按键功能实际仿真运行效果如下:

图片

版权声明:本文为CSDN博主「少年不懂编程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chanchairen/article/details/122330445

     在STC89C51单片机中,外部中断的个数是两个,通过外部中断引脚P3.2和P3.3实现。然而很多现实场景需要有两个以上的外部中断,这时候单片机自带的外部中断端口就不够用了。那么,该怎么解决这个问题呢?本文应用89C51单片机为例,介绍一种简单的通过外部中断0实现3个外部按键中断的方案。
  这里采用三个K1~K3按键分别控制通风电机、采光控制电机及水泵电机开关。当按下按键K1启动通风电机;按下按键K2启动采光电机,按下按键K3启动水泵电机。
     拓展中断设计思路:外部中断由P3.2或者P3.3引脚输入,通过IT0位来决定是低电平有效还是下降有效,一旦输入信号有效,即向CPU发出申请中断,并建立中断标志位。所以只要能让K1、K2、K3的按键变为低电平的时候能够触发触发P3.2或者P3.3引脚,中断就会发出请求。

     硬件实现电路如下图所示:这里按键K1、K2、K3三个按键状态通过一个逻辑与门接到P3.2引脚,这样只要有其中一个按键按下与门都会输出低电平,即P3.2引脚被接地,中断信号有效,则中断成功。

图片

按键软件处理:当K1、K2、K3的按键变为低电平的时候能够触发触发P3.2或者P3.3引脚,中断就会发出请求。但是具体是那个按键按下的这个就需要中断服务函数中,根据P1.5、P1.6、P1.7的高低电平状态来判断。当P1.5的为低电平时,表示按键K1按下;当P1.6的为低电平时,表示按键K2按下;当P1.7的为低电平时,表示按键K3按下。具体处理代码如下:

//-----------------------------------------------------------------
// INT0中断函数处理
//-----------------------------------------------------------------
void INT0_ISR() interrupt 0
{
   if(K1==0)
     {
        delay_ms(10);
          if(K1==0) if(LED_1==1)
         { F_IN1=1;F_IN2=1;LED_1=0;}else
         { F_IN1=1;F_IN2=0;LED_1=1;}
     }
     if(K2==0)
     {
        delay_ms(10);
          if(K2==0) if(LED_2==1)
         { F_IN3=1;F_IN4=1;LED_2=0;}else
         { F_IN3=1;F_IN4=0;LED_2=1;}
     }
     if(K3==0)
     {
        delay_ms(10);
          if(K3==0) if(LED_3==1)
         { RELAY=1;LED_3=0;}else
         { RELAY=0;LED_3=1;}
     }

}
按键功能实际仿真运行效果如下:

图片

版权声明:本文为CSDN博主「少年不懂编程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chanchairen/article/details/122330445

生成海报
点赞 0

少年不懂编程

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32 QSPI双闪存操作

STM32 QSPI双闪存操作 使用CubeMX或者CubeIDE生成框架 使用野火的开发板,MCU型号为stm32h750/743,他们家核心板上使用了QSPI挂了2片FLASH,型号为W25Q2