延迟使用8051定时器。

8051微控制器有两个独立的16位向上计数计时器,分别名为Timer 0和Timer 1,本文是关于使用8051计时器生成时间延迟的。使用纯软件循环产生延迟已经在这里讨论过了,但这种延迟的准确性较差,不能用于敏感应用。使用定时器延时是最准确、肯定是最好的方法。

定时器可以概括为一个多位计数器,它在接收时钟信号时增加/减少自己,并在滚转时产生一个中断信号。当计数器在处理器的时钟上运行时,它被称为“定时器”,它计算预定义数量的处理器时钟脉冲并产生可编程延迟。当计数器在一个外部时钟源(可能是周期性或非周期性的外部信号)上运行时,它本身被称为“计数器”,它可以用于计数外部事件。

在8051中,振荡器输出用除数网络除以12,然后作为时钟信号馈给定时器。这意味着对于以12MHz运行的8051,计时器时钟输入将是1MHz。这意味着每1uS推进一次,单个8051定时器可能的最大延时为(2^16)x(1µS) = 65536µS。超过这个时间的延迟可以通过使用计时器编写一个基本的延迟程序来实现,然后循环它所需的时间。我们将在本文的下一节中详细介绍所有这些内容。

利用8051定时器设计延时程序。

在8051中设计延时程序时,计算需要加载到TH和TL寄存器中的初始值是一件非常重要的事情。让我们看看是怎么做的。

  • 假设处理器是由12MHz的晶体计时。
  • 这意味着,计时器时钟输入将是12MHz/12 = 1MHz
  • 这意味着计时器进行一次增量所花费的时间= 1/1MHz = 1uS
  • 对于“X”uS的时间延迟,计时器必须进行“X”增量。
  • 2^16 = 65536是一个16位定时器可能的最大计数个数。
  • 假设TH是必须加载到TH注册的值,TL是必须加载到TL注册的值。
  • 然后,THTL =十六进制等效的(65536-X),其中(65536-X)被认为是十进制。
的例子。

让所需的延迟为1000uS(即;1 ms)。

也就是说X = 1000

65536 - x = 65536 - 1000 = 64536。

64536被认为是十进制的,将它转换为十六进制得到FC18

也就是说THTL = FC18

因此TH=FC, TL=18

程序产生1mS延迟使用8051定时器。

下面显示的程序可以用于生成1mS的延迟,它被编写为一个子程序,以便您可以在程序的任何地方调用它。您还可以将其放入循环中以创建更长的时间延迟(1mS的倍数)。这里使用8051的定时器0,它在MODE1(16位定时器)中工作。

DELAY: MOV TMOD,#00000001B //设置定时器0到MODE1(16位定时器)。不使用定时器1 MOV TH0 # 0 FCH / /加载TH0注册FCH MOV TL0, # 018 h / /加载TL0注册18 h SETB TR0 / /启动定时器0:JNB TF0,这里/ /循环直到TF0设置(ie;直到展期)CLR TR0 / /停止定时器0 CLR TF0 RET / /清除TF0国旗

上面的延迟程序可以循环两次以获得2mS的延迟,如下面的程序所示。

Main: mov r6,# 2d循环:调用延迟DJNZ r6, loop SJMP主延迟:mov tmod,# 00000001b mov th0,# 0fch mov tl0,# 018h setb tr0这里:JNB tf0,这里CLR tr0 CLR tf0 ret
使用计时器时需要记住的几点。
  • 一旦设置了定时器标志(TF),程序员必须清除它才能再次设置它。
  • 定时器在定时器标志设置后不会停止。程序员必须清除TR位以停止计时器。
  • 一旦计时器溢出,程序员就必须将初始起始值重新加载到TH和TL寄存器中,以便从这些寄存器开始计数。
  • 我们可以配置所需的计时器,以便在设置TF标志时创建一个中断。
  • 如果不使用中断,那么我们必须检查定时器标志(TF)是否使用一些条件分支指令设置。
  • 使用单个8051定时器可能的最大延迟为65536µS,最小延迟为1µS,如果你使用12MHz晶体为微控制器时钟。

用8051定时器产生方波。

可以使用8051定时器生成任何频率(受控制器规格限制)的方波。这项技术非常简单。写出延时等于方波时间周期的一半的延时子程序。使任何端口引脚高,并调用延迟子程序。在延迟子程序完成后,使相应的端口引脚低,并调用延迟子程序增益。子程序完成后,再次重复这个循环。结果将是在选定端口引脚处产生所需频率的方波。电路图如下所示,它可以用于任何方波,但程序必须相应地。不同方波的程序如下图所示。

延时使用8051定时器
用8051定时器产生方波
1KHz方波使用8051定时器。
Mov p1,# 00000000b Mov tmod,# 00000001b main: setb p1.0 call delay CLR p1.0 call 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 KHz方波使用8051定时器。
Mov p1,# 00000000b Mov tmod,# 00000001b main: setb p1.0 call delay CLR p1.0 call 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
10khz方波使用8051定时器。
Mov p1,# 00000000b Mov tmod,# 00000001b main: setb p1.0 call delay CLR p1.0 call 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
作者

18评论

  1. Sreekarthika

    嘿,如何产生延迟为0.2毫秒的三角波

  2. Amit Sasane

    我需要一个不同延迟的方波为每个半周期和电压水平是20V和电流评级是6A,所以我怎么能得到它使用uc8051

  3. 艺术

    如何制作一个100KHz的延迟节目?在这个例子中,我得到的最小是27KHz

  4. 桑德拉让Ganesan

    我们可以用定时器1来编写相同的硬件延迟程序吗?

  5. raviraj

    如何在任何程序中使10秒的延迟?

  6. 阿努普应

    我们可以从外部改变时间吗?

    • raviraj

      不,它不是改变一个时间延迟的外部…

    • jinulal

      是的,延迟时间取决于我们加载到计时器寄存器中的值。通过改变这个值,我们可以得到你想要的

  7. iftikharizhar

    方波有什么用

    • jinulal

      方波是一种锐边脉冲。可能是控制器可以产生的非常基本的控制信号。
      例如:基于伺服电机的机器人可以通过改变开关时间来控制这些方波。

Baidu