月落乌TI 2022-11-11 19:40 采纳率: 0%
浏览 54
已结题

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

用KEIL_5写用定时器T0扫描独立按键的程序时发现一个匪夷所思的问题:
就是在将定时器T0的初始化代码放在 main()函数中结果就是对的,但是将定时器T0模块化以后将初始化程序放在time0.c文件中就会出错
程序很简单,以下是main()函数中的代码:
#include<REGX52.H>
#include<KEY.H>
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<REGX52.H>
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<REGX52.H>

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警告,但是运行的时候就是错的
还请各位帮忙看看是啥问题吗?
  • 写回答

7条回答

  • 艾秋 2022-11-11 22:04
    关注
    获得2.56元问题酬金

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

    评论

报告相同问题?

问题事件

  • 系统已结题 11月19日
  • 赞助了问题酬金15元 11月11日
  • 赞助了问题酬金1元 11月11日
  • 创建了问题 11月11日