51单片机延时计算
时钟周期
若时钟晶振的振荡频率为fosc,则振荡周期 Tosc=(1/fosc)。
如:晶振频率为12MHZ,则振荡周期 Tosc=(1/12us)。
机器周期
对于不同的芯片采用的机器周期各不相同,主要分为:12T、6T、4T、1T等等。
如51系列单片机常见的12T机器周期,每个机器周期占用时间为(12 * 时钟周期)。
依此类推,6T占用的时间为(6 * 时钟周期)。
延时计算
对于语句:
for(a=n;a>0;a--);
其延时的大小计算如下:
delay_time = [(a*2)+3] * 机器周期
但准确的说要加上延时程序调用时间:
delay_time = ([(a*2)+3] + 5) * 机器周期
例如 :晶振为12MHz、时钟周期为12T的单片机,下面for循环语句:
for(a=50;a>0;a--)
for(b=10;b>0;b--);
其延时为:
delay_time = [(10*2 +3)*50+3]*(1/12)*12 us = 1153us
最后 再加上 5us * 12/12us 程序调用延时的时间
其中 1/12 为晶振决定的机器周期,最后面的 12 是指时钟周期为 12T。
#define u8 unsigned char
void delay_1ms()
{
u8 a,b;
for(a=142;a>0;a--)
for(b=2;b>0;b--);
_nop_();
}
void delay_10us()
{
u8 a,b;
for(a=1;a>0;a--)
for(b=1;b>0;b--);
}
void delay_1s()
{
u8 a,b,c;
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_();
}