51单片机定时器编程(51单片机和stm32编程区别)

概述

单片机中的定时器是一种硬件设备,可以用来计算时间和控制周期性事件。它可以自动计数并生成中断信号,也可以用来产生PWM信号。

51单片机共有两个定时器:定时器0(T0)和定时器1(T1)。两个定时器都可以配置为计时模式或者计数模式,并且都有两个输出脚:正常输出脚(OUT)和翻转输出脚(/OUT)。在计时模式下,定时器会在计数结束时自动产生中断信号。在计数模式下,定时器将会对外部电平进行计数。

定时器计时模式

在定时器计时模式下,定时器的计数器会递增,当计数器的值等于预设的定时器初值(THx)时,定时器会自动重新从0开始计数,并产生中断信号。

以定时器0为例,假设我们需要配置一个10ms的定时器。首先我们需要设置定时器的初值和模式:

TH0 = 0xFA;  // 定时器初值为250
TL0 = 0x0C;  // 定时器计数器初值为12
TMOD = 0x01;  // 定时器0工作在模式1

其中TMOD寄存器的低4位用于设置T0的工作模式。模式0下,T0为13位计数器;模式1下,T0为16位计数器;模式2下,T0为8位自动重装计数器;模式3下,T0为双8位自动重装计数器。在这里我们选择了模式1,也就是T0为16位计数器。

51单片机定时器编程(51单片机和stm32编程区别)

接下来,我们需要设置计数器的时钟源:

TR0 = 1;  // 开启定时器0
ET0 = 1;  // 允许定时器0中断
EA = 1;  // 开启总中断

在这里我们选择了外部晶振作为时钟源,并开启了定时器0的中断功能。一旦定时器0计数结束,中断处理函数(TIMER0_ISR)就会被调用。

void TIMER0_ISR() interrupt 1
{
  TH0 = 0xFA;  // 重新设置定时器初值
  TL0 = 0x0C;  // 重新设置计数器初值
  // 执行任务
}

在中断处理函数中,我们需要重新设置定时器初值和计数器初值。由于计数器初值的设置是可选的,我们在这里略过了。并且,我们可以在中断处理函数中执行我们需要的任务。

定时器计数模式

在定时器计数模式下,定时器将会对外部电平进行计数。当计数器的值等于预设的定时器初值(THx)时,定时器会自动产生中断信号。

以定时器1为例,假设我们需要计数10个脉冲信号的高电平时间。首先我们需要设置定时器的初值和模式:

TH1 = 0xFF;  // 定时器初值为255
TL1 = 0x00;  // 计数器初值为0
TMOD = 0x11;  // 定时器1工作在模式2

在这里我们选择了模式2,也就是T1为8位自动重装计数器。由于我们需要统计脉冲信号的高电平时间,所以我们选择了T1翻转输出脚(/OUT)作为计数引脚:

TR1 = 1;  // 开启定时器1
ET1 = 1;  // 允许定时器1中断
EA = 1;  // 开启总中断

接下来,我们需要在中断处理函数中获取计数器的值,并计算出脉冲信号的高电平时间:

volatile unsigned int count = 0;  // 计数器
volatile unsigned long begin_time = 0;  // 脉冲信号开始时间
volatile unsigned long end_time = 0;  // 脉冲信号结束时间

void TIMER1_ISR() interrupt 3
{
  // 获取计数器的值
  count += TH1;
  count += TL1;
  
  // 判断脉冲信号的状态
  if (P1_0 == 1) {
    end_time = count;
  } else {
    begin_time = count;
  }
  
  // 判断脉冲信号是否结束
  if (end_time != 0 && end_time > begin_time) {
    unsigned long pulse_width = end_time - begin_time;
    // 执行任务
    count = 0;
    begin_time = 0;
    end_time = 0;
  }
  
  // 重新设置计数器初值
  TL1 = 0x00;
}

在这里我们定义了一个计数器count和两个时间变量begin_time和end_time,它们都是unsigned long类型的,因为我们需要计算的时间较长。在中断处理函数中,我们首先获取计数器的值(由于定时器1的计数器只有8位,所以我们需要使用两个字节相加的方式得到其实际的值),然后判断计数引脚P1_0的状态,如果为高电平,则表示脉冲信号结束,我们将计算脉冲信号的高电平时间,并执行需要的任务。最后,我们需要重新设置计数器的初值为0。

结论

51单片机的定时器提供了很强的时间计数和周期性事件控制能力,可以满足各种不同的应用需求。在应用中,我们需要根据实际需求选择不同的定时器工作模式和计时参数,并编写相应的中断处理函数,以实现有效的定时器控制和任务执行。

本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/mcu53.html

郑重声明:

本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。

我们不承担任何技术及版权问题,且不对任何资源负法律责任。

如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。

如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!

(0)
上一篇 2023年4月26日 上午3:05
下一篇 2023年4月26日 上午3:06

猜你喜欢