单片机C语言中怎么实现微秒级延时?

比如说i=6;while(i--)i;是延时了68微秒,怎么看出来的?请求帮助,谢谢!!
最后一个i是多写的,没有那个i;是i=6;while(i--);为什么是延时68微秒。我用的是STC89C52单片机。

可以用_nop_( )函数来实现微秒级的延时。

_nop_();            // 直接当成一条语句使用,产生一条NOP指令

NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。


注:使用该函数时,需要将头文件#include<intrins.h>包含进源文件中。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-08-05
大致的原理 就是根据CPU的指标 得到CPU执行一条指令的时间t
然后通过循环一定次数 即执行一定条数的指令N
t*N就是时间了
仅适用于单线程的单片机
对于有线程或者是有中断的情况下会不准确追问

比如STC89C52单片机时钟频率11.0592MHz,它执行一条语句的时间是1,0851us,但是怎么能看出i=6;while(i--);就是延时了68微妙;或者i=103;while(i>0);i--;又是延时了多少微秒呢,谢谢!!

追答

编译成汇编 然后计算会执行多少条指令 乘上每条时间就可以了
由于编译的时候和编译器以及优化有关 所以单独从C上是看不出来的

另外,如果要求精确 最好用汇编命令写延时 因为编译的话 有可能不同时候得到的代码就变了

_nop();
一般用这个函数 执行一次等于一个语句时间

第2个回答  2014-08-05
单片机执行一步运算需要一定的时间,这根单片机的晶振有关!
while(i--)执行了6次,6步的时间!
第3个回答  推荐于2017-10-07
这些属于软件延时,会有一定的误差,但一般的测试没有问题,你可以用KEIL软件仿真,在你写的代码前后各设置一个断点,从第一个断点开始,单步运行到下个断点,KEIL左侧会显示执行这段代码所用的时间。 本质上就是,单片机执行完这段代码的时间,就是你所要的时间。
这款单片机不能硬件调试,如果是其它类型能调试 的MCU,你可以用示波器测出来。本回答被提问者采纳
相似回答