51单片机软件延时为什么不准确
正好有个类似的问题,我刚回答了
提问:
机器周期为1um.而1秒=10^6um。但是为什么感觉设计出来的程序延迟是10秒的呢
delay()
{
int i,s;
for(i=1000;i>0;i--)
{
for(s=1000;s>0;s--)
{
_nop_();
}
}
}
我的回答..
很简单, for循环也是需要时间的.
当你使用仿真的时候,通常可以在编译器里面查看这段代码的汇编指令.
你可以看书它的用到了多少个汇编指令, 然后在你的芯片手册上查询,每一个汇编指令执行需要多少个最小指令周期. 最小指令周期才是你说的1um, 全部加起来, 你就知道你这句话用掉了多少个最小指令.
很明显 远远超过了1个最小指令.9秒的的误差算少的了...
所以说,假如你要做1s的延迟, 最好使用内部时钟中断来做,直接在程序内部delay延时的话,占用系统资源还算不准...
具体解释下上图, 为了拿这5分还真不容易...
首先, 进入函数就需要5个汇编指令, 这些指令主要是入栈,备份指针的操作, 不同的编译器指令不同,但都差不多.... 当然 这5个指令是进入函数只跑一次, 占用时间不多, 消耗时间最多的是你for循环内部的指令, 一个for循环需要8条汇编指令才能实现, 而每个汇编指令通常都需要消耗1-2个最小指令循环,具体那个指令消耗几个循环我懒的查手册, 不同的芯片不一样, 你自己看看你用的芯片手册把....
以上... 应该清楚了把.. 不明白追问, 我要是再次无聊的话, 会修改回答.