51单片机之定时器


前言

        上一篇文章中介绍什么是中断系统,其中提到了定时器,那么定时器是什么,又如何工作的呢?接下来让我们一起来了解定时器。


一、定时器是什么?

        定时器是单片机的重要功能模块之一,在检测、控制领域有广泛应用。定时器常用作定时时钟,以实现定时检测,定时响应、定时控制,并且可以产生ms宽的脉冲信号,驱动步进电机。定时和计数的最终功能都是通过计数实现,若计数的事件源是周期固定的脉冲则可实现定时功能,否则只能实现计数功能。因此可以将定时和计数功能全由一个部件实现。

二、周期是什么?

        在 51单片机的最小系统板上有一个12MHZ的晶振,那为什么是12MHZ呢?在此之前就需要了解三个概念:时钟周期、指令周期和机器周期。

2.1 时钟周期

        时钟周期也称为振荡周期,定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。时钟周期是一个时间的量。时钟周期表示了SDRAM所能运行的最高频率。更小的时钟周期就意味着更高的工作频率。

2.2 机器周期

        机器周期也称为CPU周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成。AT89S51单片机每12个时钟周期为1个机器周期。

2.3 指令周期

        指令周期是取出一条指令并执行这条指令的时间。一般由若干个机器周期组成,是从取指令、分析指令到执行完所需的全部时间。单片机的指令按字节可分为单字节(1个机器周期)、双字节(2个机器周期)、三字节指令(3个机器周期),乘法、除法指令需要(4个机器周期),因此执行一条指令的时间也不相同。

         因此,晶振可以理解为单片机的 “心脏” ,它为单片机提供了时钟周期,晶振频率会直接影响时钟周期的大小,二者的关系为:时钟周期 =  1 / 晶振频率 。无论你的晶振频率是多少,对于单片机来说,它内部都是固定的关系 ,在设计之初,由于51单片机性能和制程工艺等因素,出厂时把51单片机的机器周期严格的控制在12个时钟周期,指令周期一般是由1 2 4 个机器周期组成。

        那么为什么晶振是12Mhz?通过计算:时钟周期 = 1 / (12M) (s) =  1/12000000 (s) = 1/12 (us),51单片机一个机器周期是12个时钟周期,即机器周期=12*1/12 (us) = 1 (us) ,这样执行1条指令的时间就控制在了1(us)、2(us)、4(us)。

三、与定时器有关的寄存器

        

 3.1  定时器/计数器T0、T1的控制寄存器TCON

        TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等,TCON格式如下:
TCON:定时器/计数器中断控制寄存器(可位寻址)

