KeilC51精确延时程序执行时间.doc

KeilC51精确延时程序执行时间.doc

ID:56673712

大小:72.00 KB

页数:9页

时间:2020-07-04

KeilC51精确延时程序执行时间.doc_第1页
KeilC51精确延时程序执行时间.doc_第2页
KeilC51精确延时程序执行时间.doc_第3页
KeilC51精确延时程序执行时间.doc_第4页
KeilC51精确延时程序执行时间.doc_第5页
资源描述:

《KeilC51精确延时程序执行时间.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、·KeilC51 精确延时 程序执行时间引言  单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差围在十几微秒以[2],否则,芯片无法工作。用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。因此,在多

2、年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。  实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。1 使用定时器/计数器实现精确延时  单片机系统一般常选用11.0592MHz、12MHz或6MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1μs和2μs,便于精确延时。本程序中假设使用频率为12MHz的晶振。最长的延时时间可达216=65536μs。若定

3、时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。Word资料·  在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSHACC、PUSHPSW、POPPSW和POPACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时

4、要考虑进去,从初值中减去以达到最小误差的目的。2 软件延时与时间计算  在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。2.1 短暂延时  可以在C文件过使用带_NOP_()语句的函数实现,定义一系列不同的延时函数,如Delay10us()、Delay25us()、Delay40us()等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10μs的延时函数可编写如下:  voidDelay10us(){    _NOP_();    _NOP_();    

5、_NOP_();    _NOP_();    _NOP_();    _NOP_();  }  Delay10us()函数中共用了6个_NOP_()语句,每个语句执行时间为1μs。主函数调用Delay10us()时,先执行一个LCALL指令(2Word资料·μs),然后执行6个_NOP_()语句(6μs),最后执行了一个RET指令(2μs),所以执行上述函数时共需要10μs。  可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用[4],以实现较长时间的延时;但需要注意,如在Delay40us()中直接调用4

6、次Delay10us()函数,得到的延时时间将是42μs,而不是40μs。这是因为执行Delay40us()时,先执行了一次LCALL指令(2μs),然后开始执行第一个Delay10us(),执行完最后一个Delay10us()时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us()中两次调用Delay40us(),则也要先执行一次LCALL指令(2μs),然后执行两次Delay40us()函数(84μs),所以,实际延时时间为86μs。简言之,只有最层的函数执行RET指令。该指令直接返回到上级函数或

7、主函数。如在Delay80μs()中直接调用8次Delay10us(),此时的延时时间为82μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。2.2 在C51中嵌套汇编程序段实现延时  在C51过预处理指令#pragmaasm和#pragmaendasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragmaasm之后,在#pragmaendasm之前结束。  如:#pragmaasm    …    汇编语言程序段    …    #pragmaendasmWord资料·  延时函数可设置入

8、口参数,可将参数定义为unsignedchar、int或long型。根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。在应用时应注意以下几点:  ◆#pragmaasm、#pragmaendasm不允许嵌套使用;  ◆在程序的开头应加上预处理指令#pragmaasm,在

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

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

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