一. 500ms延时子程序

void delay500ms(void)

{

unsignedchari,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)

{

unsignedchari,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)

{

unsignedchari,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)

{

unsignedcharh,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

{

unsignedinti;for(;Delay>0;Delay--)

{for(i=0;i<124;i )

{;}

}

}void waitms(inti)

{charm;for( ; i ;i--)

{for(m = 203; m ; m--)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

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

unsigned intsleepTime;

unsingedchar 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 intn)

{

unsignedinti,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,延时还是挺精确的。

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

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

  1. 基于单片机的c语言倒计时程序,30秒倒计时c语言51单片机实现.doc

    30秒倒计时c语言51单片机实现 原理图: 程序: #include #define uchar unsigned char #define uint unsigned int sbit dula=P ...

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

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

  3. 机械手 c语言,51单片机机械手控制C程序

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

  4. 单片机热敏电阻测温度c语言,51单片机热敏电阻测温程序.doc

    //本程序是通过热敏电阻测温度(30c-50c #include #include #include #define uchar unsigned char #define uint unsigned ...

  5. 延时1us程序12mhz晶振c语言,51单片机12M晶振的延时程序

    这是本人慢慢调出来的参数,有误差是必须的,除非用汇编才会精确,后续我会更新修改,尽量精确. 调试环境:Keil V4.02本文引用地址:http://www.eepw.com.cn/article/2 ...

  6. ds18b20温控报警c语言,51单片机DS18B20温度控制报警程序(可设置温控范围)

    DS18B20的管脚定义: 1.GND 2.DQ 3.VCC DQ   →  P1.7 K1   →  P3.2 K2   →  P3.4 K3   →  P3.6 K4   →  P3.7 温度显示 ...

  7. 51单片机直流电机调速c语言,51单片机直流电机调速程序

    #includereg52.h>本文引用地址:http://www.eepw.com.cn/article/170917.htm sbit KEY1 = P3^1; //定义调速按键 sbit ...

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

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

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

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

最新文章

  1. ArcGIS水文分析实战教程(9)雨量计算与流量统计
  2. img.width一直是0的问题--记录(二)
  3. Qt Creator常用快捷键及技巧提升编码效率
  4. 怎么使用ar打包静态库
  5. flex布局怎么设置子元素大小_Web前端(三):前端布局
  6. java设计模式中的动态代理
  7. 火狐浏览器 附件组件 Xpath 安装
  8. Gartner首发中国数据库市场指南,巨杉数据库代表数据库领域厂商入选
  9. TF-IDF算法原理和公式
  10. 25岁从零开始学习平面设计会不会晚
  11. VMware虚拟机备份和恢复
  12. 3D-AVS2参考软件RFD10.0的配置
  13. Matlab数值分析编程:牛顿下山法解方程
  14. 安卓四大组件(小白篇)
  15. python通讯录管理系统姓名年龄号码_基于互联网的移动通讯录管理系统的制作方法...
  16. 活用async/await,实现一些让Vue更好用的装饰器
  17. Linux系统下rar软件的安装以及如何解压文件
  18. 畅捷通t6选择服务器信息,用友软件t6服务器地址
  19. 音视频系列 - 云游戏产业分析与技术剖析
  20. Linux FTP服务安装步骤

热门文章

  1. 非域环境修改域用户密码一直提示你的新密码不符合域的长度、复杂性或历史记录要求。请尝试选择其他新密码。
  2. MySQL数据库用户密码连续5次输入错误限定用户登录
  3. Spring之父Rod Johnson
  4. 社群经济与组织社群化 (2)
  5. 大厂技术专家:云原生与软件供应链安全的思考
  6. 宏杉科技针对传统RAID缺陷推CRAID 3.0
  7. 计算不同高度下的大气密度
  8. 其他干货——大气人计算机必备技能——不同编程语言比较(Matlab, python, fortran, NCL, IDL)
  9. [EOS源码分析]6.EOS特殊智能合约eosio
  10. 一年时间,从小白到进入阿里巴巴核心部门