51单片机的软件延时时长怎么计算?

在C文件中通常使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:

  void Delay10us( ) {

    _NOP_( );

    _NOP_( );

    _NOP_( );

    _NOP_( );

    _NOP_( );

    _NOP_( );

  }

那么这个软件延时的时长到底该怎么计算呢,假设单片机所使用的晶振为12MHz,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。

可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用。但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。


分享到:


相關文章: