森狼藤野 2025-04-10 16:11 采纳率: 63.6%
浏览 21

51单片定时器中断函数读取不了全局变量


int num=0;
void T100()   //计时
{ 
    TMOD&=0xf;      //低4位不变,高4位清0      
    TMOD|=0x10;
    TH1 = 0xfc;
    TL1 = 0x17;            //设置定时初始值
    ET1 = 1;             // 开启T1中断
        EA = 1; 
    TF1=0;
    TR1=1;         //开始计时
  
}    

void Control()
{
    num=200;
}

void Tssss()    interrupt 3
{
    
    TL1 = 0x17;                //设置定时初始值
    TH1 = 0xfc;
    LCD_ShowNum(1,1,num,4);
 
}


void main()
{
T100();
while(1)
{
 control() ;
}

}

LCD1602上显示的是0,不是200,为什么

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-04-10 16:11
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    51单片机中的定时器中断函数中读取不了全局变量,这可能是由于中断函数的栈空间太小,无法存储全局变量的值导致的。

    在51单片机中,中断函数的栈空间是固定的,通常是256字节。这个栈空间用于存储中断函数的参数和局部变量。如果中断函数中使用了太多的局部变量或参数,可能会溢出栈空间,从而导致读取全局变量失败。

    解决这个问题的一种方法是将全局变量的值在中断函数中复制到局部变量中,然后在中断函数中使用局部变量。例如:

    int num=0;
    void T100()   //计时
    {
        int local_num = num;  // 将全局变量num的值复制到局部变量local_num中
        TMOD&=0xf;      //低4位不变,高4位清0      
        TMOD|=0x10;
        TH1 = 
    }
    

    这样,在中断函数中可以使用局部变量local_num,而不需要读取全局变量num。

    评论

报告相同问题?

问题事件

  • 修改了问题 4月10日
  • 修改了问题 4月10日
  • 创建了问题 4月10日