定时器计数器_定时器计数器实验报告总结 - CSDN
精华内容
参与话题
  • 51单片机之定时器/计数器应用实例(方式0、1、2、3)

    万次阅读 多人点赞 2019-05-26 22:19:13
    对于刚接触单片机的同学来说可能会对定时器/计数器的应用很蒙圈,特别是初值的计算和各种定时方式的选择。下面希望能给你带来一个清晰的思路。 定时器:一般用于软件计时,给定时器设置一个时间,时间到了系统停止...
    • 硬件:STC89C52RC
    • 开发工具:Keil uVision4

         对于刚接触单片机的同学来说可能会对定时器/计数器的应用很蒙圈,特别是初值的计算和各种定时方式的选择。下面希望能给你带来一个清晰的思路。

    定时器:一般用于软件计时,给定时器设置一个时间,时间到了系统停止当前的工作跳转到事先定义好的定时器中断函数里,函数里可以做一些周期性的事情。

    计数器:一般用于检测外来脉冲信号,给计数器设置一个次数,次数到了系统停止当前的工作跳转到事先定义好的计数器中断函数里,函数里做相应的事情。

    先说一下相关的寄存器,也可以直接跳过,看后面的实例分析。

    配置定时器或者计数器就是对相应的寄存器进行赋值,下面是相关的寄存器描述: 


    第一部分寄存器:

    对照着上面这一字节的每一位,进一步解析:

    位(符号)

    功能

    TMOD.7 (GATE)

    置1时,只有在脚为高、TR1=1时才可打开定时器/计数器1

    置0时,TR1=1即可打开定时器/计数器1

    TMOD.3 (GATE)

    置1时,只有在脚为高、TR1=1时才可打开定时器/计数器0

    置0时,TR1=1即可打开定时器/计数器0。

    TMOD.6  ( /)

    置1时,用作计数器1(从T1/P3.5脚输入)

    置0时,用作定时器1

    TMOD.2  (/ )

    置1时,用作计数器0(从T0/P3.4脚输入)

    置0时,用作定时器0

    TMOD.5/TMOD.4  (M1、M0)

    定时器/计数器1 选择工作方式

    方式0:M1=0,M0=0 ,13位定时器/计数器

    方式1:M1=0,M0=1 ,16位定时器/计数器

    方式2:M1=1,M0=0 ,8位自动重载定时器

    方式3:M1=1,M0=1 ,定时器/计数器1 此时无效

    TMOD.1/TMOD.0  (M1、M0)

    定时器/计数器0 选择工作方式

    方式0:M1=0,M0=0 ,13位定时器/计数器

    方式1:M1=0,M0=1 ,16位定时器/计数器

    方式2:M1=1,M0=0 ,8位自动重载定时器

    方式3:M1=0,M0=0 ,双8位定时器/计数器

    /*1*/  TMOD|=0x00;  //选择定时器0,工作方式为0,
    
    /*2*/  TMOD|=0x30;  //选择定时器1,工作方式为1
    
    /*3*/  TMOD|=0x40;  //选择计数器1,工作方式为0

    用或运算是为了在给相应位赋值时不会影响无关位。可以试着解读TMOD=0xDA

    第二部分寄存器:

    主要看T开头的,I开头是外部中断,先不管。

    位(符号)

    功能

    TCON.7 (TF1)

    定时器/计数器1溢出标志位。当 T1 被允许计数后T1从初值开始加1计数,最高位产生溢出时,置“1 ”TF1 ,并向 CPU请求中断,当CPU响应时,由硬件清“0 ”TF1 ,TF1也可以由程序查询或清“0 ”。

    TCON.5 (TR1)

    定时器 T1 的运行控制位。该位由软件置位和清零。当 GATE(TMOD.7)=0,TR1=1 时就允许T1开始计数,TR1=0 时禁止 T1 计数。当 GATE(TMOD.7)=1,TR1=1 且 INT1 输入高电平时,才允许 T1 计数。

    TCON.4 (TF0)

    定时器/计数器 0 溢出标志位。当T0被允许计数后T0 从初值开始加 1 计数,最高位产生溢出时,置“1”TF0,并向CPU请求中断,当 CPU 响应时,由硬件清“0”TF0,TF0也可以由程序查询或清“0”。

     

    TCON.3 (TR0)

    定时器 T0 的运行控制位。该位由软件置位和清零。当 GATE(TMOD.3)=0,TR0=1 时就允许T0开始计数,TR1=0 时禁止 T0 计数。当 GATE(TMOD.3)=1,TR0=1 且 INT0 输入高电平时,才允许 T0 计数

    除了TCON、TMOD还有TL0、TH0和TL1、TH1,它们分别是定时器0的Timer寄存器和定时器1的Timer寄存器。这个参数没有单位,不是毫秒或是其他,所以设置定时器的时间要通过一定的计算得来,也就是后面要说的重点部分。

    定时器的应用:

    编写单片机定时器程序的步骤:

    1. 对TMOD赋值,以确定T0和T1的工作方式。
    2. 计算初值,并将初值写入TH0,TL0或TH1,TL1。
    3. 中断方式时,对IE赋值,开放中断。
    4. 使TR0或TR1置位,启动定时器/计数器定时或计数。

    下面以定时器0为例,阐述不同的方式的编程过程。


    方式0:

    #include<reg52.h>
    
    #define uchar unsigned char
    #define uint  unsigned int
    
    sbit led1=P1^0;
    uchar num;
    
    void TIM0init(void)
    {
         TMOD=0x00;            //设置定时器0为工作方式0
         TH0=(8192-5000)/32;   //装入初值,怎么计算,下面分析
         TL0=(8192-5000)%32;    
         EA=1;    //开总中断
         ET0=1;   //开定时器中断
         TR0=1;   //启动定时器0
    }
    /*
    interrupt 0  指明是外部中断0;
    interrupt 1  指明是定时器中断0; 
    interrupt 2  指明是外部中断1;
    interrupt 3  指明是定时器中断1;
    interrupt 4  指明是串行口中断;
    
    函数名字可以随便起,但定时器0的中断号是固定为1的
    */
    void T0_time()  interrupt 1      
    {
         TH0=(8192-5000)/32; //重装初值,如果不重装,中断只触发一次
         TL0=(8192-5000)%32;
         num++;
    }
    						  
    void main()
    {
        TIM0init(); 
        while(1)
        {
    	  if(num==200)     //如果到了200,说明一秒时间到
              {
                 num=0;
    	     led1=~led1;   //让发光管状态取反
    	  }
        }
    }
    

    假设单片机用的晶振是12MHz,上面的中断函数每过5ms会被调用一次,也就是发光管每一秒状态取反一次。那么怎么计算初值以确定TL0和TH0的值呢?

    定时器方式0是指13位定时器,=8192;也就是说,当设置好初值后,系统会在这个初值的隔一个机器周期就会自增1,当累加到8192的时候溢出,然后触发中断。所以(8192-初值)*机器周期=定时器产生一次中断的时间。

    如果我们要设定的定时器产生一次中断的时间为5ms,那么:

                                                     机器周期=12*(1/12MHz)=1μs

                                                     初值=(8192-5ms/1μs)=3192

    13位定时器中,TH0整个 8 位全用,TL0只用低 5 位参与分频。

    TH0

    bit7

    bit6

    bit5

    bit4

    bit3

    bit2

    bit1

    bit0

    TL0

    bit7

    bit6

    bit5

    bit4

    bit3

    bit2

    bit1

    bit0

    因:3192=“110001111000”

    所以TH0=“1100011”,TL0=“11000”

    即TH0=(8192-5000)/32,TL0=(8192-5000)%32

    如果用的是11.0592MHz的晶振,机器周期就不是整数了,12*(1/11059200)≈1.0851μs.

    关于机器周期:

    方式0跟方式1差不多的,不同的是方式1中TH0、TL0所有位全用。两个字节,=65536.


    方式2:

       在定时器的方式0和方式1中,当计数溢出后,计数器变为0,因此在循环定时或循环计数时必须用软件反复设置计数初值,这必然会影响到定时的精度,同时也给程序设计带来很多麻烦。

         方式2被称为8位初值自动重装的8位定时器/计数器,TL(0/1)从初值开始计数,当溢出时,在溢出标志TF(0/1)置1的同时,自动将TH(0/1)中的常数重新装入TL(0/1)中,使TL(0/1)从初值开始重新计数,这样避免了认为软件重新装初值所带来的时间误差,从而提高了定时的精度。

    #include<reg52.h>
    
    #define uchar unsigned char
    #define uint  unsigned int
    
    sbit led1=P1^0;
    uint num;
    
    void TIM0init(void)
    {
         TMOD=0x02;    //设置定时器0为工作方式2
         TH0=6;   //装入初值
         TL0=6;    
         EA=1;    //开总中断
         ET0=1;   //开定时器中断
         TR0=1;   //启动定时器0
    }
    
    void T0_time()  interrupt 1      
    {
         //相比上面的方式0,这里不需要认为加入重装初值的代码
         num++;
    }
    						  
    void main()
    {
        TIM0init(); 
        while(1)
        {
    	  if(num==4000)     //如果到了4000,说明1秒时间到
              {
                 num=0;
    	     led1=~led1;   //让发光管状态取反
    	  }
        }
    }
    

        这个也是基于12MHz的振荡频率,TL0跟TL1必然是相同的,计算初值的方法跟上面一样。方式2为8位定时器/计数器,最多能装载=256个,相对方式0的13位和方式1的16位的少。方式2经历256个机器周期该计数器就会溢出。

        还有一个值得注意的是num变量的类型变了,因为4000已经超出了uchar的方位,所以改为uint。


    方式3:

         当选择方式3时,定时器T0就会被分成两个独立的计数器或者定时器。此时,TL0为8位计数器,计数溢出好置位TF0,并向CPU申请中断,之后需要软件重装初值; TH0也被固定为8位计数器,不过TL0已经占用了TF0和TR0,因此TH0将占T1的中断请求标志TF1和定时器启动控制为TR1。

         为了防止中断冲突,定时器T0在方式3时,T1不能产生中断,但可以正常工作在方式0、1、2下。通常这种情况下T1将用作串行口的波特率发生器。

    下面的例子是利用定时器方式3,TL0计数器对应的8位定时器实现第一个发光管以1s亮灭闪烁,用TH0计数器对应的8位定时器实现第二个发光管以0.5s亮灭闪烁。

    #include<reg52.h>
    
    #define uchar unsigned char
    #define uint  unsigned int
    
    sbit led1=P1^0;
    sbit led2=P1^1;
    uint num1,num2;
    
    void TIMEinit(void)
    {
         TMOD=0x03;  //设置定时器0为工作方式3	
         TH0=6;      //装初值
         TL0=6;
         EA=1;	 //开总中断
         ET0=1;      //开定时器0中断
         ET1=1;      //开定时器1中断
         TR0=1;	 //启动定时器0
         TR1=1;	 //启动定时器0的高8位计数器
    }
    
    void TL0_time()  interrupt 1
    {
         TL0=6;  //重装初值
         num1++;
    }
    
    void TH0_time()  interrupt 3  //占用T1定时器的中断号
    {
         TH0=6;  //重装初值
         num2++;
    }
    						  
    void main()
    {
         TIMEinit();
         while(1)
         {
    	 if(num1>=4000)  //12*(1/12MHz)*(256-6)*4000=1s
             {						  
    	     num1=0;
    	     led1=~led1;
    	 }
             if(num2>=2000)  //12*(1/12MHz)*(256-6)*2000=0.5s
             {
    	     num2=0;
    	     led2=~led2 ;
             } 
        }
    }

    这里的num1>=4000而不是num1==4000,是为了稳妥起见,万一定时器计数超过了4000,而主循环还没来得及判断,则会错过4000.那led1就不能实现取反了。

     

    仅供参考,错误之处以及不足之处还望多多指教。

    展开全文
  • 定时器/计数器

    千次阅读 2019-01-12 22:18:47
    定时器/计数器 定时器/计数器 和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。 工作原理 定时器/计数器 实质上是一个 加1计数器。它随着计数器的输入脉冲进行加1,当...

    *觉得有用有帮助的评论下,谢谢~

    定时器/计数器

    • 定时器/计数器 和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。

    工作原理

    • 定时器/计数器 实质上是一个 加1计数器。它随着计数器的输入脉冲进行加1,当计数器发生溢出时,则向CPU发出中断请求,如果是定时模式,则表示定时时间已到,计数模式,则表示所计数值已满。

    结构

    它由高8位和低8位两个寄存器THxTLx 组成。

    TMOD是定时器/计数器的工作方式寄存器,即控制它的工作方式。

    TCON是控制T0/T1的启动停止设置溢出标志

    控制

    • 两个特殊功能寄存器

    1、工作方式寄存器TMOD

    注:TOMD不可位寻址

    • ①GATE :门控位,GATE=0 时,只需要TR0/TR11,就可使定时器/计数器工作;GATE=1 时,不仅要满足TR0/TR11 ,同时还需外部中断引脚 INT0/1 也为高电平,才能启动定时器/计数器工作。
    • ②C/T :定时/计数模式选择位。C/T=0 为定时模式;C/T=1 为计数模式。
    • ③M0M1 :工作方式设置位。
    M1M0 工作方式 功能说明
    00 方式0 兼容8048单片机的13位定时器,THx的8位和TLx的5位组成一个13位定时器。
    01 方式1 THx和TLx组成的一个16位定时器/计数器
    10 方式2 自动重装初值的8位定时器/计数器
    10 方式3 定时器0:分成两个8位定时器/计数器。
    定时器1:停止计数

    2、控制寄存器TCON

    • 这些位在上次的中断系统中有写

    工作方式

    1、方式0

    • 由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。

    • 这个模式51单片机一般很少用

    2、方式1

    由TL0作为低8位,TH0作为高8位,组成了16位加1计数器

    计数范围是0~65535 ,溢出后,只要不重新赋值,则从0开始计数

    3、方式2

    • 只有TLx做加1计数,计数范围是0~255 ,THx的值并不发生变化,而是保持原值,TLx溢出后,TFx就直接置1了,并且THx原先的值直接赋给TLx,然后TLx从新赋值的这个数字开始计数。(该功能可以用来产生串口的通信波特率,即适合做脉冲信号发生器)

    4、方式3

    • 只适用于定时器/计数器T0,定时器T1处于方式3相当于TR1=0 ,停止计数

    使用

    • 设置特殊功能寄存器TMOD,配置好工作模式
    • 设置计数寄存器THx和TLx的初值(初值之类的直接用软件计算吧)
    • 设置TCON,通过TRx置1来让定时器开始计数,还有中断开关EAETx
    • 判断TCON寄存器的TFx位,监测定时器溢出情况。

    定时器0程序

    #include "reg52.h"
    
    typedef unsigned int u16;
    
    sbit led=P2^0;	 //定义P20口是led
    
    void Timer0Init()
    {
    	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。(不影响其它位)TMOD=TMOD|0X01
    	TH0=0XFC;	//给定时器赋初值,定时1ms
    	TL0=0X18;	
    	ET0=1;//打开定时器0中断允许
    	EA=1;//打开总中断
    	TR0=1;//打开定时器			
    }
    
    void main()
    {	
    	Timer0Init();  //定时器0初始化
    	while(1);		
    }
    
    void Timer0() interrupt 1   //定时器0中断程序
    {
    	static u16 i;//设置一个静态全局变量
    	TH0=0XFC;	//给定时器赋初值,定时1ms
    	TL0=0X18;
    	i++;
    	if(i==1000)
    	{
    		i=0;
    		led=~led;	
    	}	
    }
    
    • 在51单片机中,应用较多的是方式1方式2,而要注意到是方式1在使用时,一定要记得重装初值 ,我刚开始时就是忘记重装初值,程序的效果老是不对

    完成~

    展开全文
  • 51单片机中断系统(定时器计数器

    万次阅读 多人点赞 2017-11-21 00:17:12
    一、中断 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 (*以上解释来自于百度百科-中断) ...

    *部分内容来源于网络


    一、中断

    中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。


    (*以上解释来自于百度百科-中断)

     

    二、51单片机中断级别

    中断号

    优先级

    中断源

    中断入口地址

    0

    1(最高)

    INT0

    外部中断0

    0003H

    1

    2

    T0

    定时器/计数器0中断

    000BH

    2

    3

    INT1

    外部中断1

    0013H

    3

    4

    T1

    定时器/计数器1中断

    0018H

    4

    5(最低)

    TX/RX

    串行口中断

    0023H

     

     

    三、中断结构图


    四、中断寄存器

    1、 中断允许控制寄存器IE

    位地址

    AFH

    AEH

    ADH

    ACH

    ABH

    AAH

    A9H

    A8H

    位序号

    7

    6

    5

    4

    3

    2

    1

    0

    位名称

    EA

    -

    -

    ES

    ET1

    EX1

    ET0

    EX0

    EX0/EX1:外部中断允许控制位

            EX0=1 外部中断0开关闭合     //开外部0中断

            EX0=0 外部中断0开关断开

    ET0/ET1:定时中断允许控制位

            ET0=1 定时器中断0开关闭合   //开内部中断0

            ET0=0 定时器中断0开关断开

    ES:串口中断允许控制位    

            ES=1 串口中断开关闭合         //开串口中断

            ES=0 串口中断开关断开

     

    2、 定时器控制寄存器TCON

    位地址

    8FH

    8EH

    8DH

    8CH

    8BH

    8AH

    89H

    88H

    位序号

    7

    6

    5

    4

    3

    2

    1

    0

    位名称

    TF1

    TR1

    TF0

    TR0

    IE1

    IT1

    IE0

    IT0

           外部中断:

               IE0/IE1:外部中断请求标志位

                       当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1,

                       CPU开始响应,处理中断,而当入中断程序后由单片机自动置0.

               IT0/IT1:外部中断触发方式控制位          //选择有效信号

                       IT0/IT1=1:脉冲触发方式,下降沿有效。

                       IT0/IT1=0:电平触发方式,低电平有效。

           内部中断:

               TF0/TF1:内部定时器/计数器溢出中断标志位

                        当定时器、计数器计数溢出的时候,此位由单片机自动置1,

                        cup开始响应,处理中断,而当进入中断程序后由单片机自动置0.

                        //内部中断实际上就是利用内部的计数器,

                          只不过提供计数的脉冲来自单片机自身。

               TR0(TR1):定时器/计数器启动位                    //启动定时器

                       TR0/TR1=1;启动定时器/计数器0

                       TR0/TR1=0;关闭定时器/计数器0

     

    3、 串口控制寄存器SCON

    位地址

    9FH

    9EH

    9DH

    9CH

    9BH

    9AH

    99H

    98H

    位序号

    7

    6

    5

    4

    3

    2

    1

    0

    位名称

    SM0

    SM1

    SM2

    REN

    TB8

    RB8

    TI

    RI

          TI:串行口发送中断标志位

               当单片机串口发送完一帧数据后,此位由单片机自动置1,

               而当进入中断服务程序后是不会自动清0的,

               必须由用户在中断服务中用软件清0.

           RI:串行口接收中断标志位

               当单片机串口接收完一帧数据后,此位由单片机自动置1,

               而当进入中断服务程序后是不会自动清0的,

               必须由用户在中断服务软件中用软件清0.

    4、 中断优先控制寄存器IP

    位序号

     7 

     6 

     5 

    4

    3

    2

    1

    0

    位名称

    -

    -

    -

    PS

    PT1

    PX1

    PT0

    PX0

           PS---串行口中断优先级控制位。

               PS=1,串行口中断定义为高优先级中断。

               PS=0,串行口中断定义为低优先级中断。

           PT1---定时器/计数器1中断优先级控制位。

               PT1=1,定时器/计数器1中断定义为高优先级中断。

               PT1=0,定时器/计数器1中断定义为低优先级中断。

           PX1---外部中断1中断优先级控制位。

               PX1=1,外部中断1中断定义为高优先级中断。

               PX1=0,外部中断1中断定义为低优先级中断。

           PT0---定时器/计数器0中断优先级控制位。

               PT0=1,定时器/计数器0中断定义为高优先级中断。

               PT0=0,定时器/计数器0中断定义为低优先级中断。

           PX0---外部中断0中断优先级控制位。

               PX0=1,外部中断0中断定义为高优先级中断。

               PX0=0,外部中断0中断定义为低优先级中断。

     

    5、 定时器工作方式控制寄存器TMOD

    位序号

    7

    6

    5

    4

    3

    2

    1

    0

    定时器

    定时器/计数器1(ET1)

    定时器/计数器0(ET0)

    位名称

    GATE

    C/T

    M1

    MO

    GATE

    C/T

    M1

    M0

            GATE——门控制。   

                 GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。   

                       当INT0引脚为高电平时TR0置位,启动定时器T0;   

                       当INT1引脚为高电平时TR1置位,启动定时器T1。   

                 GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。

            C/T——功能选择位   

                 C/T=0时为定时功能,

                 C/T=1时为计数功能。    

            M0、M1——方式选择功能

    M1

    M0

    工作方式

    功  能

    0

    0

    工作方式0

    13位计数器

    0

    1

    工作方式1

    16位计数器

    1

    0

    工作方式2

    自动再装入8位计数器

    1

    1

    工作方式3

    定时器0:分成两个8位计数器

    定时器1:停止计数

     

    6、 定时器初值赋予寄存器(TH0/TH1,TL0/TL1)

     

    五、定时器、计数器

    1、 工作方式




    2、 定时器初值计算

    1.计数器初值的计算

       设计数器的最大计数值为M(根据不同工作方式,M可以是2^13、2^16或2^8),则计算初值X的公式如下:

                        X=M-要求的计数值

    2.定时器初值的计算

       在定时器模式下,计数器由单片机主脉冲fosc经12分频后计数。因此,定时器定时初值计算公式:

                        X=M-(要求的定时值)/(12/fosc)

       式中,M为定时器模值(根据不同工作方式,M可以是213、216或28)

     

    关于如何确定定时器T0的初值问题。定时器一但启动,它便在原来的数值上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为12MHz,12个时钟周期为一个机器周期,那么此时机器周期为1us,记满TH0和TL0就需要216 -1个数,再来一个脉冲计数器溢出,随即向CPU申请中断。因此溢出一次共需65536us,约等于65.6ms,如果我们要定时50ms的话,那么就需要先给TH0和TL0装一个初值,在这个初值的基础上记50000个数后,定时器溢出,此时刚好就是50ms中断一次,当需要定时1s时,我们写程序时当产生20次50ms的定时器中断后便认为是1s,这样便可精确控制定时时间啦。要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536.,把15536对256求模:15536/256=60装入TH0中,把15536对256求余:15536/256=176装入TL0中。

    以上就是定时器初值的计算法,总结后得出如下结论:当用定时器的方式1时,设机器周期为TCY,定时器产生一次中断的时间为t,那么需要计数的个数为N=t/TCY ,装入THX和TLX中的数分别为:

    THX=(65536-N)/256    ,     TLX=(65536-N)%256 

     

    设置为计数器模式时,外部计数脉冲由T0或T1引脚输入到计数器。在每个机器周期S5P2期间采样T0,T1引脚电平,当某周期采样到一高电平输入,而下一周期又采样到一低电平时,则计时器加1,更新的计数值在下一个机器周期的S3P1期间装入计数器。由于检测一个从1到0的下降沿需要两个机器周期,因此要求被采样的电平至少维持一个机器周期。当晶振频率位12MHz时,最高计数频率不超过1/2MHz,即技术脉冲的周期要大于2us。



    补充,

    定时计数器2: MCS-52单片机新增的定时计数器。

    特点:

          --16位定时计数器

          --具有捕捉、自动重装、波特率发生器3种工作模式

          --可作为编程时钟发生器

    寄存器:

          T2CON-定时器2控制寄存器

          T2MOD定时器2方式寄存器

          TH2,TL2定时计数寄存器

          RCAP2H,RCAP2L-捕获/重装寄存器

    引脚:

          T2(P1.0):定时器2外部时钟输入/时钟输出

          T2EXP(P1.1):定时器2重装/捕获/方向控制


    IE, IP, IPH中有定时器2的中断允许,终端优先控制位。


    T2CON 寄存器

    地址:0C8H 复位值:00000000B

    7

    6

    5

    4

    3

    2

    1

    0

    TF2

    EXF2

    RCLK

    TCLK

    EXEN2

    TR2

    C/T2

    CP/RL2

     

    符号

    功能

    T2CON.7

    TF2

    定时器2溢出标志位。

    RCLK或TCLK=1时不置位。

    T2CON.6

    EXF2

    定时器2外部标志。

    当EXEN2=1时,T2EX的负跳变产生捕获或重装时,EXF2=1.

    T2CON.5

    RCLK

    接受时钟标志

    T2CON.4

    TCLK

    发送时钟标志

    T2CON.3

    EXEN2

    定时器2外部使能标志。

    T2CON.2

    TR2

    定时器2启动/停止控制位。0停止,1启动。

    T2CON.1

    C/T2

    定时器计数器选择:0定时,1计数。

    T2CON.0

    CP/RL2

    捕获重装标志,1捕获,0重装。

    定时器2可以产生2个中断请求信号,分别是TF2和EXF2,这2中断请求信号通过逻辑“或”的关系共享一个终端请求通道。

    定时器2溢出时,TF2置1,向CPU申请中断。若在定时器2工作在重装模式时候,使RCAP2H,RCAP2L的值自动装入TH2,TL2。

    当EXEN2=1时,T2EX引脚的负跳变使EX2F置1,这个信号除了向CPU申请中断外,根据定时器2的工作方式,还有2个作用:一是将TH2,TL2的值装入RCAP2H,RCAP2L,称为捕获;二是将RCAP2H,RCAP2L的值装入TH2,TL2,称为重装。

    TF2,EXF2必须由软件清除。

    RCLK:当该位置1时,定时器2做串口接受波特率发生器,即接受时钟。否则使用定时器1做波特率发生器。

    TCLK:当该位置1时,定时2做串口波特率发生器,即发送时钟。否则使用定时器1做波特率发生器。

    TR2:置1时允许T2计数,置0时禁止T2计数

    C/T2:置1时定时器2对T2引脚输入的脉冲计数。置0时定时器2对内部震荡信号的12分频或6分频计数。

    CP/RL2:捕获/重装标志,置1时捕获,置0时重装。当定时器2做波特率发生器时,强制自动重装,不管该位状态。

    捕获模式:



    CKCON的X2位控制内部振荡信号是12分频还是6分频。

    T2CON的C/T2位控制T2对内部脉冲计数还是对外部脉冲计数。

    T2CON的TR2位启动或停止计数

    T2CON的CP/RL位置1,使T2工作在捕获模式

    T2CON的EXEN2置1,连接T2EX引脚到捕获控制端。

    在T2EX引脚的负跳变时刻,使TH2的值捕获到RCAP2H,TL2的值捕获到RCAP2L,同时使T2CON的EXF2置1,向CPU申请中断。

    当T2溢出时,T2CON的TF2置1向CPU申请中断。

    捕获方式可以用来测量外部脉冲的周期。

     

    自动重装模式

    自动重装模式下定时器的初值由硬件自动恢复。这个特性降低了软件开销。

    T2的工作在自动重装模式时计数方向可变,即定时器2即可工作在增量式计数方式,也可工作在减量式计数方式。计数方式的选择由T2MOD寄存器的DCEN位控制使能,由T2EX引脚控制计数方向。

    定时器2也可以在T2(P1.0)引脚输出可编程时钟。

    通过配置T2MOD寄存器选择以上功能。

     

    T2MOD寄存器

    地址0C9H   复位值:XXXXXX00B

    7

    6

    5

    4

    3

    2

    1

    0

    -

    -

    -

    -

    -

    -

    T2OE

    DCEN

     

    符号

    功能

    T2CON.1

    T2OE

    定时器2输出使能

    T2CON.0

    DCEN

    向下计数使能位,置1使能。

    其他不用的位在编程时不要置1.

     

    自动重装载模式


     

    自动重装模式(DCEN=0)说明

    CKCON的X2位控制内部振荡信号是12分频还是6分频。

    T2CON的C/T2位控制T2对内部脉冲计数还是对外部脉冲计数。

    T2CON的TR2位启动或停止计数

    T2CON的CP/RL位置0,使T2工作在自动重装模式

    T2CON的EXEN2置1,连接T2EX引脚到重装控制端。

    在T2EX引脚的负跳变时刻,使RCAP2H 的值重装到TH2 , RCAP2L 的值重装到TL2 ,同时使T2CON的EXF2置1,向CPU申请中断。

    当T2溢出时,T2CON的TF2置1,使RCAP2H 的值重装到TH2 , RCAP2L 的值重装到TL2 ,同时向CPU申请中断。

    在DCEN=0时,定时器2增量式计数。

     

    自动重装模式(DCEN=1)

    自动重装模式(DCEN=1)说明

    CKCON的X2位控制内部振荡信号是12分频还是6分频。

    T2CON的C/T2位控制T2对内部脉冲计数还是对外部脉冲计数。

    T2CON的TR2位启动或停止计数

    T2CON的CP/RL位置0,使T2工作在自动重装模式

    T2CON的EXEN2置1,连接T2EX引脚到重装控制端。

    在定时器2溢出时,自动装入初值。

    当T2EX=0时,定时器2减量方式计数,FFH自动装入TH2和TL2。

    当T2EX=1时,定时器2增量方式计数,RCAP2H自动装入TH2,RCAP2L自动装入TL2。

     

     

    波特率发生器模式

    当T2CON的RCLK=1,或TCLK=1,或RCLK=TCLK=1时,定时器2做波特率发生器。

    这时定时器2强制自动重装。

    T2CON的C/T2=0时,定时器2对内部振荡脉冲的2分频计数。

    T2CON的TR2位启动或停止T2计数

    定时器2溢出时不向CPU申请中断,溢出信号16分频后做串口的发送或接收时钟。由RCLK,TCLK的状态决定。

    当T2CON的EXEB2=1时,T2EX引脚可做为外部中断源,该引脚的负跳变使EXF2=1向CPU申请中断

     

     

    可编程时钟输出

    通过对定时器2的设置,可在T2(P10)引脚上输出频率可编程的时钟脉冲。

    T2CON的设置

    RCLK=TCLK=0

    C/T2=0

    CP/RL=0

    TMOD2的T2OE=1

    RCAPH2,RCAPL2的值控制输出时钟频率。

    输出时钟频率=

    振荡器频率/4*[65536-(RCAP2H,RCAP2H)]



    展开全文
  • 定时器+计数器

    2019-07-06 15:20:18
    定时器(Timer)+计数器(Counter):=&gt;{Int0Int1=&gt;\begin{cases} Int0\\ Int1 \end{cases}=>{Int0Int1​ 晶振频率:f=12MHZ/11.0592MHZf=12MHZ/11.0592MHZf=12MHZ/11.0592MHZ 计数频率:fT=f/12f_...

    定时器(Timer)+计数器(Counter):=&gt;{Int0Int1=&gt;\begin{cases} Int0\\ Int1 \end{cases}
    晶振频率:f=12MHZ/11.0592MHZf=12MHZ/11.0592MHZ
    计数频率:fT=f/12f_T=f/12  (12)(12分频)</font3
    机器周期:T=1/fTT=1/f_T  (12)(12分频)



    寄存器配置:TMOD()&amp;TCONTMOD(工作方式寄存器)\&amp;TCON(控制寄存器)
    工作模式:T/CT {/} C
    工作方式:401234种(方式0、方式1、方式2、方式3)
    在这里插入图片描述
    TMOD:/\vec 用于选择定时器/计数器的工作方式与工作模式(不可位寻址)


    1GATE(1)GATE---门控位
    GATE=0时,仅由TRX(X=0,1)=1启动定时器/计数器
    GATE=1时,由TRX(X=0,1)=1和外部中断引脚上的高电平共同启动定时器/计数器(一般默认使用GATE=0)
    2M1M0(2)M_1、M_0---工作方式选择位
    在这里插入图片描述
    3C/T(3)C/T---计数器模式和定时器模式选择位
    C/T=0时,定时器模式
    C/T=1时,计数器模式,计数器对外部输入引脚T0(p3.4)或T1(p3.5)的外部脉冲计数。
    TCON:低四位与外部中断有关(可位寻址)

    TF1、TF0—T1、T0计数溢出标志位
    当计数器计数溢出时,该位置置1。使用查询方式时,此位作为状态位供cpu查询,ps:查询该位有效后以软件方法清零。使用中断方式时,此位作为中断标志位,进入中断服务程序后硬件自动清零。
    TR1、TR0—计数运行控制位
    TR1位/TR0位=1时,启动定时器/计数器,但是还与GATE位的状态有关。
    TR1位/TR0位=0时,停止定时器/计数器。


    写程序的流程
    1、开头定义 void Timer0_Init()
    2、写void Timer0_Init() 里面的函数{TMODTH0TL0ET0(EA)(TR0)\begin{cases}定义TMOD、算出初值并且给TH0和TL0赋值\\ 打开定时器中断允许开关(ET0)、打开总中断开关(EA)、打开定时器 (TR0)\end{cases}
    3、写出void Timer0()interrupt 1函数{TH0/TL0ifiLED= LED\begin{cases} 赋值静态变量\\ TH0/TL0赋值 \\ if条件语句来增加次数(注意给i归零,LED=~LED) \end{cases}
    4、主程序引用Timer0_Init();

    展开全文
  • 什么是定时器计数器

    千次阅读 2017-11-29 14:05:37
    什么是定时器计数器及使用
  • 定时器计数器

    千次阅读 2016-08-21 21:34:02
    定时器计数器在计算机系统中,尤其是工业控制系统中有着重要的作用。定时器计数器的差别仅限于用途不同。定时器从本质上来讲其实就是一个计数器,每收到一个脉冲,计数器就会加/减1,如果脉冲的周期固定,那么...
  • 定时器计数器

    千次阅读 2018-01-12 10:50:03
    1 定时器介绍 1.1 什么是定时器 (1)SoC的一种内部外设。 (2)定时器就是CPU的“闹钟”。 1.2 什么是计数器 (1)定时器就是用计数的原始实现的。 (2)计数器可以计算外部脉冲个数。 1.3 定时器如何工作 (1...
  • PLC 定时器/计数器的使用(实验二)

    千次阅读 2017-03-31 11:56:26
    PLC 定时器/计数器的使用(实验二)
  • ——高级定时器、通用定时器、基本定时器的区别   TIM1和TIM8定时器的功能包括【增强型】: ● 16位向上、向下、向上/下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535...
  • TMOD:定时器/计数器模式控制寄存器

    千次阅读 2013-03-27 09:28:10
    TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER) 定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 其格式为:  TMOD结构图 ...
  • 8051定时器的使用

    千次阅读 2014-01-16 11:04:12
    8051定时器/计数器介绍: 8051有两个定时器/计数器,而8052则有三个定时器/计数器定时器计数器本质都是一样的,定时器通过对内部脉冲进行计数来达到计时的目的,而计数器是对外部输入脉冲进行计数,所以它们的...
  • 定时器系统是单片机内部一个独立硬件部分,与CPU和晶振之间通过内部某些控制线连接并相互作用,CPU一旦启动定时功能,定时器便会在晶振的作用下自动计时,当定时器计数器积满之后就会产生中断,通知CPU接下来做什么...
  • STM32 定时器计数器 更新事件

    千次阅读 2017-10-03 12:54:48
    向上计数模式 在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。 如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,...
  • 一、MCS-51单片机的定时器/计数器概念 单片机中的定时器计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,...
  • 51单片机:定时器/计数器TMOD设定

    千次阅读 多人点赞 2019-06-11 11:28:55
    定时器/计数器TMOD设定 TMOD格式 上图为TMOD格式,8位分为两组,高四位控制T1,低四位控制T0 TMOD各位的说明 GATE 0:仅由运行控制位TRx(x = 0,1)来控制定时器/计数器运行。 1:用外中断引脚( INT0或 INT1)...
  • 三菱PlC计数器与定时的使用

    千次阅读 2017-04-03 11:29:16
    在学习三菱PLC指令时,往往会把数字电路技术中的定时器和计时器跟三菱PLC中计数器定时器对应起来,这样很容易造成在利用三菱PLC计数器指令和定时器指令出现问题。
  • 下面是具体细节TIM1和TIM8定时器的功能包括【增强型】:● 16位向上、向下、向上/下自动装载计数器● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值● 多达4个独立通道: ─...
  • 之前分享了STM32 GPIO的原理、特性、选型和配置、如何计算RTC时钟异步预分频和同步预分频,这次简要阐述STM32L011微控制器定时器的参数配置(其他型号大同小异,本文侧重讲解配置,至于各类定时器的特点后续再述),...
  • 单片机 定时器/计数器

    千次阅读 2019-01-10 14:32:48
    单片机 定时器/计数器 一、简述  MCS—51系列单片机内部有两个16位定时器/计数器,即定时器T0和定时器T1。它们都具有定时和计数功能,可用于定时或延时控制,对外部事件进行检测、计数等。  定时器/计数器是一...
  • 1.TMOD定时器/计数器工作方式寄存器 GATE=1时,定时器由INT和TR共同控制,用于测量脉宽; 2.TCON定时器/计数器控制寄存器 3.   2.应用示例: 2.1T0/T1控制外部引脚输出方波 1.设计思路:设置定时...
1 2 3 4 5 ... 20
收藏数 27,093
精华内容 10,837
关键字:

定时器计数器