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

一. 500ms延时子程序

void delay500ms(void)
{unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);
}

产生的汇编:

C:0x0800      7F0F       MOV        R7,#0x0F

C:0x0802      7ECA       MOV        R6,#0xCA

C:0x0804      7D51       MOV        R5,#0x51

C:0x0806      DDFE       DJNZ       R5,C:0806

C:0x0808      DEFA       DJNZ       R6,C:0804

C:0x080A      DFF6       DJNZ       R7,C:0802

C:0x080C      22          RET

计算分析:

  程序共有三层循环

  一层循环n:R5*2 = 81*2 = 162us                    DJNZ    2us

  二层循环m:R6*(n+3) = 202*165 = 33330us            DJNZ    2us + R5赋值 1us = 3us

  三层循环: R7*(m+3) = 15*33333 = 499995us          DJNZ    2us + R6赋值 1us = 3us

  循环外:     5us            子程序调用 2us + 子程序返回 2us + R7赋值 1us    = 5us

  延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms

计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5

二. 200ms延时子程序

void delay200ms(void)
{unsigned char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--);
}

产生的汇编

C:0x0800      7F05       MOV        R7,#0x05

C:0x0802      7E84       MOV        R6,#0x84

C:0x0804      7D96       MOV        R5,#0x96

C:0x0806      DDFE       DJNZ       R5,C:0806

C:0x0808      DEFA       DJNZ       R6,C:0804

C:0x080A      DFF6       DJNZ       R7,C:0802

C:0x080C      22           RET

三. 10ms延时子程序

void delay10ms(void)
{unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);
}

产生的汇编

C:0x0800      7F05       MOV        R7,#0x05

C:0x0802      7E04       MOV        R6,#0x04

C:0x0804      7DF8       MOV        R5,#0xF8

C:0x0806      DDFE       DJNZ       R5,C:0806

C:0x0808      DEFA       DJNZ       R6,C:0804

C:0x080A      DFF6       DJNZ       R7,C:0802

C:0x080C      22         RET

四. 1s延时子程序

void delay1s(void)
{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--);
}

对1s延时的验证:

1.      设置仿真的晶振为12MHz

2.   在延时函数设置断点

3. 单步运行程序,到达延时函数的入口

4.   先记下进入延时函数的时间

5.   step out 跳出函数,记下此时时间,两个时间相减即为延时函数运行时间

函数运行时间=1.00041400-0.00041600≈1s

产生的汇编

C:0x0800      7F05       MOV        R7,#0x05

C:0x0802      7E04       MOV        R6,#0x04

C:0x0804      7D74       MOV        R5,#0x74

C:0x0806      7CD6       MOV        R4,#0xD6

C:0x0808      DCFE       DJNZ       R4,C:0808

C:0x080A      DDFA       DJNZ       R5,C:0806

C:0x080C      DEF6       DJNZ       R6,C:0804

C:0x080E      DFF2       DJNZ       R7,C:0802

C:0x0810      22         RET

在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响.

void mDelay(unsigned int Delay) //Delay = 1000 时间为1S
{ unsigned int i; for(;Delay>0;Delay--) { for(i=0;i<124;i ) {;} }
}void waitms(int i)
{ char m; for( ; i ;i--) { for(m = 203; m ; m--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } }
} 

延时1ms的函数 
时钟频率12MHz

unsigned int sleepTime;
unsinged char inSleep = 0; void sleepService(void)
{ if (inSleep) sleepTime--; if (sleepTime == 0) inSleep = 0;
} void isr_timer(void) //假定定时器中断1ms 中断一次。
{ ... sleepService(); ...
} void sleep(unsigned int ms) //延时子程序
{ sleepTime = ms; inSleep = 1; while(inSleep);
} void main(void)
{ .... sleep(1000); //延时 1秒
    ...
} 

如果要求是秒级的这么长的延时,单片机中一般采取不占CPU时间的延时,利用定时器来实现延时,如果非得用循环延时,在C中也通常嵌入汇编实现,这样误差比较小。

转载自:http://www.cnblogs.com/heiyue/p/3246988.html

==========================================================================

如下程序能实现ms毫秒级的比较精确的延时

void Delayms(unsigned int n)
{unsigned int i,j;for(j=n;j>0;j--)for(i=112;i>0;i--);
}

用keil可以看出这个延时的时间,我们先延时1ms(Delayms(1))。

进入Delayms前,sec=0.00042209s

延时后,sec=0.00142253s

可以知道Delayms(1)实际延时0.00142253s—0.00042209s=0.00100044s≈1ms

同样如果想延时15ms的话,用Delayms(15),实际延时0.01480903s≈15ms,延时还是挺精确的。

