概述
单片机中的定时器是一种硬件设备,可以用来计算时间和控制周期性事件。它可以自动计数并生成中断信号,也可以用来产生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位计数器。
接下来,我们需要设置计数器的时钟源:
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小时之内反馈信息。
如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!