1 / 10
文档名称:

51单片机精确延时.doc

格式:doc   页数:10页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

51单片机精确延时.doc

上传人:ranfand 2016/3/17 文件大小:0 KB

下载得到文件列表

51单片机精确延时.doc

文档介绍

文档介绍:Keil C51 中几种精确延时程序设计方法更新于 2009-02-03 01:37:21 文章出处:与非网 Keil C51 定时器精确延时程序执行时间引言单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1] 。单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时, 时间从几十微秒到几秒。有时还要求有很高的精度, 如使用单总线芯片 DS18B20 时, 允许误差范围在十几微秒以内[2] , 否则, 芯片无法工作。用 51 汇编语言写程序时, 这种问题很容易得到解决, 而目前开发嵌入式系统软件的主流工具为 C 语言,用 C51 写延时程序时需要一些技巧[3] 。因此, 在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。实现延时通常有两种方法:一种是硬件延时,要用到定时器/ 计数器,这种方法可以提高 CPU 的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。 1 使用定时器/ 计数器实现精确延时单片机系统一般常选用 2 MHz 、 12 MHz 或6 MHz 晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为 1μs和2μs ,便于精确延时。本程序中假设使用频率为 12 MHz 的晶振。最长的延时时间可达 216=65 536 μs。若定时器工作在方式 2, 则可实现极短时间的精确延时; 如使用其他定时方式, 则要考虑重装定时初值的时间(重装定时器初值占用 2 个机器周期)。在实际应用中, 定时常采用中断方式, 如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/ 计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意, C51 编写的中断服务程序编译后会自动加上 PUSH ACC 、 PUSH PSW 、 POP PSW 和 POP ACC 语句, 执行时占用了 4 个机器周期; 如程序中还有计数值加 1 语句, 则又会占用 1 个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去, 从初值中减去以达到最小误差的目的。 2 软件延时与时间计算在很多情况下,定时器/ 计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。 短暂延时可以在 C 文件中通过使用带_NOP_( ) 语句的函数实现,定义一系列不同的延时函数, 如 Delay10us( )、 Delay25us( )、 Delay40us( ) 等存放在一个自定义的 C 文件中,需要时在主程序中直接调用。如延时 10 μs 的延时函数可编写如下: void Delay10us( ){ _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); } Delay10us( ) 函数中共用了 6个_NOP_( ) 语句, 每个语句执行时间为 1μs。主函数调用 Delay10us( ) 时,先执行一个 LCALL 指令( 2μs ),然后执行 6个_NOP_( ) 语句( 6μs), 最后执行了一个 RET 指令(2μs), 所以执行上述函数时共需要 10 μs。可以把这一函数当作基本延时函