51单片机延时计算

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
/*
    小于4us的延时直接使用_nop_();实现
*/

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_(); 

}

发布了9 篇原创文章 · 获赞 20 · 访问量 6390
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览