nop不同晶振频率下的延时时间

 

_nop_()函数

包括在库函数intrins.h中的
表示空循环一个
机器指令的时间,12M中表示1us;6M中表示2us;24M中表示0.5us(微妙)
1S=1000ms=1000000us;
NOP,常在通信驱动中用到,如IIC(I2C)等

12MHz  晶振的话,一个机器周期是1us,因此
单周期指令为1us,如NOP,MOV Rn,#data等等
双周期指令为2us,如SJMP等等
四周期指令为4us,如DIV,MUL等等。
11.0592MHz晶振的话,一个周期是1.085us,也就是时间是12M周期的1.085倍。

51单片机12M晶振,晶振周期1/12微秒,一个机器周期包含12个晶振周期,所以12M晶振时机器周期=12x(1/12)微秒=1微秒 。11.0592M的晶振就将上文公式中12换成11.0592即可

/*************************************************************************

*  函数名称:SamplingDelay

*  功能说明:简单延时程序,应用范例:SamplingDelay(1);

*           一个nop延时一个机器指令周期,延时时间因单片机晶振频率而异

*           此处所用晶振频率为11.0592MHz,故一个nop为1.085μs,为就是12MHz晶振

*           时间的1.085倍,此处大致约等于1μs。所以执行一条SamplingDelay(1);延时2μs

*  参数说明:无

*  函数返回:无

*************************************************************************/

#if 0

void SamplingDelay(unsigned int n)

{
   volatile unsigned int i ;

   for(i=0;i<n;i++)

   {
        _nop_();//一个指令周期

        _nop_();

    }

}



#endif

猜你喜欢

转载自blog.csdn.net/WalterBrien/article/details/92853114