红外遥控 外部中断0 两次下降沿的时间间隔 远远低于NEC的时序。晶振位11.0592

问题遇到的现象和发生背景

51 单片机红外遥控 计算NEC时序采用 外部中断下降沿触发的方式。两次下降沿的时间不满足NEC的时序要求。定时器 和外部中断的寄存器配置都没什么问题。

问题相关代码,请勿粘贴截图
#include 
#include "Timer0.h"
#include "INT0.h"
#include "LCD1602.h"
unsigned int IR_Time=0;
unsigned char IR_State=0;

unsigned char IR_Data[4];
unsigned char IR_pData;
unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;
unsigned char IR_Address;
unsigned char IR_Command;

void IR_Init(void)
{
    LCD_Init();
    Timer0_Init();
    INT0_Init();
}

void Int0_Routine(void)  interrupt 0
{
    if(IR_State==0)
    {
        Timer0_SetCounter(0);
        Timer0_Run(1);
        IR_State=1;
    }
    else if(IR_State==1)
    {
        IR_Time=Timer0_GetCounter();
        LCD_ShowNum(1,1,IR_Time,6);
        Timer0_SetCounter(0);
        if(IR_Time>13500-800 && IR_Time<13500-800)
        {
            P2=0;
            IR_State=2;
        }
        else if(IR_Time>11250-800 && IR_Time<11250-800)
        {
            IR_RepeatFlag=1;
            Timer0_Run(0);
            IR_State=0;
        }
        else
        {
            IR_State=0;
        }
        
    }
}


#include 

void INT0_Init(void)
{
    IT0=1;
    IE0=0;
    EX0=1;
    EA=1;
    PX0=1;
}

/*外部中断0中断函数模板
void Int0_Routine(void) interrupt 0
{
     
}
*/

#include 

void Timer0_Init(void)        //1毫秒@11.0592MHz
{
    
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;        //设置定时器模式
    TL0 = 0;            //设置定时初值
    TH0 = 0;            //设置定时初值
    TF0 = 0;            //清除TF0标志
    TR0 = 0;            //定时器0不计时
}

void Timer0_SetCounter(unsigned int Value)
{    
    TH0=Value/256;
    TL0=Value%256;
}

unsigned int Timer0_GetCounter(void)
{
    return (TH0<<8)|TL0;
}

void Timer0_Run(unsigned char Flag)
{
    TR0=Flag;
}


运行结果及报错内容

img

使用外部高速时钟32.768Khz,一定要保证时序准确。