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。


分享到:


相關文章: