用C语言实现精确的延时

怎么用C语言做单片机的精确延时在单片机应用中,经常会遇到需要短时间延时的情况,一般都是几十到几百μs,并且需要很高的精度(比如用单片机驱动DS18B20时,误差容许的范围在十几μs以内,不然很容易出错);而某些情况下延时时间较长,用计时器往往有点小题大做。另外在特殊情况下,计时器甚至已经全部用于其他方面的定时处理,此时就只能使用软件定时了[1]。1??C语言程序延时??Keil C51的编程语言常用的有2种: 一种是汇编语言;另一种是C 语言。用汇编语言写单片机程序时,精确时间延时是相对容易解决的。比如,用的是晶振频率为12 MHz的AT89C51,打算延时20 μs,51单片机的指令周期是晶振频率的1/12,即一个机器周期为1 μs;“MOV R0,#X”需要2个机器周期,DJNZ也需要2个机器周期,单循环延时时间t=2X+3(X为装入寄存器R0的时间常数)[2]。这样,存入R0里的数初始化为8即可,其精度可以达到1 μs。用这种方法,可以非常方便地实现512 μs以下时间的延时。如果需要更长时间,可以使用两层或更多层的嵌套,当然其精度误差会随着嵌套层的增加而成倍增加。??虽然汇编语言的机器代码生成效率很高,但可读性却并不强,复杂一点的程序就更难读懂;而C语言在大多数情况下,其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,且C 语言还可以嵌入汇编程序来解决高时效性的代码编写问题。就开发周期而言,中大型软件的编写使用C 语言的开发周期通常要比汇编语言短很多,因此研究C语言程序的精确延时性能具有重要的意义。??C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。2??单层循环延时精度分析??下面是进行μs级延时的while程序代码。??延时函数:??void delay1(unsigned char i) {? ? while(i );}??主函数:??void main() { ? ? while(1) {? ?? ?delay1(i);? ? }??}??使用Keil C51的反汇编功能,延时函数的汇编代码如下:??C:0x00E6AE07MOVR6,0x07??C:0x00E81FDECR7??C:0x00E9EEMOVA,R6??C:0x00EA70FAJNZC:00E6??C:0x00EC22RET图1??断点设置位置图??通过对i赋值为10,在主程序中图1所示的位置设置断点。经过测试,第1次执行到断点处的时间为457 μs,再次执行到该处的时间为531 μs,第3次执行到断点处的时间为605 μs,10次while循环的时间为74 μs,整个测试结果如图2所示。图2??使用i--方式测试仿真结果图??通过对汇编代码分析,时间延迟t=7X+4(其中X为i的取值)。测试表明,for循环方式虽然生成的代码与用while语句不大一样,但是这两种方法的效率几乎相同。C语言中的自减方式有两种,前面都使用的是i--的方式,能不能使用--i方式来获得不同的效果呢?将前面的主函数保持不变,delay1函数修改为下面的方式:??void delay1(unsigned char i) {? ? while(--i);}??同样进行反汇编,得到如下结果:??C:0x00E3DFFEDJNZR7, ??C:00E3C:0x00E522RET??比较发现,--i的汇编代码效率明显高于i--方式。由于只有1条语句DJNZ,执行只需要2个时钟周期, 1个时钟周期按1 μs计算,其延时精度为2 μs;另外,RET需要2个时钟周期,能够达到汇编语言代码的效率。按前面的测试条件进行测试,第1次执行到断点处的时间为437 μs,再次执行到该处的时间为465 μs,第3次执行到断点处的时间为493 μs,10次while循环的时间为28 μs,整个测试结果如图3所示。图3??使用--i方式测试仿真结果图??调整i的取值,i取8时延时时间为24 μs,i取9时延时时间为26 μs。通过分析得出,10次循环为28 μs是由于外层循环造成的,其精度可以达到2 μs。在设计时应该考虑参数传递和RET语句执行所需要的时间周期。实验分析发现,for语句使用--i方式,同样能够达到与汇编代码相同的精度。i取不同值时延时仿真结果如图4所示。图4??i取不同值时延时仿真结果图3??多重嵌套下的C程序延时??在某些情况下,延时较长,仅使用单层循环方式是不能完成的。此时,只能使用多层循环方式,那么多重循环条件下,C程序的精度如何呢?下面是一

