51单片机无法触发外部中断问题

刚刚入坑51不久,编了个基于lcd1602的可调时间的数字时钟,尝试利用外部中断触发事件调整函数、利用内部终端计时。实际运行时,使用内部终端的计时功能可正常运行,但利用外部中断的调整时间无法实现。具体表现为:运行时,短按和长按键盘按键均无法触发外部中断,屏幕上数字没有变化,计时也还在继续。运行过键盘检测程序,键盘可以正常使用,也正确连接单片机。本人刚刚入坑51,一直没弄懂无法触发原因,故提问求改进方案。

单片机与键盘部分的电路图如下:

img

代码如下:

#include <STC12C5A60S2.h>
#include "LCD1602.h"

typedef unsigned char uchar;
typedef unsigned int uint;

uint second=0,minute=0,hour=0,count=0,keynum;

void Delay();
void time();
void counter();
void Set_minute();
void Set_hour();
 
void main()
{
        IT0=1;//外部中断0、1下降沿触发
    IT1=1;
    
    EX0=1;//打开外部中断0、1
    EX1=1;
    
    ET0=1;//打开内部终端0
    
    EA=1;//打开中断总开关
    
    PX0=1;//外部中断设置为高优先级
    PX1=1;
    
    PT0=0;//内部终端设置为低优先级
    
    TMOD=0x02;//计时器模式2
    TH0=0x56;//设定计时器初始值
    TL0=0x56;
    
    TR0=1;//启动计时器

    LCD_1602_Init();//lcd初始化
    
    while(1)
    {
        time();
    }
}
//延迟函数
void Delay(uint time)
{
    uint i,j;
    for(i=0;i<time;i++)
        for(j=0;j<930;j++)
            ;
}
//时间显示函数
void time()
{    
    Write_1602_String("Clock",0X80);
    Write_1602_Num(hour/10,0XC0);
    Write_1602_Num(hour%10,0XC1);
    Write_1602_String(":",0XC2);
    Write_1602_Num(minute/10,0XC3);
    Write_1602_Num(minute%10,0XC4);
    Write_1602_String(":",0XC5);
    Write_1602_Num(second/10,0XC6);
    Write_1602_Num(second%10,0XC7);
}
//计时函数
void counter()interrupt 1
{
    TH0=0x56;//计时器初始化
    TL0=0x56;
    count++;
    if(count==5000)
    {
        count=0;
        second++;
        if(second==60)
        {
            second=0;
            minute++;
            if(minute==60)
            {
                minute=0;
                hour++;
                if(hour==24)
                {        
                    hour=0;
                }
            }
        }
    }
}

//手动调整时间(分)
void Set_minute() interrupt 0
{    
    Delay(20);
    minute++;
    if(minute==60)
        minute=0;
    Delay(20);
}
//手动调整时间(小时)
void Set_hour() interrupt 2
{
    Delay(20);
    hour++;
    if(hour==24)
        hour=0;
    Delay(20);
}        

在中断里改变的全局变量建议定义的时候加上volatile
另外,这个是矩阵键盘,不能简单通过中断的方式读取按键

首先,建议您检查一下您的外部中断的硬件连接是否正确,并且外部中断的初始化代码是否正确。如果硬件连接和代码都正确,可以尝试以下一些常见的解决方案:

  1. 确认中断触发方式:外部中断可以选择触发方式,比如上升沿触发、下降沿触发、边沿触发等。您需要确保您的中断触发方式与按键的操作方式匹配。

  2. 确认按键电平是否正常:如果您的外部中断使用的是电平触发方式,那么您需要确保按键的电平与您的代码中定义的电平相匹配,比如高电平表示按下,低电平表示弹起。

  3. 确认按键的连接电路是否正常:您需要确保您的按键与单片机的连接电路正确。如果有多个按键,您可以尝试将它们一个一个连接进行测试,以确定是否存在硬件问题。

  4. 监视外部中断的相关寄存器:您可以尝试在代码中添加相应的调试信息,以监视外部中断相关寄存器的状态,比如中断标志位、中断优先级等。

  5. 学习外部中断的相关知识:如果以上方法都无法确定问题原因,建议您深入学习外部中断的相关知识,掌握其工作原理以及常见应用场景。同时,要注意编写结构清晰、易于维护的代码,以便于追踪问题并进行调试。

希望对您有所帮助,如果您还有疑问,请具体说明您的硬件和代码细节,我们将尽力帮助您解决问题。

main函数里定时器中断设置有问题,
EA=1;
ET0=1;
TMOD=0x01;
TH0=0x56;
TL0=0x56;
TR0=1;
只需要设置这些就可以了!

根据你的描述,可能有以下几个问题导致外部中断无法触发:

中断触发方式设置不正确:在使用外部中断时,需要设置中断触发方式,比如上升沿触发、下降沿触发、边沿触发等。如果中断触发方式设置不正确,可能会导致中断无法触发。你可以检查一下中断触发方式是否正确设置。

中断服务程序编写不正确:当中断被触发时,会跳转到中断服务程序中执行相应的代码。如果中断服务程序编写不正确,可能会导致中断无法正常处理。你可以检查一下中断服务程序是否编写正确。

按键连接不良:如果按键连接不良,可能会导致按键信号无法被正确检测到,从而无法触发中断。你可以检查一下按键是否连接良好。

按键消抖:按键在接触和分离的瞬间会产生反弹,导致单片机误认为按键被按下多次。为了避免这种情况,需要进行按键消抖处理。你可以在中断服务程序中加入按键消抖代码,或者使用硬件消抖电路。

中断优先级设置不正确:如果有多个中断同时触发,需要根据中断优先级来处理。如果中断优先级设置不正确,可能会导致中断无法正常处理。你可以检查一下中断优先级是否正确设置。

程序逻辑错误:最后,也可能是程序逻辑错误导致中断无法触发。你可以检查一下程序逻辑是否正确。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^