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

}

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值