51 单片机的几种精确延时实现延时
51 单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器 / 计数
器,这种方法可以提高 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。 可以把这一函数
当作基本延时函数,在其他函数中调用,即嵌套调用 \[4\] ,以实现较长时间的延时;但需要
注意,如在 Delay40us( )中直接调用 4 次 Delay10us( )函数,得到的延时时间将是 42 μ s,而
不是 40 μ s。这是因为执行 Delay40us( ) 时,先执行了一次 LCALL指令( 2 μ s),然后开始
执行第一个 Delay10us( ),执行完最后一个 Delay10us( )时,直接返回到主程序。依此类推,
如果是两层嵌套调用,如在 Delay80us( )中两次调用 Delay40us( ),则也要先执行一次 LCALL
51单片机的几种精确延时 来自淘豆网m.daumloan.com转载请标明出处.