for循环实现C语言精确延时

for循环实现C语言精确延时

----- djh2000

C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章

51单片机 Keil C 延时程序的简单研究,作者:InfiniteSpace Studio/isjfk

写得不错,他是用while(--i);产生DJNZ 来实现精确延时,后来有人说如果while里面不能放其它语句,否则也不行,用do-while

就可以,具体怎样我没有去试.所有这些都没有给出具体的实例程序来.还看到一些延时的例子多多少少总有点延时差.为此我用

for循环写了几个延时的子程序贴上来,希望能对初学都有所帮助.(晶振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--);

}

产生的汇编

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 DJN

原理c语言for循环延时1s,for循环实现C语言精确延时相关推荐

  1. c51语言1秒延时程序,KeilC51程序设计中几种精确延时方法

    实现延时通常有两种方法: 一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 1 使用定时器/计数器实现精确延时 ...

  2. keil4延时1秒C语言,KEIL单片机C语言精确延时值的计算

    关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为S ...

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

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

  4. 单片机原理及应用(1)--延时1s

    单片机原理及应用(1)–延时1s 目录 单片机原理及应用(1)--延时1s 1.前言 2.关于11.0592Mhz晶振 3.关于"无用指令" 3.1nop 3.2DJNZ 4.程序 ...

  5. c语言for循环延时,如何利用for循环实现C语言的精确延时.doc

    如何利用for循环实现C语言的精确延时 C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章51单片机 Keil C 延时程序的简单研究,他是用while(--i);产生DJN ...

  6. pic单片机延时程序C语言,PIC单片机C语言延时程序和循环子程序实现方法

    PIC单片机C语言延时程序和循环子程序实现方法 很多朋友说C中不能精确控制延时时间,不能象汇编那样直观. 其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来. 一般的我们都用 for(x=1 ...

  7. c语言while延时10ms,for循环实现C语言精确延时

    51单片机Keil C延时程序的简单研究,作者:InfiniteSpace Studio/isjfk 写得不错,他是用while(--i);产生DJNZ来实现精确延时,后来有人说如果while里面不能 ...

  8. 延时1s的程序设计c语言,C语言延时程序.doc

    标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了. 在keil C51中,直接调用库函数: #include / ...

  9. c语言调用延时子程序的例子,C语言精确延时.doc

    C语言精确延时 C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章 51单片机 Keil C 延时程序的简单研究,作者:InfiniteSpace Studio/isjfk ...

最新文章

  1. 文本挖掘预处理之向量化与Hash Trick
  2. 贝叶斯推断及其互联网应用(三):拼写检查
  3. GitLab创建空仓库后拉取并上传文件遇到的系列问题
  4. PHP的PHPStorm的使用姿势
  5. JQuery 定期刷新网页,保持登录状态Session
  6. 员工辞职的十大原因!
  7. Mysql学习总结(6)——MySql之ALTER命令用法详细解读
  8. WebBrowser keystroke
  9. 9 月,有远见的程序员,都关注了这个人!
  10. 武侠人士的10大绝招
  11. Vue中条件判断 v-if 、v-show
  12. 【ACL2020】tBERT: 结合主题模型和BERT实现语义相似度分析
  13. 28天肝完阿里面试通关宝典,含答案解析
  14. css集合——好看的按钮样式+阴影+渐变
  15. 收文和发文管理流程分析
  16. 第7周 项目6—停车场模拟
  17. PHP QQ网页三方登录
  18. ETL——实现Kettle作业定时任务
  19. 如何去除2345好压的广告弹窗
  20. xbox one x驱动_如何在Windows,OS X和Linux上使用Xbox One控制器

热门文章

  1. 使用matplotlib时报错:RuntimeWarning: Glyph 20998 missing from current font.
  2. 水果分割论文、代码和数据集汇总
  3. tableView 取消 cell 默认下划线样式 - iOS
  4. 三、Amlogic A311D 音频驱动指南
  5. 区块链治理框架总结,从Telos实践说起
  6. C++-图像目标区裁剪ImageCropping
  7. CSS基础之背景样式
  8. 计算机用用技巧,计算机使用技巧介绍汇总
  9. 东财《计算机应用基础》综合作业
  10. 齐二TK6916/20/26/32系列数控落地铣镗床简介1