0.5s c语言延时子程序集,用C语言实现精确的延时.doc相关推荐

  1. 线程池延时类ScheduledExecutorService—比Timer更有效精确的延时工具

    ScheduledExecutorService 前言   在Java中我们一般使用Timer来进行延时/周期执行操作,Timer的内部只有一个线程,如果有多个任务的话就会顺序执行,这样我们的延迟时间 ...

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

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

  3. 蜂鸣器的原理及使用方法及实验:开关S1闭合发出频率为1kHz的声音,发声时间约为1s。开关S2闭合发出频率为500Hz的声音,发声时间约为0.5s。

    实验2 并行I/O口应用设计实验 一.实验目的 (1)熟练掌握51单片机内部并行I/O口的基本应用: (2)掌握蜂鸣器的原理及使用方法: (3)能够根据项目任务在Proteus 上设计硬件原理图: ( ...

  4. ASP.NET2.0国际化/本地化应用程序的实现总结(多语言,多文化页面的实现)

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  5. C语言的延时程序怎么改,C语言延时子程序准确设置

    在给单片机写程序的时候往往需要一个微秒或者毫秒的延时子程序,但是C语言不同于汇编,很难根据语句确定准确的延时时间,经过各种查资料得到一种简单实用的方法:通过keil下断点调试确定时间. 就是编写一个延 ...

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

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

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

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

  8. 51单片机c语言延时库,51单片机c语言---延时

    1,_nop_()适用于us级的少量延时 标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了.本文引用地址:htt ...

  9. c语言51单片机延时程序,51单片机c语言延时.doc

    1,_nop_() 适用于us级的少量延时 标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果.这在汇编语言中很容易实现,写几个nop就行了. 在keil C51 ...

最新文章

  1. 微信小程序客服实现自动回复图文消息链接,点击去关注公众号
  2. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点
  3. Python之删除字符串中不需要的字符
  4. 实验结果报告与实验总结_教科版科学四年级上册实验报告
  5. 求字符串的最长回文字串 O(n)
  6. 程序员如何把控自己的职业
  7. 用python绘制一条直线_python绘制直线的方法
  8. Node.js: 认识流stream
  9. python table_用python解析word文件(二):table
  10. ZK UserGuide(一)理解/userguide/index.zul导航原理
  11. 量化策略回测DualThrust
  12. PS画实线、虚线箭头
  13. 鸿蒙系统第一批升级名单,鸿蒙系统首批升级名单详细介绍
  14. 什么叫MD5,MD5通常做什么用处,为什么MD5不可逆,用做密码加密的时候仍然可能会被解密?
  15. 软件测试'python'版白盒测试三角形问题
  16. 【渝粤题库】陕西师范大学202491 法语(一)作业
  17. 项目经历怎么写_工程监理简历范文,【工作经历+项目经验+自我评价】怎么写...
  18. 计算机考研只考一门“软件工程”的院校汇总
  19. 【Foobar 2000】如何为本地歌曲音乐评级、打分、评分、打小星星?喜爱程度分级-playcount、quick tagger
  20. 计算机类综合素质测评考什么,综合素质测试考什么内容

热门文章

  1. 2021 最流行的十大 JS 框架,前三又换牌了,最值得关注的是 Svelte 和 Solid 的崛起!...
  2. spring boot基础配置
  3. win11 通过winget安装/卸载v2raya的命令整理
  4. Go中的函数也是一种数据类型,可以赋值给一个变量
  5. Linux deepin解决文件管理器打不开和桌面黑屏的问题
  6. Spark RDD并行度与分区设置
  7. loadrunner脚本运行时设置:Run Logic设置运行次数
  8. Scala集合:reduce(化简)方法使用示例
  9. Python3引号创建字符串
  10. Spring MVC--接收JSON格式的数据