如何使用8051定时器生成时间延迟?

发布时间:2023-10-26  

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单片机定时器可以生成任何频率的方波(受控制器规格限制)。该技术非常简单。编写一个延迟子程序,延迟等于方波时间周期的一半。使任何端口引脚为高电平并调用延迟子程序。延迟子程序完成后,将相应的端口引脚拉低,调用延迟子程序增益。子程序完成后,再次重复循环。结果将是所选端口引脚上所需频率的方波。电路图如下所示,它可以用于任何方波,但程序必须相应。不同方波的程序如下图所示:

20211028110259.jpg

例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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    HAL库将SysTick定时器用做了库函数的超时定时器,使用的地方非常多,自己修改代码使用嘀嗒定时器的话就会引起错乱,所以此时就需要自己实现一个us级别延时函数。 这里介绍一种使用定时器设计us级延时函数......
    ),可以设置计数器的最大值。计算最大延时(us)的公式为:最大延时(us)= (计数器最大值+1) * 定时器分频系数 / 定时器频率通过调整最大值,即可获得所需的微秒级延时。步骤 3:编写延时函数......
    在HAL库中用定时器实现自定义延时函数delay_us();STM32程序从标准库移植到HAL库的时候,会发现HAL库中只有一个毫秒级延时函数HAL_Delay(),而没有微秒级延时delay_us......
    方式是初学者玩的,如果用到实际项目,除了大聪明,我找不到更好的词夸你。 2.使用定时器和中断 可以使用STM32内置的定时器和中断来实现延时功能。 将定时器配置为2小时的定时周期,并启用定时器中断。 在中断处理函数中设置标志位表示延时......
    不到更好的词夸你。 2.使用定时器和中断 可以使用STM32内置的定时器和中断来实现延时功能。 将定时器配置为2小时的定时周期,并启用定时器中断。 在中断处理函数中设置标志位表示延时结束,并执行相应的操作。 需要......
    stm32delay函数怎么写;STM32的延时函数可以使用SysTick定时器来实现。SysTick定时器是一个24位的计数器,它可以在每个时钟周期自动减少计数值,直到计数值为0时触发中断。我们......
    MCU 里能级连出 64bit 的定时器,就可以不用开启中断(清零翻转的时间特别长,可近似认为是永久),s_highCounter 此时就不需要了。 关于延时函数接口,delay() 用于阻塞型延时......
    项目使用MCU有空闲的定时器,且不考虑换MCU的话,我个人建议还是使用通用的定时器外设,不要使用DWT,虽然DWT方便移植,但通用定时器外设简单易懂,对于没有了解过这部分知识的小白,看到DWT的延时函数......
    ();   P2=0xff;      //关闭所有数码管 } void main(void)//主函数 {   TMOD=0x01;//使用定时器T0秒   TH0=(65536-46083......
    51单片机产生PWM软件延时和定时器产生两种方法;89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>