=======================================================

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

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

    一. 500ms延时子程序 void delay500ms(void) { unsignedchari,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for ...

  2. 【制作】基于金沙滩51单片机的电子密码锁程序

    基于金沙滩51单片机的电子密码锁程序 很久之前做的一个课设,在B站发了效果视频,发现忘记分享代码了,现在整理分享一下. 零.设计报告 1.设计要求 这部分是讲的整个系统实现了什么功能. 1.1.密码的 ...

  3. c51语言双层for循环延时2ms,51单片机利用for语句嵌套实现简单的延时1s功能

    原标题:51单片机利用for语句嵌套实现简单的延时1s功能 51单片机利用for语句嵌套实现简单的延时1s功能 名词解释: (1)时钟周期.定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟 ...

  4. 一个51单片机的键盘扫描程序,算法简单有效

    一个51单片机的键盘扫描程序,算法简单有效 发一个51单片机的键盘扫描程序,算法简单有效                                        再给大家分享一个不错按键程序(来 ...

  5. 51单片机c语言延时计算软件,51单片机精确延时程序大集合+初值计算工具

    在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ;延时5秒左右 DELAY5S:PUSH   04H;2个 ...

  6. pid控制器c51语言编程,51单片机电机pid控制系统程序

    51单片机电机pid控制系统程序 本程序来源网上,小编进行了简单修改,还未验证. /************************* 应用背景:直流电机的额定功率12V,额定转速3000rpm,光码 ...

  7. pt100+51单片机的温控系统程序+仿真图 还带压力显示的

    pt100+51单片机的温控系统程序+仿真图 还带压力显示的 使用pt100测温度,经过放大器放大后的电压值乘以236就是实际的温度值0.42V对应100度,0V对应0度,经过ad运算显示出来,其他滤 ...

  8. 机械手编程用c语言,51单片机机械手控制C程序.doc

    51单片机机械手控制C程序 //包含所需头文件 #include #define uchar unsigned char /***************------宏定义------******** ...

  9. 水下超声波测距c语言程序,51单片机超声波测距C程序

    51单片机超声波测距C程序 (2010-01-26 14:09:10) 电子工程师电子资料大学校园 超声波检测原理 超声波测距的程序流程图 程序如下: //超声波模块程序 #include #defi ...

  10. 51c语言延时作用,51单片机C语言延时函数怎么定义和使用

    描述 51单片机C语言延时函数怎么定义 C语言定义延时函数主要通过无意义指令的执行来达到延时的目的.C程序中可使用不同类型的变量来进行延时设计.经实验测试,使用unsigned char类型具有比un ...

最新文章

  1. 基于matlab的硅晶体模型,基于Matlab的图像处理技术识别硅太阳电池的缺陷
  2. impala的substr从第几位截到最后一位_【题解循环嵌套】书的最后一页(粉丝求助)...
  3. 交换机模拟配置软件_网络设备模拟器Packet Tracer实验
  4. pfSense 2.4.4-RELEASE现已发布!
  5. c++强大还是python强大-Python 到底是强类型语言,还是弱类型语言?
  6. IBatis.Net学习笔记系列文章
  7. Atitit.js模块化 atiImport 的新特性javascript import
  8. DEV柱状图----傻瓜版
  9. C语言 链表实现学生管理系统(含文件读写操作)
  10. JavaScript、Ajax与jQuery的关系
  11. POJ2777(线段树裸题)
  12. 2018-2019 20165226 Exp9 Web安全基础
  13. LeetCode 231. 2的幂
  14. ubuntu 系统U盘中 文件出现小锁子
  15. 设计模式的C语言应用-责任链模式-第三章
  16. 免越狱版 iOS 抢红包插件
  17. java 友好变量单词_“友好”的英语单词是什么?
  18. 为什么QQ空间远离我们?
  19. IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:t
  20. 全智通A+常见问题汇总解答—A+打印本次派工单,结果显示所派工项目

热门文章

  1. Ubuntu 18.04 无法上网
  2. php快递100查询,php采集快递100的快递查询api
  3. 苹果4怎么越狱_它的维生素C含量是苹果的4倍,是我国第4大主粮,土豆怎么种植的...
  4. 思科路由器和交换机的硬件结构
  5. 163vip邮箱登陆入口,怎么登录163邮箱?
  6. TA-LIB】之MACD
  7. html怎么设置空链接,HTML a标签之空链接
  8. java barchart_JAVA-14 用Javafx绘制barchart的另一个实例 2020-11-09
  9. uni-app 中使用外部第三方字体(非字体图标)
  10. 删除计算机用户时拒绝访问权限,c盘为什么拒绝访问 删除c盘文件需要管理员权限怎么办...