Keil C51 精确延时
"Keil C51 精确延时" 本文主要讨论 Keil C51 中实现精确延时的方法,包括使用定时器/计数器和软件延时两种方法。在单片机系统中,实现精确延时是非常重要的,否则可能会导致芯片无法工作。使用 C 语言编写延时程序时,需要一些技巧。 一、使用定时器/计数器实现精确延时 使用定时器/计数器可以提高 CPU 的工作效率,也能做到精确延时。在单片机系统中,常用的晶振频率为 11.059 MHz、12 MHz 或 6 MHz。使用 12 MHz 的晶振,最高的延时时间可达 216=65 536 μs。使用定时器/计数器延时可以实现极短时间的精确延时。 需要注意的是,C51 编写的中断服务程序编译后会自动加上 PUSH ACC、PUSH PSW、POP PSW 和 POP ACC 语句,执行时占用了 4 个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,以达到最小误差的目的。 二、软件延时与时间计算 在一些情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。软件延时可以通过使用_NOP_( )语句实现。在 C 文件中可以定义一系列不同的延时函数,如 Delay10us()、Delay25us()、Delay40us() 等。这些函数可以嵌套调用,以实现较长时间的延时。 需要注意的是,在嵌套调用时,需要考虑函数调用的开销时间。例如,在 Delay40us() 中直接调用 4 次 Delay10us() 函数,得到的延时时间将是 42 μs,而不是 40 μs。这是因为执行 Delay40us() 时,先执行了一次 LCALL 指令(2 μs),然后开始执行第一个 Delay10us(),执行完最后一个 Delay10us() 时,直接返回到主程序。 三、在 C51 中嵌套汇编程序段实现延时 在 C51 中可以使用#pragma asm 和#pragma endasm 指令嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm 之后,在#pragma endasm 之前结束。这个方法可以实现不同时间的延时。 Keil C51 中实现精确延时有多种方法,可以选择合适的方法根据实际情况。使用定时器/计数器可以提高 CPU 的工作效率,也能做到精确延时,而软件延时可以在一些情况下使用。