一文读懂51单片机的定时/计数器
前言:
网络上大部分关于定时器的讲解都是从讲定时器相关的寄存器介绍入手,这对于初学者来说这过于抽象。本片文章将从第一性原理 出发,介绍在数字系统中定时/计数器的本质是计数器,之后再介绍具体定时器设计的思路来源,让初学者用Comman Sense出发轻松理解单片机中的定时/计数器,相关内容不仅限于51内核的单片机,同样适用于STM32等高性能微处理器。
定时器/计数器
一、目标:
1、掌握单片机系统中定时的本质
2、掌握定时器工作的原理
3、理解定时器设置
二、51单片机定时/计数器
- 定时/计数器模块是单片机重要的内部资源,使用定时器相关功能,可以实现很多与时间相关的任务。
- 我们常用如下两种方式设置51单片机定时器的定时初值:
//当晶振为12MHz时 TL0=(65536-定时时间us)%256; //或者TL0=(65536-定时时间us); TH0=(65536-定时时间us)/256; //或者TH0=(65536-定时时间us)>>8; //当根据系统时钟灵活计算时 #define FOSC 11059200 //宏定义晶振为FOSC 常用11.0592MHz TL0=(65536-定时时间us * FOSC/12)%256; //或者TL0=(65536-定时时间us * FOSC /12)); TH0=(65536-定时时间us * FOSC/12))/256; //或者TH0=(65536-定时时间us * FOSC /12))>>8;
2.1、定时/计数器的本质
\qquad 要使用定时器/计数器,首先需要搞清楚其工作原理。那在数字系统有没有时间的概念呢? 数字系统本身缺乏准确的时间概念。
- 频率和周期。
对于脉冲通常关注的参数是脉冲频率 f f f,而脉冲频率 f f f定义为每秒钟信号变化的次数,这就出现了第一个与时间相关的量–秒。
脉冲信号另一个与时间直接相关的参数是周期 T T T,周期和频率的关系为 T = 1 / f T=1/f T=1/f - 频率与时间。
- 不同频率的脉冲信号具有不同的周期,对于频率为
f
0
f_0
f0的脉冲,其对应的周期
T
0
=
1
/
f
0
T_0=1/f_0
T0=1/f0也是确定的。
显然, n n n个该频率的脉冲信号对应的时间长度为 T s = n ∗ T 0 , T s ∝ n Ts=n * T_0,Ts \propto n Ts=n∗T0,Ts∝n,即 时长Ts与脉冲个数 n n n 成正比关系。 - 要定时,通常所要定时的时间长度
T
s
Ts
Ts 是人为预设已知的,
因此公式 T s = n ∗ T 0 变为 n = T s / T 0 = T s ∗ f 0 Ts=n * T_0 变为 n= Ts/T_0=Ts*f_0 Ts=n∗T0变为n=Ts/T0=Ts∗f0。 由此可知,通过对脉冲进行计数或者控制脉冲数量 就可以实现定时。
例如: \color{red}{例如:} 例如:
一、需要利用一个频率为f=1MHz的脉冲信号实现定时Ts=10ms, 那10ms对应的脉冲个数 n=Ts * f n= 10ms * 1000 000 个/s = 0.01s * 1000 000 个/s = 10 000 个脉冲 这里,只需要计数 10 000个脉冲就能实现10ms的定时
- 不同频率的脉冲信号具有不同的周期,对于频率为
f
0
f_0
f0的脉冲,其对应的周期
T
0
=
1
/
f
0
T_0=1/f_0
T0=1/f0也是确定的。
- 总结。通过以上分析可知,定时的本质是对脉冲计数,也就是定时/计数器首先它是计数器,然后才是定时器。
2.2、51内核单片机定/计数器设计思路
- 结构图。51内核单片机定时器0(Timer0 简称T0)16位定时/计数器内部结构图如下所示。
- 控制路径结构设计思路。
- 1、脉冲计数器对脉冲进行计数,不能不受控制直接进行计数,所以需要有个开关(3号开关)来控制脉冲信号按需计数。
- 2、对于计数器,如果被测信号已知,不仅仅能实现计数,还能实现计时功能,所以设定一个2号开关便于使用者根据实际需求进行设置,到底是输入SYSclk已知频率脉冲信号还是接收TO_Pin外部未知的脉冲信号。
- 3、为了增加总开关3号开关的控制灵活性,即可以通过程序控制亦可以通过外部信号控制,所以设置了单片机内部GATE和外部 I N T 0 ‾ \overline{INT0} INT0 两个作为控制量来控制3号开关,由于控制量存在外部信号,具有不可控性,所以在最前端又设置了一个与门电路,用TR0来控制上述控制量是否起作用。
- 4、脉冲的数量通过计数器进行累计(实际可以通过加计数或减计数实现),当需要统计特定数量的脉冲时,需要累加器输出一个信号,用于告知设定者,数量达到了(同样如果针对已知频率的脉冲就可以理解为定时时间到),因此增加了’举旗‘(TF0)示意功能。
2.3 工作原理(下面文字内容对照上图理解)
- 图中內部结构的核心部件为两个串级连接的8位计数器构成的一个16位计数器(类似两个算盘拼接使用),实现对脉冲的计数。
其16位计数器的计数值范围0-65535,最多可计 2 16 = 65536 2^{16}=65536 216=65536 个脉冲。
图中T0_Pin 和 I N T 0 ‾ \overline{INT0} INT0 为外部信号,不能通过软件进设置。 - 脉冲计数器与脉冲源的之间通过多个开关量信号进行脉冲信号通路的控制。
图中2号开关位置(由 C / C/ C/ T ‾ \overline{T} T控制)可进行脉冲信号来源的选择:Sysclk或者T0_Pin引脚。- Sysclk 为单片机系统时钟,对于STC单片机来说,其来源可以是外部晶振或者芯片内部振荡电路,常规设置为12MHz(频率已知),因此 Sysclk 也称时钟脉冲。
- 其中T0_Pin为T0外部时钟输入引脚,说明由该引脚进来的脉冲频率并不固定不变。
- 对已知频率脉冲进行计数可以实现定时(如上“1、定时/计数器的本质”部分所述),
因此,当2号开关选择打到上方 C / C/ C/ T ‾ = 0 \overline{T}=0 T=0时钟来源为Sysclk,则T0工作在定时模式–Timer,否则,T0工作在计数模式–Counter
- Sysclk可通过1号开关设定是否分频(
÷
12
\div {12}
÷12)后再作为定时脉冲信号源。
- 3号开关作为计数脉冲的总开关,闭合后脉冲信号才能输入到计数器。逻辑控制信号分析如下:
- 3号开关在图中信号 ′ E ′ = 1 'E'=1 ′E′=1时闭合,计数器可以计数;否则断开,计数器无脉冲输入。
- 双输入与门逻辑关系有’0’出’0’: E = C ⋅ D = T R 0 ⋅ D E=C \cdot D = TR0 \cdot D E=C⋅D=TR0⋅D ,因此只有当 T R 0 = 1 时 E = C TR0=1时E=C TR0=1时E=C,3号开关控制开关由信号‘D’控制E=D。否则TR0=0 E=0,开关3断开
- 或门逻辑有’1’出’1’ :$D = A | B $,其中,
B
=
I
N
T
0
‾
B=\overline{INT0}
B=INT0 为单片机外部输入信号,A由内部GATE控制量经过反相后获得,
A
=
G
A
T
E
‾
A=\overline{GATE}
A=GATE。
所以要使D=1, I N T 0 ‾ = 0 \overline{INT0}=0 INT0=0或者 GATE=0。两者至少有一项=0才能使D=1; - 所以,要使
E
=
1
−
>
(
T
R
0
=
1
且
D
=
1
)
,要使
D
=
1
−
>
(
I
N
T
0
‾
=
0
或者
G
A
T
E
=
0
)
E=1 -> (TR0=1 且 D=1),要使D=1->(\overline{INT0}=0或者 GATE=0)
E=1−>(TR0=1且D=1),要使D=1−>(INT0=0或者GATE=0)
在不依赖外部信号下,3号开关闭合,需设置
TR0=1,GATE=0;
如果由外部信号控制3号开关闭合,需设置
TR0=1,GATE=1;
- 3号开关作为计数脉冲的总开关,闭合后脉冲信号才能输入到计数器。逻辑控制信号分析如下:
- 总结。
1. 实现外部脉冲计数功能。设置为“从T0_Pin输入外部时钟源” 。常用相关开关量设置: C / C/ C/ T ‾ = 1 \overline{T}=1 T=1, T R 0 = 1 , G A T E = 0 TR0=1,GATE=0 TR0=1,GATE=0;
2. 实现定时器功能。设置Sysclk 作为时钟源。常用相关开关设置:1号开关向“上”(AUXR.7位=0,默认=0)、 C / C/ C/ T ‾ = 0 \overline{T}=0 T=0 , T R 0 = 1 , G A T E = 0 TR0=1,GATE=0 TR0=1,GATE=0;
(未完待续)