在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
暂无评论