#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延时。

1s延时程序的更多相关文章

  1. 51单片机 Keil C 延时程序的简单(晶振12MHz,一个机器周期1us.)

    一. 500ms延时子程序 void delay500ms(void) { unsigned char i,j,k; ;i>;i--) ;j>;j--) ;k>;k--); } 产生 ...

  2. 51单片机 Keil C 延时程序的简单研究

    应用单片机的时候,经常会遇到需要短时间延时的情况.需要的延时时间很短,一般都是几十到几百微妙(us).有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很 ...

  3. fpga延时程序编写

    //工匠小建 延时计数 100微妙计数 50M*0.00001-1 (个人理解:1s中50M次动作.那么100us多少次动作.做完这些动作就是延时)parameter delay_100us=16'd ...

  4. C51 延时程序

    一.相关换算 1.1s=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(纳秒)=10^12ps(皮秒)=10^15fs(飞秒)=10^18as(阿秒)=10^21zm(仄秒)=10^24ym ...

  5. C语言单片机中延时程序的实现

    在单片机或嵌入式系统的程序,常常用规定次数的空循环来实现延时 /** * 通过一个空循环体循环让程序运行一段时间.在嵌入式系统中,这个函数用来实现延时. * * 参数: *    u16 i -- 循 ...

  6. 延时程序执行Qt

    有时候为了让程序暂停一下,不让它一直跑下去,可以使它进入循环结构中! 例如: #include <QCoreApplication> #include <qdebug.h> # ...

  7. 50ms延时程序

    12MHz晶振 一个机器周期2us, DEL:  MOV  R7,#200D DEL1: MOV R6,#125 DEL2: DJNZ R6,DEL2 ;125*2=250us DJNZ  R7,DE ...

  8. PIC单片机编译器自带的延时程序

    https://wenku.baidu.com/view/3c94e2934028915f814dc205.html

  9. 定时工作方式2实现1s定时

    定时器的几种工作方式中,除0和前面的1类似都需要初始化计数值,然后开始计数,计数溢出后,需要再次控制计数的初值,但工作模式2不同于此,工作方式2将THx和TLx分开处理,将初值存放在THx中,计数时只 ...

随机推荐

  1. 362. Design Hit Counter

    这个傻逼题..我没弄明白 you may assume that calls are being made to the system in chronological order (ie, the ...

  2. 使用Velocity 模板引擎快速生成代码

    Velocity 模板引擎介绍 在现今的软件开发过程中,软件开发人员将更多的精力投入在了重复的相似劳动中.特别是在如今特别流行的MVC架构模式中,软件各个层次的功能更加独立,同时代码的相似度也更加高. ...

  3. 什么是staging server

    原文链接:http://blog.csdn.net/blade2001/article/details/7194895 软件应用开发的经典模型有这样几个环境:开发环境(development).集成环 ...

  4. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  5. linux —— 学习笔记(文件、文件夹操作)

    目录:1.常用的文件文件夹操作 2.文件属性的设置 1.常用的文件文件夹操作 mkdir  创建文件夹 -p 如果指定 a/b/c 时 a .b 不存在,一起创建出来 cp       复制文件或文件 ...

  6. shell从函数文件里调用函数

    碰到一个shell中函数调用的小问题,记录一下. shell中函数有三种调用方式,一种是在文件前面定义函数,然后在以下直接调用:一种是通过加载shell,在shell中直接调用:第三种是将函数写入文件 ...

  7. PHP问题Parse error: syntax error, unexpected end of file in

    检查一下你的php文件中是否存在这样的语法错误:<<php{>或者<?{?>以上两种写法都是有错误的,修改为下面的就可以了: <?php}?>

  8. Delphi下实现全屏快速找图找色

    前言 最近有好几个朋友都在问我找图找色的问题,奇怪?于是乎写了一个专门用于找图找色的单元文件“BitmapData.pas”.在这个单元文件中我实现了从文件中导入位图.屏幕截图.鼠标指针截图.在图片上 ...

  9. springmvc 例

    1.结构 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRscWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCM ...

  10. android 46 service

    service是安卓四大组建之一,service只能系统创建不能new,service也要在项目清单中注册说明,service分为2中,一种是系统级的服务,一种是我们自己写的服务. 启动和关闭serv ...