_nop()

相当于汇编里的nop伪指令,表示的是空操作,可是实现延时,表示执行一条没有什么意义的指令,例如 MOV r0 ,r0。因为是执行“指令”,所以花的时间是一个指令周期,指令周期是以机器周期为单位计算的(有的指令周期是2个或者以上的机器周期,但是nop指令就是花费一个机器周期),所以:1个NOP = 1个机器周期 = 12 * 时钟周期(51而言)= 12 * 1 / f; f 表示的是你的晶振频率,
例如6Mhz的晶振,f = 6000000,带入上式,结果单位为s。

使用nop延时
通过使用__NOP()函数进行延时,因为使用了8M晶振4倍频,所以是32MHz,所以一个nop约等于1/32us,所以使用32个nop函数为一个us,然后根据需要的定时时间进行计算。

void delay_us(uint32_t time) //us延时
{
uint32_t i=0;
for(i=0;i<time;i++)
{
__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP ();__NOP();__NOP();__NOP();__NOP();__NOP();

__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP ();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();
}
}
void delay_ms(uint32_t time) //ms延时
{
uint32_t i=1000*time;
delay_us(i);
}

猜你喜欢

转载自www.cnblogs.com/qifeng1024/p/11956588.html