zoukankan      html  css  js  c++  java
  • 1s延时程序

    #include <reg52.h>
    sbit P1_0 = P1^0;
    void Delay(); // 下面引用时一定要和这里的大小写一致否则会有警告或错误

    void Main()
    {
    while (1) // 开始一直循环
    {
    P1_0 = 0;
    Delay(); // 没有参数也要加 () 否则会有Warning
    P1_0 = 1;
    Delay();
    }
    }

    void Delay() // 12M晶振1s延时
    {
    unsigned char h, i, j, k;

    for (h = 5; h > 0; h--)
    for (i = 4; i > 0; i--)
    for (j = 116; j > 0; j--)
    for (k = 214; k > 0; k--); // 最后个要有 ; 号

    }

    //=======以下非代码==========//

    原理,利用h,i,j,k循环指令消耗掉一定时间来达到延时,为什么利用循环延时的做法,在12M晶振延时1秒中需要h,i,j,k四个变量,且各变量的值是上面代码中那样呢?这要从单片机的周期说起,单片机有指令周期,机器周期,状态周期,时钟周期;

    时钟周期:也就晶振的振荡周期,以12MHz为例,时钟周期为 1/ 12000000 = 1/12us;

    机器周期:1个机器周期=6个状态周期=12个时钟周期=1us;

    指令周期:单片机执行一条指令所需要的时间称为指令周期,指令周期是以机器周期为单位的,不同的指令所需要的机器周期不一定相同(1-4个),单片机执行一条单周期指令需要1us,执行一条双周期指令需要2us,for循环需要8个指令周期;

    具体执行for循环消耗的时间,可以在Keil里通过代码测量:

    #include <reg52.h>
    sbit P1_0 = P1^0;
    void Delay(); 

    void Main()
    {
    while (1) // 开始一直循环
    {
    P1_0 = 0;
    Delay(); 
    P1_0 = 1;
    Delay();
    }
    }

    void Delay() 
    {
    unsigned char h;

    for (h = 1000; h > 0; h--);  // 此处下断点

    }

    循环1000次执行完后的时间点

    1000次循环耗时 0.00042850s - 0.00019600s = 0.00023250s = 232.5us;1次循环耗时约 0.2us,

    1s = 1000000us,1000000us / 0.2us = 500000次,而 5 * 4 * 116 * 214 = 496480;因为无符号字符型unsigned char 大小为1 byte,范围为0~255,所以只能通过循环嵌套,近似的得到一个1s延时。 

  • 相关阅读:
    使用Boost::ptime构建高精度计时器
    static和extern
    通用js地址选择器
    js模拟抛出球运动
    前端用Webpact打包React后端Node+Express实现简单留言版
    webpack 打包一个简单react组件
    img及父元素(容器)实现类似css3中的background-size:contain / background-size:cover
    通用js函数集锦<来源于网络> 【二】
    通用js函数集锦<来源于网络/自己> 【一】
    向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]
  • 原文地址:https://www.cnblogs.com/coloregg/p/3556711.html
Copyright © 2011-2022 走看看