当前位置:首页 > 单片机 > 单片机
[导读]方式0应用    通过设置TMOD寄存器中的M1M0位00选择定时器方式0,方式0的计数位数是13位,对T0来说,TL0寄存器的低5位(高3位未用)和TH0寄存器的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF

方式0应用

    通过设置TMOD寄存器中的M1M0位00选择定时器方式0,方式0的计数位数是13位,对T0来说,TL0寄存器的低5位(高3位未用)和TH0寄存器的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向cpu发出中断请求。其逻辑图如下

定时器方式0位13位计数器,最多能装载的个数 2的13次方=8192个,当TL0和TH0的初始值为0时,最多经过8192个机器周期该计数器就会溢出一次,向cpu申请中断。

THX=(8192-N)/32 TLX=(8192-N)%32。机器周期=12 X (1/时钟频率)

单片机定时器程序的步骤: 对TMOD赋值、计算初值、中断方式,对IE赋值,开放中断、使TR0或TR1置位,启动定时器

让发光二极管以1s亮灭闪烁 代码:

   #include

   #define uchar unsigned char

   #define uint unsigned int

   sbit led1=P1^0;              // 假定发光二极管接P10口

   uchar num;

   void main()

   {

      TMOD=0x00;            //设置定时器0的工作方式为0

      TH0=(8192-4607)/32;        //装初值

      TL0=(8192-4607)%32;

      EA=1;                //开总中断

      ET0=1;               //开定时器0中断

      TR0=1;                //启动定时器0

      while(1)

      {

          if( num==20 )

          {

              num=0;

              led1=~led1;

          }

        }

    }

    void T0_time() interrupt 1

    {

        TH0=( 8192-4607 )/32;

        TL0=( 8192-4607 )%32;

        num++;

      }

方式2应用

    在定时器的方式0和1中,当计数溢出后,计数器变为0,因此在循环定时过程中反复的装初值必然会影响到定时的精度。方法2可解决装初值的问题。通过设置TMOD寄存器中的M1M0位为10选择定时器方式2,方式2被称为8位初值自动重装的8位定时器/计数器,THX被称为常数缓冲器,当TLX溢出时,在TFX置1时的同时,还自动的将THX中的常数重新装入TLX中,使TLX从初值开始重新计数,这样避免了人为软件重装初值所带来的时间误差,从而提高定时精度

代码,让发光二极管以1s亮灭闪烁

  #include

  #define uint unsigned int

  sbit led1=P1^0;            //二极管接P1^0口

  uint num;            

  void main()

  {

    TMOD=0x02;

    TH0=6;              // TH0、TL0取6和下面的num取3686是为了得到1s的时间。也可取其他的数字

    TL0=6;

    EA=1;

    ET0=1;

    TR0=1;

    while( 1 )

    {

      if( num==3686 )

      {

          num=0;

          led1=~led1;

      }

    }

  }

  void T0_time() interrupt 1

  {

      num++;

  }

 方式3应用 

方式3只适用于定时器/计数器 T0,当设定定时器T0处于方式3时,定时器T1不计数。方式3将T0分成2个独立的8位计数器TL0和TH0,定时器3的逻辑结构图

分析上图可知,定时器被分成2个独立的计数器。其中TL0为正常的8位计数器,计数溢出后置位TF0,向cpu发出中断申请,之后再重装初值。TH0也被固定为一个8位计数器,它占用定时器T1的中断请求标志TF1和定时器启动控制位TR1。

代码 让第一个二极管1s闪烁、第二个二极管0.5s闪烁

  

  #include

  #define uchar unsigned char

  #define uint unsigned int

  sbit led1=P1^0;            //二极管接一个P1^0口另一个接P1^2口

  sbit led2=P1^1;

  uint num_1,num_2;            

  void main()

  {

    TMOD=0x03;

    TH0=6;              // TH0、TL0取6和下面的num取3686是为了得到1s的时间。也可取其他的数字

    TL0=6;

    EA=1;

    ET0=1;

    ET1=1;

    TR1=1;

    TR0=1;

    while( 1 )

    {

      if( num>=3686 )

      {

          num_1=0;

          led1=~led1;

      }

      if( num_2>=1843 )

      {

          num_2=0;

          led2=~led2;

      }

    }

  }

  void TL0_time() interrupt 1

  {

      TL0=6;

      num_1++;

  }

  void TH0_time() interrupt 3

  {

    TH0=6;

    num_2++;

  }


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