8051单片机有两个独立的16位向上计数定时器,名为Timer0和Timer1,本文是关于使用8051定时器生成时间延迟。使用纯软件循环可以生成延迟,但这种延迟精度较差,不能用于敏感应用。使用定时器延迟是最准确的,当然也是最好的方法。
定时器可以概括为多位计数器,它在接收时钟信号时增加/减少自身,并在翻转时产生中断信号。当计数器在处理器时钟上运行时,它被称为“定时器”,它对预定数量的处理器时钟脉冲进行计数并产生可编程延迟。当计数器在外部时钟源(可能是周期性或非周期性外部信号)上运行时,它本身被称为“计数器”,可用于对外部事件进行计数。
在8051单片机中,振荡器输出使用12分频网络进行12分频,然后作为时钟信号馈入定时器。这意味着对于以12MHz运行的8051,定时器时钟输入将为1MHz。这意味着计时器每1uS前进一次,使用单个8051计时器可能的最大时间延迟为(2^16)x(1uS)=65536uS。比这更长的延迟可以通过使用定时器编写一个基本的延迟程序然后循环它所需的时间来实现。我们将在本文的下一节中详细了解所有这些。
一、使用8051单片机的定时器设计延迟程序
在8051中设计延时程序时,计算需要加载到TH和TL寄存器中的初始值是很重要的事情。让我们看看它是如何完成的:
(1)假设处理器由12MHz晶振提供时钟。
(2)这意味着,定时器时钟输入将为12MHz/12=1MHz
(3)这意味着,定时器增加一倍所用的时间=1/1MHz=1uS
(4)对于“X”uS的时间延迟,计时器必须使“X”递增。
(5)2^16=65536是16位定时器可能的最大计数数。
(6)设TH是必须加载到TH寄存器的值,TL是必须加载到TL寄存器的值。
(7)然后,THTL=(65536-X)的十六进制等效值,其中(65536-X)被视为十进制。
二、使用8051单片机定时器产生1mS延迟的程序
下面的程序可用于产生1mS延迟,已被编写为子程序,以便可以在程序的任何地方调用它。也可以将其置于循环中以创建更长的时间延迟(1mS的倍数)。这里使用了8051的定时器0,它在MODE1(16位定时器)下运行。
DELAY: MOV TMOD,#00000001B // Sets Timer 0 to MODE1 (16 bit timer). Timer 1 is not used
MOV TH0,#0FCH // Loads TH0 register with FCH
MOV TL0,#018H // LOads TL0 register with 18H
SETB TR0 // Starts the Timer 0
HERE: JNB TF0,HERE // Loops here until TF0 is set (ie;until roll over)
CLR TR0 // Stops Timer 0
CLR TF0 // Clears TF0 flag
RET
上面的延迟例程可以循环两次以获得2毫秒的延迟,如下面的程序所示:
MAIN: MOV R6,#2D
LOOP: ACALL DELAY
DJNZ R6,LOOP
SJMP MAIN
DELAY: MOV TMOD,#00000001B
MOV TH0,#0FCH
MOV TL0,#018H
SETB TR0
HERE: JNB TF0,HERE
CLR TR0
CLR TF0
RET
使用定时器时要记住的几点:
(1)一旦设置了定时器标志(TF),程序员必须先将其清除,然后才能再次设置。
(2)定时器标志设置后定时器不会停止。程序员必须清除TR位才能停止定时器。
(3)一旦定时器溢出,程序员必须将初始起始值重新加载到TH和TL寄存器以开始向上计数。
(4)我们可以配置所需的计时器以在设置TF标志时创建中断。
(5)如果没有使用中断,那么我们必须使用一些条件分支指令检查定时器标志(TF)是否设置。
(6)使用单个8051定时器可能的最大延迟为65536uS,如果您使用12MHz晶体为单片机计时,则最小延迟为1uS。
三、使用8051单片机定时器生成方波
使用8051单片机定时器可以生成任何频率的方波(受控制器规格限制)。该技术非常简单。编写一个延迟子程序,延迟等于方波时间周期的一半。使任何端口引脚为高电平并调用延迟子程序。延迟子程序完成后,将相应的端口引脚拉低,调用延迟子程序增益。子程序完成后,再次重复循环。结果将是所选端口引脚上所需频率的方波。电路图如下所示,它可以用于任何方波,但程序必须相应。不同方波的程序如下图所示:
例1:1KHz方波。
MOV P1,#00000000B
MOV TMOD,#00000001B
MAIN: SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP MAIN
DELAY: MOV TH0,#0FEH
MOV TL0,#00CH
SETB TR0
HERE: JNB TF0,HERE
CLR TR0
CLR TF0
SETB P1.0
RET
END
例2:2KHz方波。
MOV P1,#00000000B
MOV TMOD,#00000001B
MAIN: SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP MAIN
DELAY: MOV TH0,#0FCH
MOV TL0,#018H
SETB TR0
HERE:JNB TF0,HERE
CLR TR0
CLR TF0
SETB P1.0
RET
END
例3:10KHz方波。
MOV P1,#00000000B
MOV TMOD,#00000001B
MAIN: SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP MAIN
DELAY: MOV TH0,#0FFH
MOV TL0,#0CEH
SETB TR0
HERE:JNB TF0,HERE
CLR TR0
CLR TF0
SETB P1.0
RET
END
相关文章