标题: 51单片机为什么中断中定义变量,对应的语句却不执行? [打印本页]

作者: yermsir    时间: 2022-2-12 16:56
标题: 51单片机为什么中断中定义变量,对应的语句却不执行?
51单片机,在定时器0的中断函数中,定义了名称为l的变量,在仿真的时候,语句l=l-1;不会被执行,总是会跳过。不知道是什么原因?

单片机源程序如下:
void T0_Interrupt() interrupt 1
{
         signed char l=10;
         k=k-1;
         l=l-1;
         TH0=0xF9;   
         TL0=0x66;
         

}

作者: dazhige    时间: 2022-2-12 18:11
每次进入中断都给一个初值signed char l=10?定义成全局或者静态变量试试。另外定义变量的时候最好命名有意义的名称,少用单字母啊
作者: xuyaqi    时间: 2022-2-12 20:03
编译后优化掉了。
作者: yermsir    时间: 2022-2-13 08:28
dazhige 发表于 2022-2-12 18:11
每次进入中断都给一个初值signed char l=10?定义成全局或者静态变量试试。另外定义变量的时候最好命名有 ...

定义成全局变量,就没有问题。为什么设置成局部变量就不行呢?
作者: yermsir    时间: 2022-2-13 08:28
xuyaqi 发表于 2022-2-12 20:03
编译后优化掉了。

为什么中断函数里面定义局部变量l,会直接把l=l+1给优化掉了呢?
作者: xuyaqi    时间: 2022-2-13 09:08
yermsir 发表于 2022-2-13 08:28
为什么中断函数里面定义局部变量l,会直接把l=l+1给优化掉了呢?

编译器认为这句是多余的,为了不想优化掉可以把优化级别降低。
作者: hanyinfeng218    时间: 2022-2-13 14:46
声明前加static就好了。局部变量用完就释放了,下次进来是另外一个地址。
作者: dazhige    时间: 2022-2-13 19:04
yermsir 发表于 2022-2-13 08:28
定义成全局变量,就没有问题。为什么设置成局部变量就不行呢?

局部变量每次进来重新分配地址,这样自加和自减就没有意义,所以定义成全局或者静态变量
作者: rundstedt    时间: 2022-2-13 21:25
signed char l=10;
改成
signed char l;
l=10;
作者: blackrkj    时间: 2022-2-13 22:21
没有中断时单片机只会顺序执行主程序中的语句,单片机一边顺序执行主程序的语句时,一边定时器在计时。当计到你设定的值后,他需要产生中断,然后暂停主程序语句,转到中断程序中执行你的命令。执行完命令后返回到主程序的顺序语句中。然后知道下一次中断来临,再次产生中断。
作者: HAPPY3    时间: 2022-2-22 10:59
static  signed char
这样试试
作者: 罗斯德隆    时间: 2022-2-22 11:17
被编译后优化掉了。你定义了又没用。
作者: mimidog111    时间: 2022-2-23 10:34
定义为静态变量
作者: lzd918    时间: 2022-2-23 16:06

万能的方法是定义为static变量,可保万无一失。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1