时钟周期:时钟周期 T 是时序中最小的时间单位,具体计算的方法就是 1/时钟源频率。

晶振是 12MHz,那么对于我们这个单片机系统来说,时钟周期=1/12000000 秒.

机器周期:我们的单片机完成一个操作的最短时间。

机器周期主要针对汇编语言而言,在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的时间是可以计算出来的,而 C 语言一条语句的时间是不确定的,受到诸多因素的影响。51单片机系列,在其标准架构下一个机器周期是 12 个时钟周期,也就是 12/12000000 秒。(1us)

定时器计数器是单片机内部的同一个模块,通过配置 SFR(特殊功能寄存器)可以实现两种不同的功能,我们大多数情况下是使用定时器功能。定时器内部有一个寄存器,我们让它开始计数后,这个寄存器的值每经过一个机器周期就会自动加 1,因此,我们可以把机器周期理解为定时器的计数周期。这个定时器就是每过一个机器周期的时间,也就是 12/12000000 秒,数字自动加 1。

定时器有多种工作模式,分别使用不同的位宽(指使用多少个二进制位),假如是 16 位的定时器,也就是 2 个字节,最大值就是 65535,那么加到 65535 后,再加 1 (65536)后就算溢出,如果有其他位数的话,道理是一样的,对于 51 单片机来说,溢出后,这个值会直接变成 0。从某一个初始值开始,经过确定的时间后溢出,这个过程就是定时的含义。

定时值存储寄存器:

名称

描述

SFR地址

复位值

TH0

定时器 0 高字节

0x8C

0x00

TL0

定时器 0 低字节

0x8A

0x00

TH1

定时器 1 高字节

0x8D

0x00

TL1

定时器 1低字节

0x8B

0x00

TCON——定时器控制寄存器的位分配(地址 0x88、可位寻址)

7

6

5

4

3

2

1

0

符号

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

复位值

0

0

0

0

0

0

0

0

TCON——定时器控制寄存器的位描述

TF1:定时器/计数器T1溢出标志,溢出时由硬件置1,直到CPU响应中断才由硬件置0,也可以用程序去软件置0.,即清零有两种方式:软件清零,或者进入定时器中断时硬件清零

TR1:定时器T1的运行控制位,软件置1/清零来进行启动/停止定时器。

TF0:定时器/计数器T0溢出标志,溢出时由硬件置1,直到CPU响应中断才由硬件置0,也可以用程序去软件置0.,即清零有两种方式:软件清零,或者进入定时器中断时硬件清零。

TR0:定时器T0的运行控制位,软件置1/清零来进行启动/停止定时器。

IE1:外部中断1请求源(INT1/P3^3)标志,IE1=1,外部中断向CPU请求中断,当响应中断时由硬件清0 IE1.

IT1:外部中断触发方式控制位,IT1=0,低电平触发;IT1=1,"1"-->"0"下降沿跳变触发.

IE0:外部中断1请求源(IN01/P3^2)标志,IE0=1,外部中断向CPU请求中断,当响应中断时由硬件清0 IE0.

IT0:外部中断触发方式控制位,IT0=0,低电平触发;IT0=1,"1"-->"0"下降沿跳变触发.

TMOD——定时器模式寄存器的位分配(地址 0x89、不可位寻址)

7

6

5

4

3

2

1

0

符号

GATE

C/T

M1

M0

GATE

C/T

M1

M0

定时器

定时器T1

定时器T0

复位值

0

0

0

0

0

0

0

0

TMOD——定时器模式寄存器的位描述

GATE门控制。GATE=0时,仅由TRx来控制定时器/计时器的开启;GATE=1时,由TRx和INTx脚为高时才可控制定时器/计时器的开启,用于计算外部中断"1"-->"0"下降沿跳变的次数,常用来测量外部信号脉冲宽度。

C/T:C/T=0;选择定时器模式;C/T=1;选择计时器模式;

M1/M0:选择定时器/计数器的工作模式,如下表:

M1

M0

工作模式

0

0

模式0:13位定时/计数器,THn(8位),TLn(5位)。

0

1

模式1:16位定时/计数器,THn(8位),TLn(8位)。

1

0

模式2:8位初值自动重装定时/计数器,溢出后THn重装到TLn。

1

1

模式3:禁用定时器 1,定时器 0 变成 2 个 8 位定时器。

“可位寻址”,比如 TCON 有一个位叫 TR1,我们可以在程序中直接进行 TR1 = 1 这样的操作。“不可位寻址”,如对TMOD 里的位M1 = 1 这样的操作就是错误的。我们要操作就必须一次操作这整个字节,也就是必须一次性对 TMOD 所有位操作,不能对其中某一位单独进行操作。

模式1讲解

描述8051定时器原理(8051定时器认识)(1)

16位定时/计数器,THn(8位),TLn(8位)

描述8051定时器原理(8051定时器认识)(2)

16位定时/计数器,THn(8位),TLn(8位)

SYSclk和OSC 表示时钟频率,因为 1 个机器周期等于 12 个时钟周期,所以那个 d 就等于 12。下边 GATE 右边的那个门是一个非门电路,再右侧是一个或门,再往右是一个与门电路。

图上可以看出来,下边部分电路是控制了上边部分。

1.如果要让定时器0工作,那么 TR0 就必须置 1,及与门另一输入为1。

2.当 GATE = 1 时,非门后变成 0,那 INT0 脚必须是 1 ,经过或门电路后才为 1,这时定时器才会工作,而 INT0 引脚是为0 时,定时器不工作,这就是 GATE 位的作用。

3、当 GATE = 0 时,非门后变成 1,不管 INT0 引脚是什么电平,经过或门电路后都肯定是 1,定时器就会工作。

4、要想让定时器工作,就是自动加 1,从图上看有两种方式,第一种方式是 C/T = 0 的时候,一个机器周期 TL 就会加 1 一次,当开关打到下边时,即 C/T =1 的时候,T0 引脚即 P3.4 引脚来一个脉冲,TL 就加 1 一次,这也就是计数器功能。

定时器配置步骤:(查询法)

第一步:设置特殊功能寄存器 TMOD,配置好工作模式

第二步:设置计数寄存器 TH0 和 TL0 的初值

第三步:设置 TCON,通过 TR0 置 1 来启动定时器。

第四步:判断 TCON 寄存器的 TF0 位,监测定时器溢出情况(查询法)

定时器配置步骤:(中断法)

第一步:打开总中断,EA=1;

第二步:设置特殊功能寄存器 TMOD,配置好工作模式

第三步:设置计数寄存器 TH0 和 TL0 的初值

第四步:使能定时器0中断,ET0=1。

第五步:设置 TCON,通过 TR0 置 1 来启动定时器。

第六步:编写中断服务函数,重新赋初值。

如何用定时器定时时间?

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

,