首先给大家讲解 51 定时器的两个特点:自增,三种运行模式(8位,13 位,16 位)。几个控制的寄存器(也就是我们前面说的编号的问题:TMOD,TH0,TL0,TR0。知道这几个是什么意思,你就能控制 51 定时器了),下面详细讲解自增和运行模式的问题。
自增:就是51定时器会从 0 到 1 到 2 。。。 就好像我们小时候数数一样。
运行模式:就是我们小时候最多也就 0 - 9 数一数,你再厉害也就 0 - 100 数一数。而这就是模式的差异,也就是你的上限(max)能达到哪里,当定时器到达上限(max)之后,就会又从 0 开始,循环往复。比如我们选择 8 位的模式(还记得二进制吗?0b11111111 = 255)也就是说,他能从 0 数到 255。那16位呢?(0b1111111111111111 = 65535)。
好了,现在我们知道上面这些了,具体怎么设置呢?
TMOD的详细对照说明(就是告诉单片机,我要使用 16 位的定时器。如果想用其他模式需要对比 51 的说明文档进行设置)我们只需要关心定时器 0 的 M1 和 M0 的相关设置。他们有如下 4 种组合方式。如果我们选用方式 1,那么 TMOD = 0b0000 0001 = 0x01,这句话就是告诉单片机我们要使用定时器0的工作方式1(也就是 16 位定时器)。其他比如 GATE 和 C/T 暂时不用去纠结是干嘛的。
TH0 和 TL0 就是我们设置的初始时间。就是我们数数的第一个数。这里为什需要两个呢?因为 TH0 和 TL0 都只能存放8位的数据。再多也放不下了,但是他们两个人能组合成 16 位的。也就是说 TH0 拼接 TL0 就是 0b (11111111) (11111111)。其中前面是 TH0,后面是 TL0。我们前面说了,16位定时器最大可以设置成 65535。那如果我现在想把它设置成从 10000 开始计时,该怎么写呢?首先,我们将 10000 换算二进制(10000 = 0b0010011100010000=0x2710 也就是说:TH0=0b00100111=0x27,TL0=0b00010000=0x10。这样我们就告诉单片机要从 10000 开始数数了。每次这么写是不是有点麻烦?我们也就简化一下 TH0 = (10000 >> 8)这就话就是说,把10000的二进制格式向右移动 8 位。(详细的移动说明如下图,一个二进制数,右边有一堵墙,只要整体往右移动,碰到墙的数字就会立刻消失。)
TR0 就是一个开关,当 TR0 = 1 的时候,定时器就工作了,TR0 = 0 的时候,定时器就停止了。这样你就能使用定时器了。
知道了上面这些,你就能很明显的知道如下写法的正确含义了。以及为什么编程的时候需要这么写程序了。