keil c51中如何在中断中改变全局变量的值?

我定义了一个全局变量speed,希望每次计数器中断后该值能增加1,然后我要将增加后的speed用在主函数中,作为另一个函数的实参传递,可是我发现主函数中的这个speed却... 我定义了一个全局变量speed,希望每次计数器中断后该值能增加1,然后我要将增加后的speed用在主函数中,作为另一个函数的实参传递,可是我发现主函数中的这个speed却在中断后不会改变。

void INTERRUPT_T0(void) interrupt 1
{
TH0=0xff;
TL0=0xff;
f(!KEY)
{
delay1ms(10);
if(!KEY)
{
speed++;
if(speed==6)
speed=0;
}
while(!KEY);
}
}
展开
 我来答
melody丶丨
2012-09-25 · TA获得超过1393个赞
知道小有建树答主
回答量:390
采纳率:100%
帮助的人:146万
展开全部
常规来说这是肯定会变化的 这个问题你首先检查一下是否进入中断 中断中speed的值是否发生变化 主函数中有没有语句对speed这个变量产生影响 逻辑是否正确
更多追问追答
追问
主程序中是这样的:
void main(void)
{
while(1)
display(0,speed);
}
其中display(0,speed);是一个数码管显示函数,speed是数码管段码值数组的索引,本想每次中断后显示数字加1(0-5变化),可是调试发现一直处于0的状态。
追答
你定时器都没初始化么  怎么进定时器中断  还有进中断扫描按键  除非你一直把键按着
Elinxx
2012-09-25 · 超过10用户采纳过TA的回答
知道答主
回答量:41
采纳率:0%
帮助的人:33.6万
展开全部
你在定时器里边还要检测键盘,这个恐怕思路是有问题的,但是硬来得花也是行。我猜想你的意思可能是,定时时间到,并且键按下就speed+1,那么你的while()的位置恐怕不对,或者前面的do没有显示出来???你就在中断函数里使劲循环,检测到后speed+1, 再break就OK了。具体实现就不写了,因为不知道你是要检测键盘按下还是没有按下。。。。。
追问
while()后面有“;”所以不会一直循环。至于在计数器中断检测按键,我以前做过,其实你想按键的时间检测很短,根据封装的初值,原本是按下按键后才会溢出,发生中断,但是这样写就相当于已经按下了里面在继续检测,时间也就是几十毫秒的问题,我就是通过这样来做计数器中断时的按键去抖的。我是想问:在中断中改变了speed,那么main()中的speed会不会被改变?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2017-12-17
展开全部
是的 我也纠结过这个问题。
在定时器中断中, 读取全局好像问题不大, 但是写入会出现不可预料的结果。
而且,即使加上 volatile 也没有效果。
奇诡的是, 在串口中断中, 全局变量读写都很好。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
方珂爸爸
2012-09-25
知道答主
回答量:1
采纳率:0%
帮助的人:1578
展开全部
对不起,这个我真不知道
追问
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式