位:76543210
字节地址:88HTF1TR1TF0TR0IE1IT1IE0IT0
  •  TF1:定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置“1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”TF1(TF1也可由程序查询清“0”)。
  • TR1:定时器T1的运行控制位。该位由软件置位和清零。当GATE(TMOD.7)=0,TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。当GATE(TMOD.7)=1,TR1=1月INT1输入高电平时,才允许T1计数。定时器/计数器T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当最高位产
  • TFO:生溢出时,由硬件置“1”TFO,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清“0”TFO( TFO也可由程序查询清“0”)。
  • TRO:定时器T0的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)=0,TR0=1时就允许T0开始计数,TR0=0时禁止TO计数。当GATE(TMOD.3)=1,TR1=0且INT0输入高电平时,才允许T0计数。外部中断1请求源(INT1/P3.3)标志。
  • IE1=1,外部中断向CPU请求中断,当CPU响应该IE1:中断时由硬件清“0”IE1。
  • IT1:外部中断1触发方式控制位。IT1=0时,外部中断1为低电平触发方式,当INT1(P3.3)输入低电平时,置位IE1 。采用低电平触发方式时,外部中断源(输入到INT1)必须保持低电平有效,直到该中断被CPU 响应,同时在该中断服务程序执行完之前,外部中源必须被清除(P3.3要变高),否则将产生另一次中断。当IT1=1时,则外部中断1 (INT1端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1 ,向主机请求中断处理。外部中断0请求源(INTO/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清“0”IE0(边沿触发方式)。
  • IEO:外部中断0请求源(INT0/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清“0”IE0(边沿触发方式)。
  • ITO:外部中断0触发方式控制位。IT0=0时,外部中断0为低电平触发方式,当INT0(P3.2)输入低电平时,置位IE0。采用低电平触发方式时,外部中断源(输入到INTO)必须保持低电平有效,直到该中断被CPU响应,同时在该中断服务程序执行完之前,外部中断源必须被清除(P3.2要变高),否则将产生另一次中断。当IT0=1时,则外部中断0(INTO)端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1 ,向主机请求中断处理。

3.2  定时器/计数器工作模式寄存器TMOD

        定时和计数功能由特殊功能寄存器TMOD的控制位CT进行选择,IMOD寄存器的各位信息如下表所列。可以看出,2个定时/计数器有4种操作模式,通过TMOD的M1和MO选择。2个定时/计数器的模式0、1和2都相同,模式3不同,各式下的功能如下所述。
寄存器TMOD各位的功能描述:

 四、定时器的工作模式

        通过对寄存器TMOD中的M1(TMOD.1)、MO(TMOD.0)的设置,定时器/计数器0有4种不同的工作模式,见下表:

M1M0工作方式说明
00方式013位定时器/计数器
01方式116位定时器/计数器
10方式28位自动重装定时器/计数器
11方式3T0分成两个独立的8位定时器/计数器;T1此方式停止计数

        定时器初值的计算:

例:对12MHz  1个机器周期 1us  12/fosc = 1us

  • 方式0  13位定时器最大时间间隔  = 2^13 = 8.192ms
  • 方式1  16位定时器最大时间间隔  = 2^16 = 65.536ms
  • 方式2  8位定时器最大时间间隔  = 2^8 = 0.256ms =256 us 
  • 方式3 仅适用于T0,此时T0分成两个8位计数器,T1停止计数

4.1  模式0(13位定时器/计数器)

       

        该模式下的13位寄存器包含:TH0全部8个位TL0的低5位。TL0的高3位不定,可将其忽略。置位运行标志(TRO)不能清零此寄存器。模式0的操作对于定时器0及定时器1都是相同的。2个不同的GATE位(TMOD.7和TMOD.3)分别分配给定时器1及定时器0。

        机器周期每来一个脉冲,特殊功能寄存器(Timer Low0)TL0计数值加1,当TL0计数值加到TL0的最大值时,再加1时,TL0溢出,TL0归0;TL0的低5位溢出时向TH0进位,TH0计数值加1,当TH0计数值加到TH0的最大值时,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。

        假设用方式0,2^13为8192微秒的延迟,实现5毫秒的延迟。1ms=8,192-5,000=3,192,TH0=3192/32=99,TL0=3192-32*99=32。换算为16进制为:TH0=O*063H,TL0=O*020H,代码如下:

ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T_0
ORG 0030H
MAIN:
    MOV TMOD,#00H
    MOV TH0,#063H
    MOV TL0,#020H
    SETB EA
    SETB TR0
    SJMP $
T_0:
      MOV TH0,#063H
    MOV TL0,#020H
    RETI

4.2 模式1(16位定时器/计数器)

        模式1除了使用了TH0及TL0全部16位外,其他与模式0完全相同。即此模式下定时器/计数器0作为16位定时器/计数器,如下图所示:

        

        需要注意的一点是:当C/T=1;处于计数模式时,计数脉冲是 T0 引脚上的外部脉冲。计数初值与计数个数的关系为:X=2(16)- N。其中2(16)表示 2 的 16 次方。(X表示计数初值,N表示计数个数)。

        注意:该方式也不能像方式2一样,硬件自动重装TL0和TH0初值,是需要我们自己软件重装TH0和TH0初值。也就是说使用该方法时,不仅需要在定时/计数器初始化时,给定时/计数器特殊功能寄存器TL0和TH0赋初始值,而且还需要在TH0溢出后进入定时/计数器中断函数后再赋TL0和TH0初始值一次。

4.3 模式2(8位自动重装定时器/计数器)

   

        该方式只需 TL1溢出时,就可以置位TCON中的TF1标志,向CPU发出中断请求。该方式硬件自动重装TL1的初值,就不需要TL1溢出后进入定时/计数器中断函数后再赋TL1初始值一次。至于自动重装是该这么理解呢?

        TL1的溢出不仅置位TF1,而且将TH0内容重新装入TL1,TH0内容由软件预置,重装时TH1内容不变。什么意思呢?意思是:当TL1溢出时,TL1归0,不仅置位TF1,向CPU发出中断请求,而且还将TH1的值赋值给TL1(TL1=TH1),因为我们一般初始化定时/计数器的时候都会给寄存器TL1和TH1赋初值的。这一操作下来,那我们就不需要在进入中断函数的时候再给寄存器TL1赋初始值了。

4.4 模式3(T0分成两个独立的8位定时器/计数器)    

        对定时器1,在模式3时,定时器1停止计数,效果与将TR1设置为0相同。

        对定时器0,此模式下定时器0的TL0及TH0作为2个独立的8位计数器。TL0占用定时器0的控制位:CT、GATE、TR0、INT0及TF0。TH0限定为定时器功能(计数器周期),占用定时器1的TR1及TF1。此时,TH0控制定时器1中断。 

        模式3是为了增加一个附加的8位定时器/计数器而提供的,使单片机具有三个定时器/计数器。模式3只适用于定时器/计数器0,定时器T1处于模式3时相当于TR1=0,停止计数,而T0可作为两个定时器用。

五、利用定时器延迟版自动流水灯

        对上一篇文章中的手动版流水灯修改,修改中断入口地址,开启定时器,设置初值,修改后代码如下:

ORG 0000H
    AJMP MAIN
	ORG 000BH
		AJMP T_0
    ORG 0030H
	MAIN:
		MOV DPTR,#15536
		MOV TH0,DPH
		MOV TL0,DPL
		SETB EA
		SETB ET0
		SETB TR0

		MOV P2,#11111111B
		MOV A,#01H      
	LIGHT:             
		MOV P2,A
		SJMP LIGHT

	T_0: 
		MOV TH0,DPH
		MOV TL0,DPL
	    RL A  
		RETI
END


总结

        以上就是今天要讲的内容,本文仅简单介绍了单片机的定时器相关知识,以及对流水灯用定时器计时的方式实现。

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值