单片机定时器0定时1s_51单片机定时器定时1s原理 - CSDN
  • #include unsigned char i;... TR0=1; ET0=1; EA=1; P0_3=1; while(1) {}; } timer0() interrupt 1 { TH0=0X00; TL0=0X06; i++; if(i==10) { i=0; P0_3=0; } else P0_3=1; }

    #include   <AT89X51.H>
    unsigned char i=0,j=0;

    void main()
    {
     TMOD=0X01;
     TH0=0X4c;
     TL0=0X00;
     TR0=1;
    ET0=1;
    EA=1;
    P0_3=1;

     while(1)
       {};
    }

    timer0() interrupt 1
    {
     TR0=0;
     TH0=0X4c;//5000us
     TL0=0X00;
     i++;
     if(i>=20)
       {
       i==0;
       j++;
       if(j>=20)
        {
      j=0;
       P0_3= ~P0_3;
     }

       }
     TR0=1;
    }

    //注意此处必须用两个变量i,否则程序不会通过。

    展开全文
  • 定时器0工作方式2,定时1s

    千次阅读 2017-01-11 12:27:02
    定时器0工作方式2,定时1s

    这里写图片描述

    定时器0工作方式2,定时1s

    展开全文
  • 51单片机定时器/计数器应用实例(方式01、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就不能实现取反了。

     

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

    展开全文
  • 由此可得知周期为1s的方波就是高电平占0.5s,低电平占0.5s的波形; 单片机定时器 单片机型号:STC89C52RC,有两个定时器,定时器0,定时器1; 相关寄存器 TMOD //待续 #include<reg52.h> #define uint ...

    方波
    方波的占空比固定是50%,即高电平和低电平的时间为1:1
    方波的周期:从一个上升沿(下降沿)到下一个上升沿(下降沿)的时间;
    由此可得知周期为1s的方波就是高电平占0.5s,低电平占0.5s的波形

    单片机定时器
    MCS-51有两个定时器,定时器0,定时器1
    相关寄存器
    TMOD

    D7 D6 D5 D4 D3 D2 D1 D0
    GATE C/T(非) M1 M0 GATE C/T(非) M1 M0

    D7-D4控制定时器1,D3-D0控制定时器0

    GATE:门控制位
    GATE=0::由TR0,TR1置位分别启动定时器T0、T1
    GATE=1:由外部中断引脚INT0、INT1来启动定时器T0、T1
    当INT0引脚为高电平时TR0置位,启动定时器T0;
    当INT1引脚为高电平时TR1置位,启动定时器T1;
    C/T(非):功能选择位
    C/T(非)=0:定时功能
    C/T(非)=1:计数功能
    M1,M0:定时器工作方式选择位

    M1 M0 工作方式 功能
    0 0 方式0 13位定时器/计数器
    0 1 方式1 16位定时器/计数器
    1 0 方式2 自动重装8位定时器/计数器
    1 1 方式3 T0分为两个独立计数器,T1没有该功能

    解析

    1.通过定时器实现0.5s的计时
    2.每0.5s进行取反,得到周期为1s的方波

    方式1的定时时间设置
    定时器的定时时间T=N*Tcy;
    N(计数值)=65536-X(计数器初值);
    Tcy=12/晶振;

    例:若晶振为12M,定时时间为50ms,求定时器需设置的初值;
    Tcy=12/12M=1us;
    T=0.05s;
    N=T/Tcy=0.5s/1us=50000;
    初值X=65536-50000=15536=3CB0;

    由于N计数范围为1-65536,所以定时范围为1-65536us。为了定时0.5s,可以以50ms为基础,每50ms都会产生一次中断,每进一次中断我们通过一个变量对其计数,当计满10次,则是0.5s;

    定时器使用步骤:
    1.进行TMOD的配置;
    2.定时器初值的设置;
    3.开总中断(EA=1);
    4.开定时器中断(ET0/ET1=0);
    5.启动定时(TR0/TR1=1);
    6.中断函数(…interrupt…)

    #include<reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit LED=P1^0;
    sbit PWM=P2^1;
    uchar aa;
    
    void main()
    {
    	TMOD=0x01;
    	TH0=(65536-50000)/256;
    	TL0=(65536-50000)%256;
    	EA=1;
    	ET0=1;
    	TR0=1;
    	PWM=1;
    	while(1);
    
    }
    
    void timer0() interrupt 1
    {
    
    	TH0=(65536-50000)/256;
    	TL0=(65536-50000)%256;
    	aa++;
    	if(aa==10)
    	{
    		aa=0;
    		PWM=!PWM;
    		LED=!LED;
    	}
    	
    
    
    }
    
    展开全文
  • 定时器0工作方式1,定时1s

    千次阅读 2017-01-11 12:25:32
    定时器0工作方式1,定时1s
  • 51单片机定时器0与计数器1复用定时输出1S
  • 单片机精确定时1s

    2020-07-30 23:33:33
    基于8位单片机12MHZ晶振,应用定时器和内部中断所编写的能够精确定时1s
  • 51单片机定时器工作方式1、2原理详解

    万次阅读 多人点赞 2020-05-30 20:02:24
    1.本篇博文旨在帮助那些像我一样刚入门51单片机,如果你对定时器有一定了解,但是其中的的工作方式不能理解,那么这篇文章很适合你,如果你是大神的话…直接绕行吧…… 2.我在学习的过程中由于知识上的不足很多的...
  • 51单片机定时器的原理与使用

    万次阅读 多人点赞 2017-06-18 21:04:40
    文章分析了定时器原理与定时器中断,通过实验详细阐述了定时器的使用,尤其是深入分析了各个细节问题。
  • 51单片机定时器初值的计算

    千次阅读 2018-04-12 16:46:46
    51单片机定时器初值的计算: 二、50MS定时器初值的计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。 65536-50000=15536(3cb0) TH0=0x3c,TL0=0xb0 2.晶振...
  • 浅析PIC单片机定时器

    千次阅读 2013-11-26 19:55:27
    什么是定时器? 定时器顾名思义就是用来定时的。...这也是定时器定时的最小时间单位。时钟频率/4=指令频率。1/指令频率=指令周期。 假设现在的时钟是4MHZ ,4MHz的时钟经过4分频后变成了 1MHz 其周期为0.00
  • 51单片机定时器初值计算

    万次阅读 多人点赞 2017-08-08 09:56:58
    **菜鸟关于51类单片机定时器初值计算问题的计算**首先先来介绍单片机的几个周期: 1、时钟周期,也称为振荡周期:定义为时钟脉冲的倒数,在单片机中也就等于晶振的倒数。 51单片机中把一个时钟周期定义为一个...
  • PIC单片机定时器(TMR0

    万次阅读 热门讨论 2013-05-17 17:38:44
    什么是定时器?  定时器顾名思义就是用来定时的。...这也是定时器定时的最小时间单位。时钟频率/4=指令频率。1/指令频率=指令周期。  假设现在的时钟是4MHZ ,4MHz的时钟经过4分频后变成了 1MHz 其周期为0
  • 单片机 定时器/计数器

    千次阅读 2019-01-10 14:32:48
    单片机 定时器/计数器 ... 定时器/计数器是一个加“1”计数器,来一脉冲即做加1计数,直至寄存器各位全为1,再来一脉冲,计数器回0且使TF0定时器T0)TF1定时器T1)置1表示定时时间到,计数值乘以单片机的机...
  • 定时器/计数器的定时功能控制实验板右下侧流水灯区域的最右侧的LED灯,初始上电时,该LED灯处于熄灭状态,每来1s,该LED灯改变一次状态。要求画出对应的电路原理图。 原理图: 代码如下: #include<reg51.h>...
  • 单片机学习(三)定时器

    千次阅读 2018-07-29 19:03:50
     定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON...
  • 1单片机定时器中断后计数器是否还会计数 解决:单片机定时器中断后计数器还是会计数的,如果重新赋值,会按照设置的时间进行计时。如果没有,则从0开始。 2、单片机在执行定时器中断时,是否在没执行当前中断...
  • 在刚开始学习单片机的时候,...定时器复用指的是,比如你需要两个定时器一个定时器任务A时间间隔是1s,一个定时器任务B时间间隔是0.5s,那么你的定时器可以设置触发时间为0.1s然后对定时器的进入次数进行计数,当计...
  • 我的开发板是ATMEGA16的,用定时器1进行1s定时,外部晶振是11.059M,256分频,计算得出初值为0x5740,然后计数60次进行1分钟的定时,控制小灯亮1分钟暗分钟,但是结果总是在55秒时小灯就变换一次,熔丝位配置为...
  • 当 51单片机工作模式寄存器 设置为  TMOD.M1M0 = 00 工作方式0  TMOD.C/T = 0 定时工作模式 定时器/计数器0 将工作在 13bit 定时器模式。。 与想当然的 13 bit = 5bit(TH0 ) + 8bit (TL0)的搞法不同的是。...
1 2 3 4 5 ... 20
收藏数 3,442
精华内容 1,376
关键字:

单片机定时器0定时1s