51单片机的问题,定时器不工作

请教各位,使用的普中89C52RC单片机,A2版本,但是定时器怎么配置都不工作,直接点LED灯是可以的 用是定时器0或1控制就没反应,我都怀疑是不是开发板有问题,请各位帮看一下代码。

#include 
#include 


void Timer0Init(void)        //1??@11.0592MHz
{
//    
//    TMOD |= 0X01;        
//    TL0 = 0x66;        
//    TH0 = 0xFC;        
//    TF0 = 1;        
//    TR0 = 1;        
    
    TMOD |= 0x01;        //设置定时器模?
    TH0 = 0xFC;        //设置定时初值
    TL0 = 0x66;        //设置定时初值
//TF0 = 0;        //清楚TF0标 志
    TR0 = 1;        //定时器0开始计
  ET0=1;
    EA=1;
//   PT0=0;
//     IPH=0x00;

}    

void main() 
{
        void Timer0Init(void);
    
//    P2_1=0;

      while(1) {
  
//            P2_1=0;
    }
  
    }    

void Timer0_Rrountine() interrupt 1
 
{   unsigned int t=0;
    TH0= 0xFC;        //??????
    TL0 = 0x66;        //??????
    t++;
    if(t==1000)
       t=0;
     P2_2=0;
        P2_4 = !P2_4;
}


“Devil组”引证GPT后的撰写:
这段代码使用了定时器0中断来控制P2_4口的电平状态,但是在描述中提到无论使用定时器0还是定时器1都无法工作。因此,我建议按照以下步骤进行排查:

确认开发板是否有问题。可以使用一个已知工作正常的程序进行测试,例如点亮LED灯等。
确认使用的定时器是否可用。查看单片机的数据手册,确定定时器0和定时器1的相关寄存器及其设置方法。
确认定时器是否已经正确初始化。在这段代码中,可以先注释掉定时器中断服务函数(Timer0_Routine()函数),只测试定时器是否能够正常计时,并使用P2_4口的电平状态来确认定时器是否在工作。
确认定时器中断服务函数是否正确。在定时器中断服务函数中,需要清除定时器0的中断标志(TF0)以允许下一次中断发生,并且在定时器中断服务函数中执行的代码需要尽量简短,以避免中断时间过长导致系统稳定性问题。

修改后的代码示例:

#include <REGX52.H>
#include <INTRINS.H>

void Timer0Init(void)
{
TMOD |= 0x01; //设置定时器0为模式1,16位计数器
TH0 = 0xFC; //设置定时初值,定时1ms
TL0 = 0x66; //设置定时初值
TR0 = 1; //定时器0开始计数
ET0 = 1; //使能定时器0中断
EA = 1; //允许中断
}

void main()
{
Timer0Init(); //初始化定时器0
while (1)
{
//主程序循环,这里可以添加其他代码
}
}

void Timer0_Routine() interrupt 1
{
static unsigned int t = 0;
TH0 = 0xFC; //重置计时器初值,定时1ms
TL0 = 0x66;
TF0 = 0; //清除定时器0中断标志
t++; //计数器加1
if (t == 1000)
{
t = 0;
P2_4 = !P2_4; //每1秒钟改变P2_4口的电平状态
}
}

定时器0设置为16位定时器,使用模式1,定时1ms。在定时器中断服务函数中,首先重置定时器初值,然后清除定时器中断标志,并使用计数器t记录定时器中断的次数,以达到每秒改变P2_4口电平状态的目的。

中断里的计数变量t,每次进入都会被重新初始化为0,所以达不到计数的效果,你可以把它定义为static的,或者全局的(从编程规范来说,当然static的局部变量更好)
另外,计数条件满足后的那几个操作 ,应该在同一个大括号里,否则只有t=0会被if执行,而其他几句每次中断都会被执行。