定时器T0初始化放到 .c文件中出错,如何解决?

用KEIL_5写用定时器T0扫描独立按键的程序时发现一个匪夷所思的问题:
就是在将定时器T0的初始化代码放在 main()函数中结果就是对的,但是将定时器T0模块化以后将初始化程序放在time0.c文件中就会出错
程序很简单,以下是main()函数中的代码:
#include
#include
unsigned char code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
                                 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};

extern unsigned char keyNow[4];  //°´¼üµÄÏÖÔÚ״̬
extern unsigned char keyLast[4];  //°´¼üµÄ×îºóÒ»¸ö״̬ÖÃ1
                                 
void time0Init()//¶¨Ê±Æ÷1 ³õʼ»¯
{
    TMOD=0x01;
    TH0=0XF8;    //¶¨Ê±2ms
    TL0=0XCD;
    TR0=1;
    ET0=1;
    EA=1;
}

void main()
{    
    unsigned char i=0;
    unsigned char number=0;
    unsigned char keyNumber=0;
    
    time0Init();
    
    while(1)
    {
        keyNumber=key();
        for(i=0;i<4;i++)
        {
            if(keyNumber==i)
            {
                keyNumber=0;
                number+=i;
                P0=~DIG_CODE[number];
                if(number>=16)
                {
                    number=0;
                }
            }
        }
    }
}

void time0() interrupt 1
{    
    TH0=0XF8;                                                       
    TL0=0XCD;
    keyCheck();
    
}

以下是KEY.C文件中的代码:
#include
unsigned char keyNow[4]={1,1,1,1};  //°´¼üµÄÏÖÔÚ״̬
unsigned char keyLast[4]={1,1,1,1,};  //°´¼üµÄ×îºóÒ»¸ö״̬ÖÃ1****ÕâÁ½¸ö±äÁ¿±ØÐëÔÚmain()º¯ÊýÖÐÓà extrun ÉùÃ÷

unsigned char  key()
{
    unsigned char i,keyGet;
    for(i=0;i<4;i++)
    {
        if(keyNow[i]!=keyLast[i])  //µ±°´¼üµÄµ±Ç°×´Ì¬²»µÈÓÚ×îºóÒ»¸ö״̬¼´£ºÓа´¼ü°´ÏÂ
        {
            if(keyLast[i]==0)        //µ±°´¼üµÄµ±Ç°×´Ì¬ÊÇ1ʱ ¼´£º°´¼üÒѾ­Ì§Æðʱ ¼ÇΪһ´Î°´¼ü°´ÏÂ
            {
                keyGet=i;
            }
            keyLast[i]=keyNow[i];  //½«°´¼ü×îºóÒ»¸ö״̬¸üе±Ç°µÄ״̬
        }
    }
    return keyGet;

}
void keyCheck()
{
    static unsigned char keybuff[4]={0XFF,0XFF,0XFF,0XFF,};    //ÿ´ÎÖжϣ¨2ms£©¼ì²â°´¼ü״̬£¬
    unsigned char i;                                           
    keybuff[0]=(keybuff[0]<<1)|P1_0;        //½«×´Ì¬ÖµÑ­»·×óÒÆ8´ÎÓÚ°´¼üµÄ״̬ÏàÓ룬ÅжÏÊÇ·ñΪȫ0»òÕßÈ«1
    keybuff[1]=(keybuff[1]<<1)|P1_1;
    keybuff[2]=(keybuff[2]<<1)|P1_2;
    keybuff[3]=(keybuff[3]<<1)|P1_3;
    for(i=0;i<4;i++)
    {
        if(keybuff[i]==0XFF)
        {
            keyNow[i]=1;            //µ±ÓÐ8´Î¼ì²âµ½°´¼üΪȫ1ʱ£¬ËµÃ÷µ±Ç°°´¼ü̧Æð
        }
        else if(keybuff[i]==0X00)
        {
            keyNow[i]=0;            //µ±ÓÐ8´Î¼ì²âµ½°´¼üȫΪ0ʱ˵Ã÷µ±Ç°°´¼ü°´ÏÂ
        }
    }
}


以下是KEY.H文件中的代码:
#ifndef _KEY_H_
#define _KEY_H_

extern unsigned char keyNow[4];  //°´¼üµÄÏÖÔÚ״̬
extern unsigned char keyLast[4];  //°´¼üµÄ×îºóÒ»¸ö״̬ÖÃ1
unsigned char  key();
void keyCheck();

#endif


但是将其中的 time0Init()函数放在 TIME0.c文件运行结果就是出错
以下是 TIME0.c文件中的代码:
#include

void time0Init()//¶¨Ê±Æ÷0 ³õʼ»¯
{
    TMOD=0x01;
    TH0=0XF8;    //¶¨Ê±2ms
    TL0=0XCD;
    TR0=1;
    ET0=1;
    EA=1;
}
以下是TIME0.h 文件中的代码:
#ifndef _TIME0_H_
#define _TIME0_H_

void time0Init();//¶¨Ê±Æ÷1 ³õʼ»¯

#endif
虽然编译 0错误 0警告,但是运行的时候就是错的
还请各位帮忙看看是啥问题吗?

给你一个思路,打断点看看哪里运行不符合预期,是定时器不走呢还是io电平不变呢?
还有可以对比前后生成的汇编代码看看,如果就是函数定义的地方变了,理论是不会有问题的。

初始化代码中如果乱序写会有影响吗? 编译的时候不要用优化试试 就是 -O0 。估计和执行具体指令的顺序有点小变动

你在time.c文件有引用51的头文件吗?

这篇文章详细得介绍定时器T0初始化放到 .c文件中出错 得解决方法
https://blog.csdn.net/qq_42882607/article/details/126084741
希望对你有所帮助

你的主函数有引用TIME0.h这个头文件吗

参考一下

参考

AutoLeaders控制组——51单片机学习笔记(定时器、串口通信)_draw_future_TL的博客-CSDN博客 本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整。以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅)一些内容涉及前面的知识点,可能需要提前了解(可以翻看本人之前的文章或者去B站看UP主的视频) https://blog.csdn.net/draw_future_TL/article/details/127914528?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166878627616782428662751%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166878627616782428662751&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-127914528-null-null.nonecase&utm_term=%E5%AE%9A%E6%97%B6%E5%99%A8T0%E5%88%9D%E5%A7%8B%E5%8C%96%E6%94%BE%E5%88%B0%20.c%E6%96%87%E4%BB%B6%E4%B8%AD%E5%87%BA%E9%94%99%EF%BC%8C%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%EF%BC%9F&spm=1018.2226.3001.4450