51单片机总结之定时器

1.引言 我开始看单片机的书籍比较早,只有C语言基础而没有数电基础(不知道要学),所以我在很多地方概念都是模模糊糊的。尤其是什么控制位什么寄存器什么逻辑电路都不懂,只纯粹的想写C语言操作单片机就行了。现在有了一定的基础,发现了很多以前知其然不知其所以然的东西,所以在这里稍微的总结一下,同时我想可能对基础不扎实的同学有一定的帮助(其实我基础也不扎实~嘻嘻)。


2.定时器的控制寄存器 对硬件(单片机)的操作,从本质上将就是对寄存器的操作。一个寄存器通常是1字节,即8位。每一位(bit)可以联想成一个开关,打开这个开关就能做一件事,关闭这个开关就能停止做一件事。


8051系列的单片机中定时器由两个寄存器控制,这两个寄存器名称分别是TMOD(Time Mode,工作方式寄存器)和TCON(Time Configuration,控制寄存器)。因为这些寄存器是操作单片机中定时器的,有特殊功能作用,所以属于特殊功能寄存器而不是通用寄存器。另外想要记住这两个寄存器的名称也很简单,用英文全称来记忆。
【51单片机总结之定时器】

下面先对两个控制寄存器各个位进行总结:
2.1 工作方式寄存器(TMOD)

TCOM D7 D6 D5 D4 D3 D2 D1 D0
位名称 GATE C/T M1 M0 GATE C/T M1 M0
功能 门控位 定时/计数方式选择 工作方式选择 门控位 定时/计数方式选择 工作方式选择
说明 高4位控制T1 低4位控制T0
TOMD的结构和各位名称、功能 51单片机有两个定时器,其中TMOD的高四位控制定时器1,低四位控制定时器0。
2.1.1 门控位(GATE)
我初学的时候没有用到这个位,不过我还是简单对它总结一下吧:
可以通过编程对这个位置1或清零。
当GATE = 0时,只要使TCON中的TR0或TR1置1,就可以启动定时器了。
当GATE = 1时,除了使TCON中的TR0和TR1置1以外,还需要外部中断INT0或INT1为高电平,才能启动定时器。即比GATE = 0时多一个启动条件。
2.1.2 定时/计数模式选择位(C/T)
其中C的英文全称是Count,意思是计数器。T是Timer,定时器。置1为选择计数器工作模式,置0为选择定时器工作模式。(T上面应该画一横的,表示低电平有效)。
当C/T = 0时,为定时模式。此时定时器计数的时间是一个机器周期,一个机器周期的时间长度和晶振频率有关。大家都知道周期T和频率f是互为倒数的关系。而知道了晶振频率fosc后,还要除以12(硬件内部结构12分频的结果),它的倒数就是一个机器周期。即如果单片机采用12MHz的晶振,那么机器周期就是1微秒。
每经过一个机器周期,定时器的数值就会加1,直到计数器产生溢出,最后产生中断执行自己写的程序,这个程序就是你想让单片机计数结束后做什么的程序。


当C/T = 1时,为计数模式,这里不详细总结了。


另外上电复位后,这里的控制位默认是0,即定时模式。
2.1.3 工作方式选择(M1和M2)

M1M0 工作方式 说明
00 方式0 13位定时器
01 方式1 16位定时器
10 方式2 8位自动重装定时器
11 方式3 T0分成两个独立的8位定时器;T1停止使用
定时器工作方式设置表 2.1.4 注意事项
TMOD不能单独对一个位置1或清零。只能一个字节的写入TCOM设置定时器。
另外,CPU复位时TCOM所有的位都清零。
2.2 控制寄存器(TCON)
TCON D7 D6 D5 D4 D3 D2 D1 D0
位名称 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
功能 T1中断标志 T1运行开关 T0中断标志位 T0运行开关 - - - -
TCON的结构、位名称和功能 这里主要关注TCON高四位,低四位是和外部中断有关的控制位。
2.2.1 溢出中断请求标志位(TFn)
标题上的TFn中的n表示0或1,即溢出中断请求标志位分别有TF0和TF1。TF的英文全称是Timer overflow Flag,即定时器溢出标志位。
当定时器Tn(n=0、1)计数溢出后,相应的TFn由硬件自动置1,然后向CPU申请中断,执行中断程序。
CPU响应中断后,硬件自动对TFn清零。


另外,TFn也可以在程序中置1或清零。
2.2.2 定时器运行控制位(TRn)
TR的英文全称是Timer Run,即定时器运行(控制位)。
当TRn = 1时,定时器n运行;
当TRn = 0是,定时器n停止。


3.定时器的结构 知道了如何控制定时器之后,现在再来看一下定时器的结构。
定时器的实质是加一计数器(16位),由高8位和低8位两个寄存器组成(THn和TLn)。


不同工作方式(M1M0控制),THn和TLn也有不同的功能。我最常用的是使用工作方式1——16位定时器。所以也只是稍微总结一下,因为足够用了,能做很多事情了。
在这个工作方式下,THn和TLn合起来作为16位计数器。由TLn作为低8位,THn作为高8位(因为L是low,H为High)。当16位计数器溢出时,TFn置1。然后产生中断,进入并执行中断程序。
若使用12MHZ的晶振,定时器每加1则需要1微秒时间,如果把THn和THn都置为00H,当定时器溢出并产生中断的时候,就已经过了65536微秒(2^13次方微秒)。

    推荐阅读