KeilC51程序设计中几种精确延时方法

KeilC51程序设计中几种精确延时方法

ID:36494377

大小:66.00 KB

页数:6页

时间:2019-05-11

KeilC51程序设计中几种精确延时方法_第1页
KeilC51程序设计中几种精确延时方法_第2页
KeilC51程序设计中几种精确延时方法_第3页
KeilC51程序设计中几种精确延时方法_第4页
KeilC51程序设计中几种精确延时方法_第5页
资源描述:

《KeilC51程序设计中几种精确延时方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、KeilC51程序设计中几种精确延时方法2009年05月16日星期六14:35转自:http://www.cnblogs.com/xuasmi/archive/2009/03/06/1404721.html来源:嵌入式技术网 作者:河南师范大学段向东毋茂盛 时间:2007-12-19 发布人:林逸--------------------------------------------------------------------------------------------  摘要实际的单片机应用系统

2、开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等,对于许多C51开发者特别是初学者编制非常精确的延时程序有一定难度。本文从实际应用出发,讨论几种实用的编制精确延时程序和计算程序执行时间的方法,并给出各种方法使用的详细步骤,以便读者能够很好地掌握理解。引言  单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微

3、秒到几秒。有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作。用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。  实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。

4、1使用定时器/计数器实现精确延时  单片机系统一般常选用11.0592MHz、12MHz或6MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1μs和2μs,便于精确延时。本程序中假设使用频率为12MHz的晶振。最长的延时时间可达216=65536μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。  在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器

5、延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSHACC、PUSHPSW、POPPSW和POPACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。2软件延时与时间计算  在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。2.1短暂延时  可以在C文件中通过使用带_NOP_

6、()语句的函数实现,定义一系列不同的延时函数,如Delay10us()、Delay25us()、Delay40us()等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10μs的延时函数可编写如下:                      Delay10us()函数中共用了6个_NOP_()语句,每个语句执行时间为1μs。主函数调用Delay10us()时,先执行一个LCALL指令(2μs),然后执行6个_NOP_()语句(6μs),最后执行了一个RET指令(2μs),所以执行上述函数时共需

7、要10μs。    可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用[4],以实现较长时间的延时;但需要注意,如在Delay40us()中直接调用4次Delay10us()函数,得到的延时时间将是42μs,而不是40μs。这是因为执行Delay40us()时,先执行了一次LCALL指令(2μs),然后开始执行第一个Delay10us(),执行完最后一个Delay10us()时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us()中两次调用Delay40us(),则也要

8、先执行一次LCALL指令(2μs),然后执行两次Delay40us()函数(84μs),所以,实际延时时间为86μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs()中直接调用8次Delay10us(),此时的延时时间为82μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。2.2在C51中嵌套汇编程序段实现延时  在C51中通过预处理指令#pragm

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。