如何利用for循环实现C语言的精确延时

C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章51单片机 Keil C 延时程序的简单研究,他是用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 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

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

以下为6MHZ的晶振8051的核心单片机C语言的延时1秒的延时:

void delay1s(void)

{

unsigned char h,i,j,k;

for(h=3;h>0;h--)

for(i=5;i>0;i--)

for(j=82;j>0;j--)

for(k=19;k>0;k--);

}

展开阅读全文

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

  1. c 程序多语言,怎样在程序中利用C支持多国语言

    怎样在程序中利用C支持多国语言 本文以emule为例,探讨一下多国语言支持的实现.选择emule,因为它的多国语言支持实现的相当好,可以支持动态切换.而且最关键,它是开源的,可以直接通过源码来研究它的 ...

  2. python for循环案例-Python利用for循环打印星号三角形的案例

    简单的for循环打印三角形 1,for循环方法实现星星三角 代码: for i in range(0,5): for j in range(i+1): if i == 4: print("* ...

  3. C语言简单计算器考虑优先级,利用你现有的c语言知识 设计开发一个简易计算器,可进行加、减、乘、除、求余运算。...

    满意答案 nxy_159 推荐于 2017.11.21 采纳率:52%    等级:9 已帮助:3561人 #include float numA = 0; float numB = 0; float ...

  4. matlab中循环读入文件内容,[转载]Matlab利用load循环读入数据文件

    Contents 1.load循环读入.mat 2.1.fprintf写出数据txt 2.2.load循环读入txt % 利用load循环读取文件 % 把文件的文件名按一定的规律命名,假如:f001. ...

  5. 利用for循环打印图形

    利用for循环打印图形 利用for循环打印图形时,我们需要记住外层循环列,内层循环行,然后们需要做的不外乎是找到它们循环的规律罢了. 打印矩形图形 打印: ***** ***** ***** **** ...

  6. 6.2_[Java 数组]-利用二重循环打印各种图形

    ################################################## 目录 玩坏二重循环 一句话概括二重循环 打印一个矩形 打印正直角三角形左下角顶点 打印倒直角三角形 ...

  7. python循环语句打印三角形_如何使用python语言中的语句遍历循环生成三角形

    在python语言中,除了使用if语句,还可以使用while循环语句,利用多层循环生成不同的图形,如果在特殊位置中断,可以创建不同的图形.下面利用实例说明如何生成三角形,操作如下: 工具/原料 pyc ...

  8. matlab中循环load,[转载]Matlab利用load循环读入数据文件

    Contents 1.load循环读入.mat 2.1.fprintf写出数据txt 2.2.load循环读入txt % 利用load循环读取文件 % 把文件的文件名按一定的规律命名,假如:f001. ...

  9. 原理c语言for循环延时1s,for循环实现C语言精确延时

    for循环实现C语言精确延时 for循环实现C语言精确延时 ----- djh2000 C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章 51单片机 Keil C 延时程序 ...

最新文章

  1. Xamarin环境搭建
  2. 布谷鸟哈希函数的参数_用于并发读密集型的乐观Cuckoo(布谷鸟) Hashing
  3. nginx引用外部配置
  4. python 拼音姓名排序_Python一秒将全部中文姓名转为拼音!
  5. webdriverAPI-Java
  6. 山哥新作:架构师必备技能之业务分析
  7. 一张图读懂nginx多线程高并发
  8. php mysql查询例子_php mysqli多个查询的例子
  9. 构造函数模式知识的扩展
  10. 苹果手机默认拍照比例_苹果手机拍照有什么技巧?这几个功能要知道,不然别说自己用苹果...
  11. 《大数据》2022年第4期目次摘要
  12. 单龙芯3A3000-7A1000PMON研究学习-(1)硬件原理图
  13. 如何查看电脑操作系统及系统类型
  14. Win10怎么看内存条频率
  15. 浏览器页签icon图标的设置和获取
  16. JavaScript模块机制
  17. 搭建表白墙 公众号_韶大表白墙 第十季 第75期 | 篮球共青杯决赛体教1班穿黑色衣服的0号...
  18. 微信小程序播放m3u8视频总结
  19. 人工神经网络的优缺点
  20. 基金使用计划 数学建模 matlab,基金使用计划(数学建模).ppt

热门文章

  1. html给看板娘添加语音,如何给你的Jekyll博客添加可爱的二次元看板娘(Live2D)
  2. Wordpress网站设计入门 设置logo 和菜单同行
  3. android嵌入有米广告,Android界面嵌入有米广告
  4. Linux | 分布式版本控制工具Git【版本管理 + 远程仓库克隆】
  5. Python Urlencode URL编码与解码
  6. SpringBoot 2 使用 SpringIntegration 与 Google Cloud Pub/Sub 进行消息传输
  7. eshop6-nginx
  8. 80后看了会哭的组图
  9. 使用 WebSocket 客户端连接 MQTT 服务器/vue 项目使用mqtt消息队列实现推送
  10. 电脑输入英文字符的时候字体突然变了样