C语言精确延时

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:0x08007F0F MOVR7,#0x0F

C:0x08027ECA MOVR6,#0xCA

C:0x08047D51 MOVR5,#0x51

C:0x0806DDFE DJNZ R5,C:0806

C:0x0808DEFA DJNZ R6,C:0804

C:0x080ADFF6 DJNZ R7,C:0802

C:0x080C22 RET

计算分析:

程序共有三层循环

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

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

三层循环: R7*(m+3) = 15*33333 = 499995usDJNZ2us + 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:0x08007F05 MOVR7,#0x05

C:0x08027E84 MOVR6,#0x84

C:0x08047D96 MOVR5,#0x96

C:0x0806DDFE DJNZ R5,C:0806

C:0x0808DEFA DJNZ R6,C:0804

C:0x080ADFF6 DJNZ R7,C:0802

C:0x080C22 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:0x08007F05 MOVR7,#0x05

C:0x08027E04 MOVR6,#0x04

C:0x08047DF8 MOVR5,#0xF8

C:0x0806DDFE DJNZ R5,C:0806

C:0x0808DEFA DJNZ R6,C:0804

C:0x080ADFF6 DJNZ R7,C:0802

C:0x080C22 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:0x08007F05 MOVR7,#0x05

C:0x08027E04 MOVR6,#0x04

C:0x08047D74 MOVR5,#0x74

C:0x08067CD6 MOVR4,#0xD6

C:0x0808DCFE DJNZ R4,C:0808

C:0x080ADDFA DJNZ R5,C:0806

C:0x080CDEF6 DJNZ R6,C:0804

C:0x080EDFF2 DJNZ R7,C:0802

C:0x081022 RET

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

延时时间=[(2*k+3)*j+3]*i+5

展开阅读全文

c语言调用延时子程序的例子,C语言精确延时.doc相关推荐

  1. c语言的子程序,51单片机C语言调用汇编子程序的简便方法

    1.在汇编文件中,程序前边加上如下三句话就可以: PUBLIC   _delay, _binrlc       ;定义公用子程序名,这里定义了两个子程序(有下划线) LUOYUAN  SEGMENT ...

  2. keil延时c语言程序设计,Keil C51程序设计中几种精确延时方法

    引言 单片机因具有体积小.功能强.成本低以及便于实现分布式控制而有非常广泛的应用领域[1].单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖.数据传输等操作都要在程序中插入一 ...

  3. 用R语言调用Fortran子程序

    首先写这篇博客的原因是因为关于R调用Fortran之前摸索了两天,然后没弄通就放弃了,后来因为课题需求不得不用R调用大牛写的Fortran程序(毕竟自己写不出来),所以只能硬着头皮去调通程序,然后各种 ...

  4. c语言调用labview方法,LabVIEW与C语言接口的方法

    摘要介绍了一种LabVIEW与C 语言接口的方法,由实例证明,该方法高效.易行,是增强LabVIEW整体功能的一条有效的途径. 关键词虚拟仪器LabVIEW 动态链接库 LabVIEW是一种方便灵活的 ...

  5. c语言提供了子程序的概念,C语言基本概念(1)

    1,C语言概述 C语言是70年代问世,它实际先有语言后有标准.1978年贝尔实验室B.W.Kernighan和D.M.Ritchit合著"The C Promgaming language& ...

  6. linux环境下c语言调用lapack,linux系统下C语言调用lapack ,blas库

    在利用C语言编程,经常调用其他的软件包,其中lapack,blas库是最常用的两个库,这里讲下在linux系统下,C语言编程如何调用这两个库: 1.首先讲下blas库的调用,这里以两个向量内积函数为例 ...

  7. c语言调用system返回值,在C语言中获取用system函数调用shell的返回值

    一般我们调用shell脚本都用system()来实现,然后发现sytem返回值不好控制而且转换麻烦(还要右移4位即/256),于是我用popen来获取shell的返回值.果然在Unix世界里面,通道就 ...

  8. c语言调用函数的方法案例,C语言经典例题100例——C语言练习实例34解答(函数调用)...

    题目:练习函数调用. 程序分析:无. 程序源代码: // 百宝箱工作室 官方网址 http://www.baibaox.com // 百宝箱工作室业务介绍 http://www.baibaox.com ...

  9. c语言结构体的用法例子,c语言 结构体 入门

    在说结构体之前,我们先来看看类型和变量 比如 int a; int是类型名,a是变量名 变量名是我们自己定义的,可以改成其他名字,但是int,char这些类型名是不能修改的 而结构体可以让我们自己定义 ...

最新文章

  1. formdata传递参数_前端利用formData格式进行数据上传,前端formData 传值 和 json传值的区别?...
  2. Nature论文爆出千行Python代码Bug,或影响百篇学术论文
  3. 以 OSGi 包的形式开发和部署 Web 服务
  4. kubevela随笔
  5. 手动为 SAP Spartacus 添加 SSR 支持的步骤
  6. html搞笑注释,9个最有趣的代码注释
  7. 用java统计任一书名次数_Java入门第三季 借书系统源代码 加入了限制重输次数 欢迎指教交流...
  8. 一加Nord 2配置细节曝光:天玑1200芯片+5000万像素旗舰主摄
  9. php做异地登录验证,PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
  10. 物联网架构成长之路(22)-Docker练习之Etcd服务搭建
  11. TIPS:My导入数据中文乱码解决方案
  12. C4—Qt实现记事本(二)2021-11-16
  13. IMU与Gyro及其它相关
  14. keil5库文件安装失败_iPad iPhone如何清理垃圾 iPad iPhone清理垃圾文件办法【详解】...
  15. mac搭建IPV6网络环境
  16. LCD12864 液晶显示-汉字及自定义显示(串口)
  17. 一元三次函数的最值计算
  18. 二、JVM内存模型及内存参数设置
  19. 【SSL】2325细胞问题
  20. “2019·中国云计算和物联网大会”来袭,多个亮点

热门文章

  1. 优先队列默认是小顶堆吗_堆和堆傻傻分不清?进来!包教会!
  2. pygame笔记(更新中
  3. Unity 回合制战斗系统(中级篇)-血条和伤害数值
  4. JavaWeb之上传与下载
  5. python基础 日常总结——列表(二)
  6. 解决微信小程序开发工具右上角没有上传按钮
  7. 大数据学习零基础能够学会不?
  8. ZOJ 1138 Symbolic Derivation
  9. Linux部署禅道在访问web页面进入www时报错:mysql无法连接(重新解压安装包或者输入命令:setenforce 0即可)
  10. 武侠乂 兵器招式和高级心法介绍