精华内容
下载资源
问答
  • 定时器工作原理及其应用

    千次阅读 2020-05-21 20:38:29
    1 定时器T0和T1 2 定时器/计数器的4种工作方式 2.1 方式0 2.2 方式1 2.3 方式2 2.4 方式3 1)工作方式3下的T0 2)T0工作在方式3下T1的各种工作方式 1 定时器T0和T1 T0和T1是2个独立的16bit向上计数定时器...

    【说明】本文学习自《单片机原理及应用(张毅刚)》。

    目录

    1 定时器T0和T1

    2 定时器/计数器的4种工作方式

    2.1 方式0

    2.2 方式1

    2.3 方式2

    2.4 方式3

    2.4.1 工作方式3下的T0

    2.4.2 T0工作在方式3下T1的各种工作方式

    3 定时器/计数器得编程和应用

     3.1 方式1的应用

    3.2  方式2的应用

    3.3  方式3的应用

    3.4 门控制位GATE的应用——测量脉冲宽度


     

    1 定时器T0和T1

         T0和T1是2个独立的16bit向上计数定时器。T0共有4种不同的操作模式:

    • 模式1:13位向上计数定时器;

    • 模式2:16位向上计数定时器;

    • 模式3:8位向上计数寄存器,并指定重装值;

    • 模式4:独立的2个8位向上计数定时器。

          T1有2种不同的操作模式:(只有T0的模式1和模式2)

    • 模式1:13位向上计数定时器;

    • 模式2:16位向上计数定时器。

        T0和T1分别支持ET0和ET1中断。

     

    2 定时器/计数器的4种工作方式

    2.1 方式0

            当M1、M0为00时,定时器/计数器被设置为工作方式0,这时定时器/计数器的等效框图如图2-1所示(以定时器/计数器T1为例,TMOD.5、TMOD.4 = 00)。

           定时器/计数器工作在方式0时,为13位的计数器,由TLX(X=0,1)的低5位和THX的高8位所构成。TLX低5位溢出则向THX进位,THX计数溢出则置位TCON中的溢出标志位TFX。

           图2-1中,​ 位控制的电子开关决定了定时器/计数器的工作模式:

           1)电子开关打在上面位置,T1位定时器工作模式,以系统时钟振荡器12分频后的信号作为计数信号。

           2)​ 电子开关打在下面位置,T1为计数器工作模式,计数脉冲为P3.5引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加1。

           GATE位的状态决定定时器/计数器运行控制取决于TRX一个条件还是TRX和​引脚这两个条件。

           1) GATE=0时,A点(见图2-2)电位恒为1,B点的电位仅取决于​状态。​,B点为高电平,控制断控制电子开关闭合。计数脉冲加到T1(或T0)引脚,允许T1(或T0)计数。​,B点为低电平,电子开关断开,禁止T1(或T0)计数。

             2)GATE=1时,B点电位由​的输入电平和​的状态这两个条件来确定。当​,且​时(X=0或1),B点才为1,控制端控制电子开关闭合,允许定时器/计数器计数,故这种情况下计数器是否计数是由TRX和​ 2个条件来控制的。

                                                    图2-1 定时器/计数器方式0逻辑结构框图

    2.2 方式1

            当M1、M0为01时,定时器/计数器工作于方式1,这时定时器/计数器的等效电路如图2-2所示(以定时器/计数器T1为例)。

            方式1和方式0的差别仅仅在于计数器的位数不同,方式1为16位的计数器,由THX作为高8位和TLX作为低8位构成(X-0,1),方式0则为13位计数器,有关控制状态位的含义(GATE、C/T、TFX、TRX)与方式0相同。

                                                    图2-2 定时器/计数器方式1逻辑结构框图

    2.3 方式2

    ​         方式0和方式1的最大特点是计数溢出后,计数器为全0。因此在循环定时或循环计数应用时就存在反复装入计数初值的问题。这不仅影响定时精度,而且也给程序设计带来麻烦。方式2就是针对此问题而设置的。

    ​        当M1、M0为10时,定时器/计数器处于工作方式2,这时定时器/计数器的等效框图如图6-4所示(以定时器T1为例,X=1)。

    方式0和方式1的最大特点是计数溢出后,计数器为全0。因此在循环定时或循环计数应用时就存在反复装入计数初值的问题。这不仅影响定时精度,而且也给程序设计带来麻烦。方式2就是针对此问题而设置的。

             当M1、M0为10时,定时器/计数器处于工作方式2,这时定时器/计数器的等效框图如图2-3所示(以定时器T1为例,X=1)。

     

                                                    图 2-3 定时器/计数器方式2逻辑结构框图

           定时器/计数器的方式2为自动恢复初值的(初值自动装入)8位定时器/计数器,TLX作为常数缓冲器,当TLX计数溢出时,在置1溢出标志TFX的同时,还自动的将THX中的初值送至TLX,使TLX从初值开始重新计数。定时器/计数器的方式2工作过程如图2-4若是(X=0,1)。

           这种工作方式可以省去用户软件中重装初值的程序,简化定时初值的计算方法,可以相当精确的确定定时时间。

     

                                                    图 2-4 方式2工作过程

     

    2.4 方式3

            方式3是为了增加1个附加的8位定时器/计数器而提供的,从而使MCS-51具有3个定时器/计数器。方式3只适用与定时器/计数器T0,定时器/计数器T1不能工作在方式3。T1处于方式3相当于TR1=0,停止计数(此时T1可用来作串口波特率产生器)。

    2.4.1 工作方式3下的T0

            当TMOD的低2位位11时,T0的工作方式被选为方式3,各引脚与T0的逻辑关系框图如图2-5所示。

                                                    图 2-5 各引脚与T0的逻辑关系

            定时器/计数器T0分为2个独立的8位计数器:TL0和TH0,TL0使用T0的状态控制位​、GATE、TR0、​,而TH0被固定为1个8位定时器(不能为外部计数模式),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。

    2.4.2 T0工作在方式3下T1的各种工作方式

           一般情况下,当T1用作串行口的波特率发生器时,T0才工作在方式3。T0处于工作方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。

    (i)T1工作在方式0

            T1的控制字中M1、M0=00时,T1工作在方式0,工作示意图如图2-6所示。

                                                    图 2-6 T0工作在方式3时T1为方式0的工作示意图

    (ii)T1工作在方式1

            T1的控制字中M1、M0=01时,T1工作在方式1,工作示意图如图2-7所示。

                                                    图 2-7 T0工作在方式3时T1为方式1的工作示意图

    (iii) T1工作在方式2

            T1的控制字中M1、M0=10时,T1的工作方式为方式2,工作示意图如图2-8所示。

                                                    图 2-8 T0工作在方式3时T1为方式2的工作示意图

    (iv)T1工作在方式3

          T1的控制字中M1、M0=11时,T1停止计数。

          在T0为方式3时,T1运行的控制条件只有2个,即​和M1、M0。​选择时定时器模式还是计数器模式,M1、M0选择T1运行的工作方式。

    • 知识补充,在51单片机中,为什么T1不能工作于方式3

      • 51单片机只有T0、T1,没有T2(52才有)。如果工作在方式0、方式1、方式2的话,51单片机T0、T1都可以做波特率发生器(一般时方式2做波特率发生器)。但是T0可以工作在方式3,T1不能工作在方式3。这种情况下,只能用T1作为波特率发生器,T1的字源TF1、TR1给了T0,T0工作在方式3,可以当作定时器、计数器用。而如果用T0做波特率发生器,因为T1不能工作在方式3,方式3就没法用了。

     

    3 定时器/计数器得编程和应用

            定时器/计数器的4种工作方式中,方式0与方式1基本相同,只是计数器位数不同。方式0为13位计数器,方式1为16位计数器。由于方式0是为兼容MCS-48而设,且其计数初值计算复杂,所以在实际应用中,一般不用方式0,而采用方式1。

     3.1 方式1的应用

            例1 假设系统时钟频率采用6MHz,要在P1.0上输出1个周期为2ms的方波,如图3-1所示。

                                                                             图 3-1 

            方波的周期用定时器T0来确定,即在T0中设置1个初值,在初值的基础上进行计数,每隔1ms产生1次中断,CPU响应中断后,在中断服务程序中对P1.0引脚信号取反。T0中断入口地址为000BH。为此要做如下几步工作:

          (i)计算初值

                                                          T_{machine}=2\mu s = 2 \times 10 ^{-6}s机器周期 = 2\mu s = 2 \times 10 ^{-6}s

    设:需要装入T0的初值为X,则有:(2^{16} - X) \times 2 \times 10^{-6} = 1 \times 10^{-3}

                                      2^{16} - X = 500 ,       X=65036

           X化为十六进制,即X=FE0CH=1111111000001100B

    所以,T0的初值为:

           TH0=0FEH,    TL0=0CH

          (ii)初始化程序设计

             本例采用定时器中断方式工作。初始化程序包括定时器初始化和中断系统初始化,主要是对寄存器IP、IE、TCON、TMOD的相应位进行正确的设置,并将计数初值送入定时器中。

          (iii)程序设计

             中断服务程序除了完成产生要求的方波这一工作之外,还要注意将计数初值重新装入定时器中,为下一次产生中断作准备。主程序可以完成任何其它工作,一般情况下常常是键盘程序和显示程序。在本例中,由于没有这方面得要求,用一条转至自身的短跳指令来代替主程序。

             按上述要求设计的参考程序如下:

    		ORG  		0000H
    RESET:	AJMP   	  MAIN                                     ;转主程序
                    ORG         000BH                                  ;T0的中断入口
                    AJMP       1T0P                                     ;转T0中断处理程序1T0P
                    ORG         0100H 
    MAIN:   MOV        SP,# 60H                            ;设堆栈指针
                    MOV        TMOD,#01H                     ;设置T0为方式1
                    ACALL     PT0M0                                   ;调用子程序PT0M0
    HERE:   AJMP       HERE                                     ;自身跳转
    PT0M0: MOV       TL0,#0CH                           ;T0中断服务程序,T0重新置初值
                       MOV      TH0,#0FEH
                       SETB     TR0
                       SETB     EA
                       RET
    ITOP:   MOV		TL0,#0CH                               ;T0中断服务子程序,T0置初值
                  MOV        TH0,#0FEH
                  CPL          P1.0                                          ;P1.0的状态取反
                  RETI

              如果CPU不做其它工作,也可以采用查询的方式进行控制,程序要简单的多。

              查询方式的参考程序如下:

    		MOV 		TMOD,#01H                  ; 设置T0为方式1
    		SETB        TR0                                     ; 接通T0
    LOOP: 	MOV   		TH0, #0FEH                      ; T0置初值
                    MOV        TL0, #0CH
    LOOP1: JNB       TF0,  LOOP1                     ; 查询TF0标志是否为1,如为1,说明T0溢出,则往下执行
                     CLR       TR0                                      ; T0溢出,关闭T0
                     CPL       P1.0                                     ; P1.0的状态求反
                     SJMP    LOOP

            由上可见,程序虽然简单,但CPU必须得不断查询TF0标志,不能再做其它工作。

            例2 假设系统时钟为6MHz,编写定时器T0产生1s定时的程序。

            (i)定时器T0工作方式的确定

            因定时时间较长,采用哪一种工作方式合适呢?由前面介绍的定时器的个种工作方式的特性可以计算出:

            由上可见,可选方式1,每隔100ms中断1次,中断10次为1s。

            (ii)计算计数初值

            因为:(2^{16}-X)\times 2\times10^{-6}=10^{-1}

            所以:X=15536=3CB0H

            因此:TH0=3CH,TL0=B0H

            (iii)10次计数的实现

            对于中断10次计数,可使T0工作在计数方式,也可用循环程序得方法实现。本例采用循环程序法。

            (iv)程序设计

            参考程序如下:

    		ORG				0000H
    RESET:   LJMP             MAIN                        ;上电,转主程序入口MAIN
    		ORG                000BH                     ;T0的中断入口
    		LJMP              IT0P                         ;转T0中断处理程序IT0P
    		ORG                1000H  
    MAIN: 	  MOV                SP,#60H                 ;设堆栈指针
                     MOV                B,#0AH                ;设循环次数10次
                     MOV                TMOD,#01H      ;设T0工作在方式1
                     MOV                TL0, #B0H             ;给T0设初值
                     MOV                TH0,#3CH 
                     SETB               TR0                         ;启动T0
                     SETB               ET0                         ;允许T0中断
                     SETB               EA                           ;CPU开放中断
    HERE:    SJMP               HERE                    ;等待中断
    ITOP:     MOV                 TL0, #0B0H        ;T0中断服务子程序,重新给T0装入初值
                    MOV                 TH0, #3CH
                    DJNZ                B, LOOP
                    CLR                   TR0                       ;1s定时时间到,停止T0工作
    LOOP:   RETI                           

    3.2  方式2的应用

            方式2是1个可以自动重新装载初值的8为计数器/定时器。这种工作饭是可以省去用户程序中重新装入初值的指令,并可产生相当精确的定时时间。

             例3 当T0(P3.4)引脚上发生负跳变时,从P1.0引脚上输出1个周期为1ms的方波。如图3-2所示。(假设系统时钟为6MHz)

                                                                                    图 3-2

            (i)工作方式选择

            T0定义为方式1计数器模式,T0初值为0FFFFH,即外部计数输入端T0(P3.4)发生1次负跳变时,计数器T0加1且溢出,溢出标志TF0置1,向CPU发出中断请求。在进入T0中断程序后,把F0标志置1,说明T0引脚生已接收里负跳变信号。T1定义为方式2定时器模式。在T0引脚产生1次负跳变后,启动T1每500us产生1次中断,在中断服务程序中对P1.0引脚信号求反,使P1.0产生周期为1ms的方波。(T0和T1定时器进行合作)

            (ii)计算T1的初值

            设T1的初值为X:

            则

                                          (2^8-X) \times 2 \times 10^{-6} = 5 \times 10^{-4}       

                                         X = 2^8 -250 = 6 =06H

            (iii)程序设计

    		ORG				0000H
    RESET:  LJMP		  MAIN     					;复位入口转主程序
    		ORG				000BH
    		LJMP		   ITOP						 ;转T0中断服务程序
    		ORG				001BH
    		LJMP		   IT1P                       ;转T1中断服务程序
    		ORG    			0100H
    MAIN:   MOV             SP, #60H
    		ACALL		  PT0M2					 ;调用对T0,T1初始化子程序
    LOOP:   MOV             C, F0                      ;T0产生过中断了吗?产生过中断,则F0=1
                    JNC              LOOP                    ;T0没有产生过中断,则跳到LOOP,等待T0中断
                    SETB            TR1                       ;启动T1
                    SETB            ET1                       ;允许T1中断
    HERE:   AJMP           HERE
    PT0M2:MOV             TMOD, #26H      ;对T1,T0初始化,T1为方式2定时器,T0为方式1计数器
                   MOV             TL0, #0FFH         ;T0置初值
                   MOV             TH0, #0FFH
                   SETB           TR0                        ;启动T0
                   SETB           ET0                        ;允许T0中断
                   MOV            TL1, #06H            ;T1置初值
                   MOV            TH1, #06H
                   CLR              F0                           ;把T0已发生中断标志F0清0
                   SETB           EA                           ;CPU开放中断
                   RET
    IT0P:    CLR             TR0                         ;T0中断服务程序,停止T0计数
                   SETB          F0
                   RETI
    IT1P:     CPL            P1.0                         ;T1中断服务程序,P1.0位取反
                   RETI               

            在T1定时中断服务程序IT1P中,由于方式2是初值可以自动重新装载的,省去了T1中断服务程序中重新装入初值06H的指令。       

            例4 例用定时器T1的方式2对外部信号计数,要求每计满100个数,将P1.0引脚信号取反。  

            本例是方式2计数模式的应用举例。

            (i)选择工作方式         

             外部信号由T1(P3.5)引脚输入,每发生1次负跳变计数器加1,每输入100个脉冲,计数器产生溢出中断,在中断服务程序中将P1.0引脚信号取反1次。

              T1工作在方式2的方式控制字位TMOD=60H。不使用T0时,TMOD的低4位可任取,但不能使T0进入方式3,这里取全0。

            (ii)计算T1的初值

                                     X=2^8-100=156=9CH

               因此,TL1的初值为9CH,重装初置寄存器TH1=9CH。

            (iii)程序设计

    			ORG				0000H
    			LJMP			MAIN
                ORG				001BH				;T1中断服务程序入口
    			CPL				 P1.0					;P1.0位取反
                RETI
                ORG				0100H
    MAIN:MOV			TMOD, #60H		;设置T1为方式2计数
    			MOV            TL0, #9CH           ;T0置初值
    			MOV			   TH0, #9CH
    			SETB		   TR1						  ;启动T1
    HERE: AJMP         HERE						

    3.3  方式3的应用

            方式3对T0和T1大不相同。T0工作在方式3时,T1只能工作在方式0、1、2。T0工作在方式3时,TL0和TH0被分成2个独立的8位定时器/计数器。其中,TL0可作为8位的定时器/计数器;而TH0只能作为8位的定时器。

            一般情况下,当定时器T1用作串行口波特率发生器时,T0才设置为方式3。此时,常把定时器T1设置为方式2,用作波特率发生器。

            例5 假设某MCS-51应用系统的2个外部中断源已被占用,设置定时器T1工作在方式2,作波特率发生器用。现要求增加1个外部中断源,并控制P1.0引脚输出1个5kHz的方波。假设系统时钟为6MHz。

            (i)选择工作方式

            由第5章介绍的利用定时器作为外部中断源的思想,设置TL0工作在方式3计数模式,把T0引脚(P3.4)作附加的外部中断输入端,TL0的初值设为0FFH,当检测到T0引脚电平出现负跳变时,TL0溢出,申请中断,这相当于跳沿触发的外部中断源。TH0为8位方式3定时模式,定时控制P1.0输出5kHz的方波信号。如图3-3所示。

                                                                                图 3-3

            (ii)初值计算

           TL0的初值设为0FFH。

           5kHz方波的周期为200​us,因此TH0的定时时间为100​us。TH0初值​计算如下:

                                                                      (2^8-X) \times 2 \times 10^{-6} = 1 \times 10^{-4}

                                                                        X = 2^8 - 100 =156 = 9CH

            (iii)程序设计

            源程序如下:

    				ORG				0000H
    				LJMP		   MAIN
    				ORG				000BH				;T0中断入口
    				LJMP		   TL0INT			   ;跳T0中断服务程序
    				ORG             001BH               ;注意,在T1为方式3时,TH0占用了T1的中断
    				LJMP		   TH0INT             ;跳TH0中断服务程序
    				ORG             0100H
    MAIN:MOV             TMOD, #27H   ;T0为方式3计数,T1为方式2定时
    				MOV			   TL0, #0FFH      ;置TL0初值
    				MOV            TH0, #9CH       ;置TH0初值
    				MOV            TL1, #data1     ;data是根据波特率常数要求来定,见第7章
    				MOV            TH1, #datah    
    				MOV            TCON, #55H     ;允许T0中断
    				MOV            IE, #9FH             ;启动T1
    				                     .
    				                     .
    				                     .
    TL0INT:MOV           TL0, #0FFH        ;TH0中断服务程序,TH0重新装入初值
    				CPL             P1.0                     ;P1.0位取反输出
    				RETI

    3.4 门控制位GATE的应用——测量脉冲宽度

            下面以T1为例,来介绍门控制位GATE1的应用。门控制位GATE1可使定时器/计数器T1的启动计数受\overline{INT1}的控制,当GATE1 = 1,TR1为1时,只有\overline{INT1}引脚输入高电平时,T1才被允许计数,利用GATE1的这个功能,(对于GATE0也是一样,可使T0的启动计数受\overline{INT1}的控制),可测量的控制),可测量\overline{INT1}引脚(P3.3)上正脉冲的宽度(机器周期数),其方法如图3-4所示。

                                                                                图 3-4

            参考程序如下:

    		ORG				0000H
    RESET:  AJMP		  MAIN					;复位入口转主程序
    		ORG				0100H
    MAIN:	MOV			SP, #60H
    		MOV			   TMOD, #90H		;设控制字,T1为方式1定时
    		MOV			   TL1, #00H
    		MOV			   TH1, #00H
    LOOP:   JB				  P3.3, LOOP		  ;设控制字,T1为方式1定时
    		SETB           TR1                        ;如果$\overline{INT1}$为低,启动T1
    LOOP1: JNB            P3.3, LOOP1       ;等待$\overline{INT1}$升高
    LOOP2: JB               P3.3, LOO2          ;等待$\overline{INT1}$降低
    		CLR             TR1                        ;停止T1计数
    		MOV            A, TL1                   ;T1计数值送A
    		【将A中的T1计数值送显示缓冲区并转换成可显示的代码】
    LOOP3: LCALL       DIR				           ;调用显示子程序DIR(略)显示T1计数值
                    AJMP         LOOP3

             执行以上程序,使\overline{INT1}​引脚上出现的正脉冲宽度以机器周期数的形式显示在显示器上。

    展开全文
  • /********************************************** 方法1:延时法 ...描述:T0用于定时,方式1,定时时间50ms,中断方式,定时时间到,TF1=1,利用模拟串口发送字符0x67 ********************************
    /**********************************************
    方法1:延时法
    硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1
    波特率:9600
    描述:T0用于定时,方式1,定时时间50ms,中断方式,定时时间到,TF1=1,利用模拟串口发送字符0x67
    **********************************************/
    #include "reg52.h"
    #define uchar unsigned char
    
    sbit P1_0 = 0x90;
    sbit P1_1 = 0x91;
    sbit P1_2 = 0x92;
    
    #define RXD P1_0
    #define TXD P1_1
    #define WRDYN 44 					//写延时
    #define RDDYN 43 					//读延时
    
    void Delay2cp(unsigned char i);
    
    //往串口写一个字节
    void WByte(uchar input)
    {
    	uchar i=8;
    	TXD=(bit)0;						//发送启始位
    	Delay2cp(39);
    
    	//发送8位数据位
    	while(i--)
    	{
    		TXD=(bit)(input&0x01);      //先传低位
    		Delay2cp(36);
    		input=input>>1;
    	}
    
    	//发送校验位(无)
    	TXD=(bit)1;						//发送结束位
    	Delay2cp(46);
    }
    
    //从串口读一个字节
    uchar RByte(void)
    {
    	uchar Output=0;
    	uchar i=8;
    	uchar temp=RDDYN;
    
    	//发送8位数据位
    	Delay2cp(RDDYN*1.5);			//此处注意,等过起始位
    	while(i--)
    	{
    		Output >>=1;
    		if(RXD) Output   |=0x80;	//先收低位
    		Delay2cp(35);				//(96-26)/2,循环共占用26个指令周
    	}
    
    	while(--temp)					//在指定的时间内搜寻结束位。
    	{
    		Delay2cp(1);
    		if(RXD)break;				//收到结束位便退
    	}
    
    	return Output;
    }
    
    //延时程序*
    void Delay2cp(unsigned char i)
    {
         while(--i);					//刚好两个指令周期。
    }
    
    void main()
    {
    	TMOD=0x01; 						//T0 方式1
    
    	TH0=0x9E;						//50ms初始值
    	TL0=0x58;						//50ms初始值
    
    	TR0=1;							//启用定时器T0
    	
    	ET0=1;							//开定时器T1中断
    	EA=1;							//开总中断
    
    	while(1){;}
    }
    
    void timer0(void) interrupt 1
    {
    	TH0=0x9E;					 	//重新设置定时初值
    	TL0=0x58;	
    
    	WByte(0x67);						//发送字符
    	
    	TF0=0;							//软件清中断标志位
    }

    展开全文
  • #include #include unsigned char flag,a,num,num1;
  • 使用定时器中断0控制LED灯间隔1秒闪烁 定时器介绍; 1.CPu时序的有关知识 ①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。 ②状态周期:2个振荡周期为1个状态周期,用S表示,振荡周期 ...

    实验;使用定时器中断0控制LED灯间隔1秒闪烁
    定时器介绍;
    1.CPu时序的有关知识
    ①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。
    ②状态周期:2个振荡周期为1个状态周期,用S表示,振荡周期 又称S周期或时钟周期。
    ③机器周期:1个机器周期含6个状态周期,12个振荡周期。
    ④指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。
    例如:外接晶振为12MHz时,51单片机相关周期的具体为:
    振荡周期=1/12us;
    状态周期=1/6us;
    机器周期=1us;
    指令周期=1~4us;
    2.学习定时器前需要明白的几点
    ① 51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。
    ② 定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。
    ③51单片机中的定时器/计数器是根据机器内部的时钟或者外部的脉冲信号对寄存器的数据加1.
    有了定时器/计数器处理。CPU转而处理一些复杂的事情,同时可以实现精确定时作用。

    单片机定时器原理
    STC89C5X单片机内有两个可编程的定时器/计数器T0,T1和一个特殊功能定时器T2.定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。它随着计算器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,当加到计算器为全1时,再输入一个脉冲就使计数器回零,,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果是工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。
    (1)51单片机定时/计数器结构
    51单片机定时器//计数器内部结构如下所示

    在这里插入图片描述
    上图中的T0和T1引脚对应的是单片机P3.4和P3.5管脚。51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0,T1的启动和停止及设置溢出标志。
    1.工作方式寄存器TMOD
    工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1,其格式如下:
    在这里插入图片描述
    GATE是门控位,GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响,只要用软件使TCON中的TRO或TR1为1,就可以启动定时/计数器工作;GATE=1时,要用软件使TRO或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚
    为高电平这一条件。
    C/T:定时/计数模式选择位。C/T=0为定时模式;C/T=1为计数模式。
    M1MO:工作方式设置位,定时/计数器有四种工作方式。
    在这里插入图片描述
    2.控制寄存器TCON
    TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:
    在这里插入图片描述
    TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时有硬件自动置TF1为1,。CPU响应中断后TF1由硬件自动清0,T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
    TR1(TCON.6):T1运行控制位,TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
    TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
    TR0(TCON.4):T0运行控制位,其功能与TR1类同。
    (2)定时/计数器的工作方式
    1.方式0
    方式0为13 位计数,由TL0的低5位(高3位未用)和TH0的8位组成。
    TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。其结构图如下所示:

    在这里插入图片描述
    门控位GATE具有特殊的作用,当GATE=0时,经反相后使或门输出为1,此时仅由TR0控制与门的开启,与门输出1时控制开关接通,计数开始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚 信号和TR0共同控制。当TR0=1,外中断引脚 信号的高电平启动计数,外中断引脚信号的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度,计数模式时,计数脉冲是T0引脚上的外部脉冲。计数初值与计数个数的关系为:X=2(13)-N.其中2(13)表示2的13次方。

    方式1
    方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器。其结构图如下所示:

    在这里插入图片描述计数初值与计数个数的关系为:x=2(16)-N.
    3.方式2
    方式2为自动重装初值的8位计数方式。工作方式2特别适合用作较精确的脉冲信号发生器。其结构图如下所示:
    在这里插入图片描述
    计数初值与计数个数的关系为:x=2(8)-N.

    方式3
    方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。工作方式3将T0分成为两个独立的8位计数器TL0和TH0.其结构如下所示:
    在这里插入图片描述
    这几种工作方式中应用较多的是方式1或方式2,定时器宗常常用定时器方式1,串口通信中通常使用方式2;
    定时器配置
    在使用定时器时,应该如何配置使其工作?
    步骤如下:
    ① 对TMOD赋值,以确定T0和T1的工作方式,如果使用定时器0即对T0配置,如果使用定时器1即对T1配置。
    ②根据所要定时的时间计算初值,并将其写入TH0,TL0或TH1,TL1.
    ③如果使用中断,则对EA赋值,开放定时器中断。
    ④使TR0或TR1置位,启动定时/计数器定时或计数
    上述中有一个定时/计数器初值的计算,下面我们来看下如何计算定时/计数器初值。
    机器周期的概念:它是CPU 完成一个基本操作所需要的时间。
    机器周期=1/单片机的时钟频率。51单片机内部时钟频率是外部时钟的12分频,也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频,比如说你用的是12MHZ晶振,那么电片机内部的时钟频率就是12/12MHZ,当你使用12MHZ的外部晶振的时候,机器周期=1/1M=1US.如果我们想定时1Ms的初值是多少呢?1Ms/1us=1000.也就是要计数1000个,初值=65535-1000+1(因为实际上计算器计算到66636(2的16次方)才溢出,所以后面要加1)=64536=FC18H,所以初值即为THx=0XFC,THx=0X18;
    代码/*实验现象,D1小灯循环点亮1秒,熄灭1秒,使用单片机内部定时器可以实现准确延时。
    接线说明:单片机–>led&交通灯模块
    P20–>D1
    */
    #include “reg52.h”
    typedef unsigned int u16;
    typeded unsigned char u8;
    sbit led=P2^0;
    void Timer0Init()
    {
    TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
    TH0=0XFC;
    TL0=0X18;
    ET0=1;
    EA=1;
    TR0=1;
    }
    void main()
    {
    Timer0Init();
    while(1);
    }

    void Timer0() interrupt1
    {
    static u16 i;//申明静态全局变量
    TH0=0XFC;
    TL0=0X18;
    i++;
    if(i==1000)
    {
    i=0;
    led=~led;
    }
    }

    展开全文
  • 14.定时器和计数器

    2020-06-18 11:06:06
    CPU时序的有关知识: 振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加...指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。 外接晶振为12MHz时,51单片机相关周期的具体值为: 振荡周期...

    CPU时序的有关知识:

    振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)该开发板外接12M(频率)晶振提供震荡周期
    状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。
    机器周期:1个机器周期含6个状态周期,12个振荡周期。
    指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。
    外接晶振为12MHz时,51单片机相关周期的具体值为:
    振荡周期=1/12us;
    状态周期=1/6us;
    机器周期=1us;
    指令周期=1~4us;
    51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。
    定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。
    51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。
    有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。
    (之前讲的delay函数不是精确的)

    定时/计数器工作原理:

    定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
    可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。
    在这里插入图片描述
    定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

    工作方式寄存器TMOD:

    工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。
    在这里插入图片描述
    GATE是门控位, GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。(通常我们使GATE=0,不需要涉及到外部中断的引脚)
    C/T :定时/计数模式选择位。C/T =0为定时模式;C/T =1为计数模式。
    M1M0:工作方式设置位。定时/计数器有四种工作方式。
    在这里插入图片描述
    10:通常用来计算频率以及串口通信使用
    一般使用较多为方式1和2

    控制寄存器TCON:

    TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。
    在这里插入图片描述
    TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
    TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
    TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
    TR0(TCON.4):T0运行控制位,其功能与TR1类同。

    定时/计数器的工作方式:

    方式0:
    方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。(注意是TL0的高三位)
    在这里插入图片描述
    定时器模式时有:N=t/ Tcy
    计数初值计算的公式为:X=2^13-N。
    定时器的初值还可以采用计数个数直接取补法获得。
    计数模式时,计数脉冲是T0或T1引脚上的外部脉冲。

    门控位GATE具有特殊的作用。当GATE=0时,经反相后使或门输出为1,此时仅由TR0控制与门的开启,与门输出1时,控制开关接通,计数始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0共同控制。当TR0=1时,外中断引脚信号引脚的高电平启动计数,外中断引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。
    方式1:
    方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。
    在这里插入图片描述
    计数个数与计数初值的关系为:X=2^16-N
    方式2:
    方式2为自动重装初值的8位计数方式。 (不管是TH0还是TL0,一旦计满了,便会重新装载)
    在这里插入图片描述
    计数个数与计数初值的关系为:X=2^8-N
    工作方式2特别适合于用作较精确的脉冲信号发生器。
    方式3:
    方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。
    在这里插入图片描述
    工作方式3将T0分成为两个独立的8位计数器TL0和TH0 。
    初始化程序需要完成的工作:
    1、对TMOD赋值,以确定T0和T1的工作方式。
    2、计算初值,并将其写入TH0、TL0或TH1、TL1。
    3、中断方式时,则对EA赋值,开放定时器中断。(打开总中断和定时器中断)
    4、使TR0或TR1置位,启动定时/计数器定时或计数。
    计数器初值的计算:
    机器周期也就是CPU完成一个基本操作所需要的时间。
    机器周期=1/单片机的时钟频率。
    51单片机内部时钟频率是外部时钟的12分频。也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频。比如说你用的是12MHZ的晶振,那么单片机内部的时钟频率就是12/12MHZ,当你使用12MHZ的外部晶振的时候。机器周期=1/1M=1us。
    而我们定时1ms的初值是多少呢,1ms/1us=1000。也就是要计数1000个数,初值=65535-1000+1=64536=FC18H(16进制)(因为实际上计数器计数到66636才溢出)

    展开全文
  • 因此,TR0(1)称之为运行控制位,可用指令SETB来置位以启动计数器/定时器运行,用指令CLR来关闭定时/计数器的工作,一切尽在自已的掌握中。 定时/计数器的四种工作方式工作方式0当TMOD中的M1,M2设置成0,0时...
  • 方波 方波的占空比固定是50%,即高电平和低电平的时间为1:1;...单片机型号:STC89C52RC,有两个定时器定时器0,定时器1; 相关寄存器 TMOD //待续 #include<reg52.h> #define uint u...
  • 51单片机的定时器与计数器

    千次阅读 2020-05-05 22:45:36
    难的东西学不会是因为简单的知识没学好 基础不牢,地动山摇 1.0 1.0.1定时器 (1)51单片机的定时器是一个内部外设。 (2)定时器相当于CPU的一个“闹钟”。...1.0.3定时器是如何工作的 (1)第一步:...
  • (一)项目任务ü 任务1:用定时方式控制LEDn 子任务1.1 两种定期器...swtich语句认识n 子任务2.2 中断系统的认识n 子任务2.3 采用定时和中断方式驱动按键(二)相关知识点2.1、定时器的基本概念标准的51单片机有T0...
  • T0定时、T1计数,协作定时

    千次阅读 2016-01-25 11:40:06
    MCS—51单片机定时/计数器实验 ...2.用T0作为定时器,T1作为T0溢出的计数器,完成延时2秒和1秒的任务。图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/5ae768514c716359843524b4.html悬赏分:20 -
  • 要求使用定时器0工作方式2,中断实现。 C语言代码: #include "at89x52.h" sbit LED = P1^0; int cnt = 0; void InterruptTimer0_init() { EA = 1; //打开总中断 TMOD = 0x02; //设置 T0 为模式 2 TH0 = ...
  • TCON主要是用于控制定时器启动停止,此外TCON还可以保存T0.T1的溢出和中断标志。当定时器工作在计数方式时,外部事件通过引脚T0(P3.4)和T1(P3.5)输入。 定时计数器的原理: 16位的定时器/计数器实质上就是一个加1...
  • 51单片机——定时计数器

    千次阅读 2019-08-08 08:43:54
    指令周期:完成一条指令所需要的全部时间,以机器周期为单位。 在51单片机中有两组定时计数器,与CPU相互独立,。 工作原理是随机器内部的时钟或者外部脉冲信号对寄存器数据加1,当计数器加到全1时,再加1便会置0...
  • 51单片机定时器/计数器

    千次阅读 多人点赞 2017-04-19 22:00:33
    1.基本概念:89C51有两个计数器T0和T1,每个计数器都是由两个8位的RAM 单元组成的,即每个计数器都是16 位的计数器,最大的计数容量是2的6次方=65536,记住是从0-65535。 定时器的本质也是计数器,只不过定时器的...
  • 定时器实际上也是工作在计数方式下,只是计数的是固定周期的脉冲,由于脉冲周期固定,由计数值可以计算时间,有定时功能。 定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。 AT89C51的定时器/...
  • 80C51定时器中断

    2020-05-04 12:26:03
    来源 《霖锋带你征服嵌入式》 0、CPU时序知识 一个机器周期是12个振荡周期,换算成频率的话,是晶振频率...2)定时器/计数器和单片机的CPU是相互独立的,定时器/计数器的工作过程是自动完成的,不需要CPU参与。...
  • 51单片机之定时器实验

    千次阅读 2019-11-13 21:07:49
    一 、 定时器的原理 1、CPU时序的有关知识 1)振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期) 2)状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。 3...
  • 8051定时/计数器由定时器0(T0)、定时器1(T1)、定时器方式寄存器TMOD和定时器控制寄存器TCON组成。 二、定时的原理——计数周期 当定时/计数器设置为定时工作方式时,计数器对内部机器周期进行计数,每过一个...
  • TR0(1)称之为运行控制位,为1,开关才能合上,计数脉冲才能过来,可用指令SETB和CLR来置位以启动/关闭计数器/定时器。    方式0框图 定时 / 计数器的四种工作方式 方式0 为13位计数器,由TL(1/0)的...
  • 基于单片机定时器/计数器的时钟设计以及计数设计第一部分 前言第二部分 定时器/计数器的原理MCS-51定时器/计数器的结构定时器/计数器相关特殊功能寄存器定时器/计数器工作方式第三部分 定时器/计数器编程方法第四...
  • 51单片机入门教程(5)——定时器中断

    万次阅读 多人点赞 2018-11-25 22:53:58
    51单片机入门教程(5)——定时器中断一、中断的概念二、定时器中断2.1 软件延时的不足2.2 中断寄存器2.2.1 中断允许控制寄存器 IE2.2.2 定时器工作方式寄存器 TMOD2.2.3 定时器控制寄存器 TCON2.2.4 定时器初值...
  • PIC 系列单片机内部配备有数量不等的定时器/计数器模块:例如PIC17CX系列和PIC18CX系列都都配置了4个定时器/计数器模块;而PIC16F87X系列都配置了3个定时器/计数器模块,分别记为TMR0、TMR1和TMR2。 TMR0、TMR1...
  • 《单片机原理及应用》复习提纲

    万次阅读 多人点赞 2015-12-14 10:42:02
    《单片机原理及应用》复习提纲 单片机应用系统的典型结构图 ...1.寻址方式、指令系统 2.典型程序结构 3.中断程序设计 《单片机原理及应用》复习提纲 (2015年) 一.概
  • 定时器控制LED灯闪烁(定时器1)

    千次阅读 2018-05-26 10:10:05
    #include &lt;TIM1.h&gt;void TIM1_Init(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;... //使能定时器1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); TIM_Tim...
  • 【51单片机】定时器/计数器的工作原理和结构 回看下单片机中断系统内部结构: 分析内部中断触发: 先看图 TCON:和外部中断相比少了IT位设置触发方式 :1跳沿触发 0电平触发);此处我的理解是:就好像 ...
  • 蓝桥杯AP15F2K61S2定时器

    千次阅读 2020-08-06 23:47:53
    【蓝桥杯】—{MCU:IAP15F2K61S2}—{定时器}定时器1、简介2、寄存器①TCON (Timer Control-控制寄存器)②TMOD(Timer Mode-工作模式寄存器)③AUXR(Auxiliary Register-辅助寄存器)④INT_CLKO(AUXR2)(外部中断允许和...
  • 数码管显示红绿灯时间,红绿黄三灯分别在25,20,5秒倒计时过程中点亮或者闪烁,使用定时器计时,带有proteus仿真,有详细的注释,使用keil5开发环境,比较综合,适合新手学习51单片机。同时带有proteus仿真,以备...
  • 51 TMOD、TCON设置定时

    千次阅读 2019-11-29 14:15:45
    定时器工作的流程可以按照这个顺序(以51为例用定时器0方式一产生50毫秒的定时) 1、TMOD的低四位是设置定时器0的,高四位是用来设置定时器1的,其中的M0,M1是用来设置定时器工作在哪种方式,GATE一般用不要设置...
  • 1.假定单片机内部定时器T0工作在方式1下,要求从P2.0产生频率为20HZ的方波脉冲信号,已知单片机的晶振频率为12MHZ。 解法:这种题目上来先算由晶振频率得到的机器周期: 三个重要的公式: 所以 步骤1: ...
  • 可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。定时器/计数器的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,175
精华内容 470
关键字:

启动定时器t0的工作指令是