1 / 9
文档名称:

汇编延时.doc

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

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

分享

预览

汇编延时.doc

上传人:xxj16588 2016/4/7 文件大小:0 KB

下载得到文件列表

汇编延时.doc

文档介绍

文档介绍:汇编延时 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。可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用\[4\] ,以实现较长时间的延时; 但需要注意, 如在 Delay40us( ) 中直接调用 4 次 Delay10us( ) 函数,得到的延时时间将是 42μs ,而不是 40μs。这是因为执行 Delay40us( ) 时,先执行了一次 LCALL 指令( 2μs), 然后开始执行第一个 Delay10us( ) ,执行完最后一个 Delay10us( ) 时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在 Delay80us( ) 中两次调用 Delay40us( ) ,则也要先执行一次 LCAL L 指令( 2μs) ,然后执行两次 Delay40us( ) 函数( 84μs) ,所以, 实际延时时间为 86μs 。简言之,只有最内层的函数执行 RET 指令。该指令直接返回到上级函数或主函数。如在 Delay80 μ s() 中直接调用8次 Delay10us( ) ,此时的延时时间为 82μs 。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延