51单片之定时器应用

1.定时器简介

  STC89C5X 含有 3 个定时器:定时器 0、定时器 1、定时器 2(注意:51 系列单片机一定有基本的2个定器(定时器0和定时器1),但不全有3个中断,需要查看芯片手册,通常我们使用的是基本的2个定时器:定时器 0/1)。

  • CPU运行周期说明
    (1)振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。
    (2)状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。
    (3)机器周期:1个机器周期含6个状态周期,12个振荡周期。
    (4)指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。例如:外接晶振为 12MHz 时,51 单片机相关周期的具体值为:

  振荡周期=1/12us;
  状态周期=1/6us;
  机器周期=1us;
  指令周期=1~4us;

  • 51单片机定时器

  (1)51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。
  (2)定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。
  (3)51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。
  (4)有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。

2.定时器寄存器

  51单片机定时器/计数器内部结构如下所示:
在这里插入图片描述
  上图中的T0和T1引脚对应的是单片机 P3.4和P3.5管脚。51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制 T0、T1 的启动和停止及设置溢出标志。
在这里插入图片描述

2.1 TMOD寄存器

  地址:0x89 不可位寻址
  工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:
在这里插入图片描述
在这里插入图片描述

2.2 TCON寄存器

  地址:0x88,可位寻址。
在这里插入图片描述
在这里插入图片描述

3.定时器配置步骤

  (1)TMOD模式配置,确定T0和T1的工作方式,如果使用定时器0即对T0配置,如果使用定时器1则对T1配置。
  (2)根据所要定时的时间计算初值,并将其写入TH0、TL0或TH1、TL1。
  (3)若使用中断,则EA=1(CPU总中断使能位,EA=1使能、EA=0失能),使能定时器中断。
  (4)启动定时器(TR1/TR0=1)。
  (5)编写中断服务函数。格式为:函数名 interrupt <中断号>。
  中断号可查看下表获取:
在这里插入图片描述
  从上表中可以看到,定时器0的中断号为1,定时器1的中断号为3;

4.软件设计

4.1 定时器0工作方式1配置

  配置定时器0工作方式1(16位定时/计数工作模式),定时时间为1ms。TH0和TL0计算方式如下:
定时器工作频率可以通过下载软件设置为6T和12T两种,6T表示将外部输入频率进行6分频后作为定时器工作频率;12T表示将外部输入频率进行12分频后作为定时器工作频率。当前开发板外部晶振频率为11.0592MHZ,将定时器设置为12T工作,则定时器的工作频率为:
11.0592MHZ / 12=0.9216MHZ
  定时器1ms计数值为:
    1000us / ( 1 / 0.9216)=921.6
  定时器是采用向上计数方式,需要计数到最大值65536(2^16+1)才能产生溢出事件,因此TH0和TL0需要填写的值为:
    count=65536 - 921=64615=0xFC67;
    TH0=0xFC67>>8;
    TL0=0xFC67&0xFF;
在这里插入图片描述

4.2 定时器软件定时计算

在这里插入图片描述

4.3 程序设计

  (1)定时器0初始化配置,工作在12T模式下,定时时间为1ms,工作方式1。

void Timer0_Init(u16 time)
{
  TMOD=0X01;//定时器0工作在16位模式
  TL0=time&0xFF;//低8位
  TH0=(time>>8)&0xFF;//高8位
  TR0=1;//TIM0运行使能
  ET0=1;//使能TIM0中断
  EA=1;//CPU总中断允许位
}

  (2)中断服务函数。
  定时器工作方式1产生溢出事件后需要手动重新装载TH0和TL0的数值。定时器1ms后通过对cnt++实现LED灯1s闪烁一次。

/*定时器中断服务函数*/
void time0_irq() interrupt 1
{
  static u16 cnt=0; 
  //设置计数器值
  TL0=0xFC67&0xFF;//低8位
  TH0=(0xFC67>>8)&0xFF;//高8位  
  cnt++;
  if(cnt>=1000)
  {
    cnt=0;
    LED=~LED;
  }
}

  (3)主函数

int main()
{
  u8 i=0;
  u8 key;
  key_Init();
  LED=0xFF;//关闭所有LED
  Timer0_Init(0xFC67);
  while(1)
  {
    key=Key_GetValue();
    if(key)
    {
      BEEP_Ctl(100);
      Delay_Ms(20);
      BEEP_Ctl(0);
      LED=~LED;
    }
}	
}

4.4 定时器0工作方式0配置

  配置定时器0工作方式2(8位自动重装载),定时时间为100us。使用12T方式。
在8位自动重装载模式下,当定时器产生溢出事件后,定时器将自动将TH0的值重新装载到TL0寄存器中。需要设置1us定时时间,TH0和TL0需要设置的值为:
  12T模式下定时器0工作频率:11.0592MHZ / 12=0.9216MHZ
  计数100us需要的周期次数为:100/(1/0.9216)=92.16
  TH0和TL0写入的值为:TH0=TL0=256-92.16=163.84=0xA4
注意:定时器为向上计数模式,需要计数到2^8+1(256)才能产生溢出事件,因此需要从0xA4开始计数。
  配置如下:

void Timer0_Init(u16 time)
{
//模式2:8bit自动重装载
  TMOD=0X02;//定时器0工作在16位模式
  //8位自动重装载定时100us-->164
  TL0=time;
  TH0=time;
  TR0=1;//TIM0运行使能
  ET0=1;//使能TIM0中断
  EA=1;//CPU总中断允许位
}

  中断服务函数:

/*定时器中断服务函数*/
void time0_irq() interrupt 1
{
  static u16 cnt=0; 
  cnt++;
  if(cnt>=1000)
  {
    cnt=0;
    LED=~LED;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_阿水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值