51单片机中的定时器/计数器(更新版)

定时器介绍

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时,定时器会发生溢出,即计数器溢出。这时,定时器的值会被重载到初始值(TH1TL1 中的值),并且一个溢出标志(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;		//设置定时器模式

  1. TMOD &= 0xF0这行代码通过按位与操作,将 TMOD 寄存器的低四位清零,同时保留高四位不变。TMOD 寄存器通常包含两个4位的字段,分别用于配置定时器0(T0)和定时器1(T1)。通过清除低四位,此代码确保只影响定时器0的配置。

  2. TMOD |= 0x01接下来,这行代码通过按位或操作,将 TMOD 寄存器的最低位设置为1。这通常表示选择定时器0(T0)的工作方式,通常方式1表示定时/计数器模式。

  3. 总结:这样操作只改变了定时器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 设置中断优先级

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值