介绍
8051微控制器具有timer0
和timer1
两个定时计数器。使用定时计数器可以独立于单片机内部程序产生一个延时或用于计数。两个定时计数器都是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位定时器
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
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
| __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
|
#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() { TMOD = 0x01; TH0 = 0x4C; TL0 = 0x00;
TR0 = 1; ET0 = 1; 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; }
|