51单片机的延迟函数一般分为用while实现和用for实现两种,while一般可实现微秒级延迟,而for循环一般实现毫秒级查询,实现代码如下:
delay_us(int n)
{
while(n--);
}
delay_ms(int n)
{
for(i=n;i>0;i--)
for(j=0;j<110;j++)
;
}
下面分析一下原理:
1、while(n--);循环需要执行n个机器周期,一个机器周期为12个时钟周期,一个时钟周期是1/(11.0592*1000000)秒,所以一个机器周期为12*1/(11.0592*1000000)秒,约1.09微秒,所以delay_us()所用时间为n*1.09微秒。
2、要计算delay_ms()函数的执行时间,可以按照如下步骤:
1)计算for(j=0;j<110;j++);的执行时间
a.计算每个循环的执行时间:每次循环包括三个操作:j的自增,比较j和110,跳转到循环开头。假设每个操作的执行时间为1个机器周期,则每次循环的执行时间为3个机器周期;
b.计算整个循环的执行时间:循环体中有110次循环,因此整个循环的执行时间为110*3=330个机器周期。
2)计算for(i=n;i>0;i--)的执行时间
类似第1)步,整个循环的执行时间为n*3个机器周期
3)所以delay_ms()总的执行时间为n*3*330=n*990个机器周期,约n*990*1.09=n*1079微秒,即n毫秒左右。