定时器介绍
51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成
定时器作用
(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
(2)替代长时间的Delay,提高CPU的运行效率和处理速度 (…)
定时器框架
定时器的电路图
TL:控制低位的数值
TH:控制高位的数值
SYSclk:系统时钟,即晶振周期
晶振:晶振是石英振荡器的简称,英文名为Crystal,它是时钟电路中最重要的部件,它的主要作用是向显卡、网卡、主板等配件的各部分提供基准频率,它就像个标尺,工作频率不稳定会造成相关设备工作频率不稳定,自然容易出现问题。 晶振还有个作用是在电路产生震荡电流,发出时钟信号。
计时原理
TL和TH的初值每隔一段时间增加直到65535再加1溢出TF信号置“1”计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行。
定时器/计数器0和1的相关寄存器
定时器/计数器中断控制寄存器(可位寻址)
定时器/计数器工作模式寄存器TMOD
GATE:控制定时器打开。
C/T:控制定时器的模式定时器/计数器。
M:控制定时器模式选择。
STC89C52的T0和T1均有四种工作模式:
模式0:13位定时器/计数器
模式1:16位定时器/计数器(常用)
简单的计数
模式2:8位自动重装模式
当定时器的值减小到0时,定时器会发生溢出,即计数器溢出。这时,定时器的值会被重载到初始值(TH1
和 TL1
中的值),并且一个溢出标志(TF1)会被设置为指示定时器溢出事件发生。
模式3:两个8位计数器
定时器的运用
1.利用定时器计时
#include <REGX52.H>
/**
* @brief 定时器0初始化,1毫秒@12.000MHz
* @param 无
* @retval 无
*/
void Timer0Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
}
/*定时器中断函数模板
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count>=1000)
{
T0Count=0;
}
}
*/
代码分析:
配置T0定时器
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
-
TMOD &= 0xF0
:这行代码通过按位与操作,将 TMOD 寄存器的低四位清零,同时保留高四位不变。TMOD 寄存器通常包含两个4位的字段,分别用于配置定时器0(T0)和定时器1(T1)。通过清除低四位,此代码确保只影响定时器0的配置。 -
TMOD |= 0x01
:接下来,这行代码通过按位或操作,将 TMOD 寄存器的最低位设置为1。这通常表示选择定时器0(T0)的工作方式,通常方式1表示定时/计数器模式。 -
总结:这样操作只改变了定时器T0的配置从而保留了另一个定时器的配置。
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
设置初值
低八位为 0001 1000
高八位为 1111 1100
则初值为 0001 1000 1111 1100 也就是64536
当加了1000次后溢出 1111 1111 1111 1111 +1=0000 0000 0000 0000
时间溢出的计算方法
要确定定时器溢出所需的时间,在上面的代码中,已经将TMOD寄存器配置为方式1,这是一个16位定时器/计数器模式,使用定时器0(T0)。
初始计数值 = 0xFC18 (16进制) = 64536 (十进制)
定时器方式1是一个16位的定时器,所以它的计数范围是0到65535。由于初始计数值为64536,因此定时器在溢出前还有65535 - 64536 = 999个计数周期。
如果晶振频率为12MHz,那么每个计数周期的时间可以通过以下计算得到:
每个计数周期的时间 = 1 / (晶振频率) = 1 / 12,000,000 秒 ≈ 83.33纳秒
溢出时间 = 每个计数周期的时间 × 剩余计数周期数
溢出时间 = 83.33纳秒 × 999 ≈ 83.3微秒
所以,在上述代码中,定时器0(T0)将在大约83.3微秒后溢出。
进入中断
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
TF0=0置零溢出标志
TR0=1 准备开始计时
ET0=1 EA=1 中断允许进入
PT0=0 设置中断优先级