15. 51单片机的定时计数器

介绍

8051微控制器具有timer0timer1两个定时计数器。使用定时计数器可以独立于单片机内部程序产生一个延时或用于计数。两个定时计数器都是16位宽的,因为8051单片机是8位架构,所以每个16位定时器分别由两个单独的8位寄存器构成。

STC89C52的文档上面说有3个16位定时器,不过这里以传统mcs-51为准

主要寄存器的作用

寄存器 地址 作用
TL0 0x8A 定时器0低8位寄存器
TL1 0x8B 定时器1低8位寄存器
TH0 0x8C 定时器0高8位寄存器
TH1 0x8D 定时器1高8位寄存器
TCON 0x88 定时器控制寄存器
TMOD 0x89 定时器工作方式寄存器

TL0 TH0 TL1 TH1

TH0 和 TL0 组合成timer0 16位定时器; TH1 和 TL1 组合成timer1 16位定时器

76543210 76543210
TH0 TL0

TCON 寄存器

7 6 5 4 3 2 1 0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
1
2
3
4
5
6
7
8
9
/*  TCON  */
__sbit __at (0x88) IT0 ;
__sbit __at (0x89) IE0 ;
__sbit __at (0x8A) IT1 ;
__sbit __at (0x8B) IE1 ;
__sbit __at (0x8C) TR0 ;
__sbit __at (0x8D) TF0 ;
__sbit __at (0x8E) TR1 ;
__sbit __at (0x8F) TF1 ;

TMOD 寄存器

7 6 5 4 3 2 1 0
T1_GATE T1_CT T1_M1 T1_M0 T0_GATE T0_CT T0_M1 T0_M0
1
2
3
4
5
6
7
8
9
10
/* BIT definitions for bits that are not directly accessible */
/* TMOD bits */
#define T0_M0 0x01
#define T0_M1 0x02
#define T0_CT 0x04
#define T0_GATE 0x08
#define T1_M0 0x10
#define T1_M1 0x20
#define T1_CT 0x40
#define T1_GATE 0x80

定时器的工作模式

M1 M0 模式 说明
0 0 0 13位定时器/计数器, TL只使用低5位
0 1 1 16位定时器/计数器
1 0 2 8位定时器/计数器,可以自动装初值
1 1 3 T0分成单独两个8位计时器,此时T1不工作

最大值和初值计算方法

此处以11.0592MHz晶震、定时器工作方式1为例

类别 计算方法
最大值 65536 * 12 / 11.0592 = 71111us
50ms初值 65536 - 50000 / (12 / 11.0592) = 19456 = 4C00H

示例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <mcs51/8051.h>

unsigned char count = 0;

void setup()
{
// set timer 0 mode 1
TMOD = 0x01;
TH0 = 0x4C;
TL0 = 0x00;

// start timer 0
TR0 = 1;
// enable timer 0 interrupt
ET0 = 1;
// enable all interrupt
EA = 1;
}

void loop()
{
if(count == 20)
P0_0 = !P0_0;
}

void main()
{
setup();
while(1) loop();
}

void timer0() __interrupt 1
{
TH0 = 0x4C;
TL0 = 0x00;
count++;
if(count > 20) count = 0;
}