C51延时函数问题求教

sfuu1986 2017-06-26 02:03:20
最近用stc89c52编程偶然间发现一个问题,关键代码如下:

delay(unsigned long ms)
{
delaytime=ms;
while{delaytime);
}
Timer0//1ms定时器
{
if(delaytime>0)
{
delaytime--;
}
}
void main
{
while(1)
{
P10=0;
delay (500);
P10=1;
delay (500);
}
}
运行时发现P10并不是0.5秒改变一次状态,经常提前或者滞后,不知道是什么原因,以前也是这么用的,可能是没注意到,十分困扰。但是做如下改动即可正常:

delay(unsigned long ms)
{
delaytime=ms;
start=1;
while{start);
}
Timer0//1ms定时器
{
if(start==1)
{
if(delaytime>0)
{
delaytime--;
}
else
start=0;
}
void main
{
while(1)
{
P10=0;
delay (500);
P10=1;
delay (500);
}
}
加上一个标志位,便没有任何问题。在这里请教各位其中的道理。
...全文
620 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sfuu1986 2017-11-07
  • 打赏
  • 举报
回复
引用 3 楼 ckc 的回复:
这种问题应该看看汇编代码,就比较容易看出问题 多半出在 while{delaytime) 8位cpu,判断32位数字是否为0需要一个字节一个字节判断 它在判断的中间,发生了中断,后续的字节被改变 就可能发生这样一些怪异的事情
忘记结贴了 见谅,确实是您说的这个问题。
Milk_1997 2017-06-30
  • 打赏
  • 举报
回复
引用 1 楼 Milk_1997的回复:
我的理解是这样的, 例如赋予延迟函数500的值的瞬间, 不能够保证是立刻进入中断进行减值, 有这几种情况,赋值以后,即可进入中断,没有倒计时第一毫秒。 赋值以后,在第一毫秒中间进入中断。 而,第二种写法,无论什么时候进入中断,在没赋值时,进入中断也不会减值。 这是我的理解,不知道是否正确。
我感觉我的解释貌似错了。
ckc 2017-06-30
  • 打赏
  • 举报
回复
这种问题应该看看汇编代码,就比较容易看出问题 多半出在 while{delaytime) 8位cpu,判断32位数字是否为0需要一个字节一个字节判断 它在判断的中间,发生了中断,后续的字节被改变 就可能发生这样一些怪异的事情
Milk_1997 2017-06-29
  • 打赏
  • 举报
回复
我的理解是这样的, 例如赋予延迟函数500的值的瞬间, 不能够保证是立刻进入中断进行减值, 有这几种情况,赋值以后,即可进入中断,没有倒计时第一毫秒。 赋值以后,在第一毫秒中间进入中断。 而,第二种写法,无论什么时候进入中断,在没赋值时,进入中断也不会减值。 这是我的理解,不知道是否正确。

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