51单片机中的定时器

本文详细介绍了51单片机中定时器的工作原理,包括时钟周期、机器周期的概念,以及如何设置和使用定时器进行精确计时。通过实例演示了定时器模式1的使用方法,并提供了具体的C语言代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 51单片机中的定时器介绍

1.1 定时器的初步认识

时钟周期:

  • 时钟周期 T 是时序中最小的时间单位,具体计算的方法就是 1/时钟源频率,如果晶振是 11.0592M,那么对于我们这个单片机系统来说,时钟周期=1/11059200 秒。

机器周期:

  • 我们的单片机完成一个操作的最短时间。机器周期主要针对汇编语言而言,在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的时间是可以计算出来的,而 C 语言一条语句的时间是不确定的,受到诸多因素的影响。 51单片机系列,在其标准架构下一个机器周期是 12 个时钟周期,也就是 12/11059200 秒。现在有不少增强型的 51 单片机,其速度都比较快,有的 1 个机器周期等于 4 个时钟周期,有的 1个机器周期就等于 1 个时钟周期,也就是说大体上其速度可以达到标准 51 架构的 3 倍或 12倍。

定时器:

  • 打开定时器后,定时器"存储寄存器"的值经过一个机器周期自动加1,也就是说,机器周期是定时器的计数周期。

1.2 定时器的寄存器

定时值存储寄存器:

  • 存储定时器的计数值的。
    在这里插入图片描述
    定时器控制寄存器TCON:
    在这里插入图片描述
    在这里插入图片描述
    定时器模式寄存器TMOD:
    在这里插入图片描述
    在这里插入图片描述

1.3 使用定时器的方法

第一步:设置特殊功能寄存器 TMOD,配置好工作模式。
第二步:设置计数寄存器 TH0 和 TL0 的初值。
第三步:设置 TCON,通过 TR0 置 1 来让定时器开始计数。
第四步:判断 TCON 寄存器的 TF0 位,监测定时器溢出情况。

1.4 定时时间的计算

我们的晶振是 11.0592M,时钟周期就是 1/11059200,机器周期是 12/11059200,假如要定时 20ms,就是 0.02 秒,要经过x 个机器周期得到 0.02 秒,我们来算一下 x*12/11059200=0.02,得到 x= 18432。 16 位定时器的溢出值是 65536(因 65535 再加 1 才是溢出),于是我们就可以这样操作,先给 TH0 和 TL0一个初始值,让它们经过 18432 个机器周期后刚好达到 65536,也就是溢出,溢出后可以通过检测 TF0 的值得知,就刚好是 0.02 秒。那么初值 y = 65536 - 18432 = 47104,转成 16 进制就是0xB800,也就是 TH0 = 0xB8, TL0 = 0x00。


2 定时器模式1

2.1 定时器模式1原理分析

模式示意图如下:
在这里插入图片描述

2.2 使用查询的方式使用定时器

下面程序的主要功能是让小灯以0.5Hz的频率闪烁。

#include <reg52.h>

sbit LED = P0 ^ 0;
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main()
{
	unsigned char cnt = 0; //定义一个计数变量,记录 T0 溢出次数

	ENLED = 0; //使能 U3,选择独立 LED
	ADDR3 = 1;
	ADDR2 = 1;
	ADDR1 = 1;
	ADDR0 = 0;

	TMOD = 0x01; //设置 T0 为模式 1
	TH0 = 0xB8; //为 T0 赋初值 0xB800
	TL0 = 0x00;
	TR0 = 1; //启动 T0

	while (1)
	{
		if (TF0 == 1) //判断 T0 是否溢出
		{
			TF0 = 0; //T0 溢出后,清零中断标志
			TH0 = 0xB8; //并重新赋初值
			TL0 = 0x00;

			cnt++; //计数值自加 1
			if (cnt >= 50) //判断 T0 溢出是否达到 50 次
			{
				cnt = 0; //达到 50 次后计数值清零
				LED = ~LED; //LED 取反: 0-->1、 1-->0
			}
		}
	}
}

参考资料:

  1. 手把手教你学51单片机:C语言版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值