51单片机的定时器模块可谓大名鼎鼎,利用定时器可以大大提高程序的执行效率,为什么这样说呢?举个例子来简单证明一下。在实例2中,我们实现LED闪烁的方法是,点亮小灯,延时一会,然后再熄灭小灯,如此循环。那么问题来了,在点亮小灯后延时的这一段时间里,程序实际上是处于空转状态,这时程序不能执行别的操作,只能等待延时结束后才能继续向下执行。这样是不是很影响程序执行效率?而如果使用定时器的定时功能的话,这个延时等待就可以不要了,单片机空出来的经历就可以去干别的更有用的事情了,至于定时器为什么有这么神奇的效果,我们慢慢来了解。
1.1. 实验目的
图1是本实例的电路图。
图1 定时器演示电路
本实例的目的是了解51单片机的定时/计数器模块的功能,实现利用定时/计数器设置一个定时间隔,控制单片机端口P1.0输出高低变化的电平。
1.2. 设计思路
51单片机有T0和T1两个定时/计数器模块,本实例使用定时/计数器T0实现设定功能,通过将51单片机的定时/计数器T0设置为定时器模式,设置一定的定时间隔,定时时间达到后,控制单片机端口的状态翻转,并通过连接该端口的示波器和LED来直观和准确的观察定时时间是否准确。
1.3. 基础知识
本实例主要用到51单片机的定时/计数器T0。从字面意思来看,51单片机的定时/计数器既具备定时功能,,也具备计数功能。计数功能是对外埠信号的计数,定时功能则是可以每间隔一定的时间去处理某些事。
本实例是使用51单片机的定时/计数器的定时功能,那么我们就先来了解定时功能,至于计数功能,我们在下一个实例来学习。
定时在实际生活中有着极为重要的应用阻值,例如我们家用的电饭锅可以实现定时开始煮饭,空调可以定时开关等等。图2是51单片机定时器的使用方法。
图2 定时器的工作方法示意图
从图中可以看出,如果将定时/计数器设为定时工作方式,这时定时/计数器与外部电路断开了,同时与内部的脉冲信号相连,开始对内部信号进行计数。这里有一个很重要的知识点需要说明,传统的51单片机如果外接的是12MHz的晶振,那么单片机的实际运行频率是1MHz。原因大家可以查阅相关资料,这里就不再赘述。
假设单片机接的是12MHz的晶振,则经过单片机内部12分频后得到1MHz的脉冲信号,1MHz信号脉冲的周期是1/1M=1us,如果定时器T0对这个1MHz信号计数,计数初值是0,则计到65535时,需要的时间是65536*1us=65.536ms。此时,定时器的计数值达到最大值(因为定时器0的最大计数器是16位的,相当于一个无符号整型数,其最大值是65535,因为是从0开始计数的,所以计数的最大值是65536),此时定时器内部会自动产生溢出,并送给CPU一个信号,于是产生一个中断,使CPU停止正在执行的任务,转而来执行这个事件。
我们上面讲的定时器的初值是从0开始的,而定时器则是计数到65535才会溢出,如果仅只是这样的话,那这个定时器的功能就有些low了,所以,在51单片机设计时,已经考虑到这个问题了,并且有了改进措施:定时器的初值是可以自行设置的,也就是说,我们可以把定时器的初值设为0~65535之间的任何值。这样的一大好处是,定时器的定时时间可以在0~655.36ms之间任意设定,例如我们设置一个10ms的定时,那么定时器的初值设置为55536即可,因为65536-55536=10000us=10ms。这样是不是就方便多了?
1.3.1. 51单片机定时/计数器的结构及工作原理
51单片机的定时/计数器是一个非常重要的功能模块(51单片机除了通用I/O端口外,有三个重要功能模块,定时/计数器是其中之一,另两个是外部中断模块,串口通信模块。要使用这些功能模块,就必须了解和配置这些功能)。一个很浅显的道理,我们想要使用某个器件,必须要非常清楚的了解它的结构和工作原理,才能够很熟练、准确的使用它。
51单片机中的定时/计数器结构如图3所示。图中T0和T1分别是单片机的两个定时/计数器,本例中我们使用定时/计数器T0,所以就先来了解T0。T0是16位定时器,由TH0和TL0组成。TH0和TL0是两个8位计数器,合起来就是16位的。TH0和TL0都是加1计数器。从图中还可以看出,还有两个寄存器TCON和TMOD。其中TCON是控制定时/计数器的启动和停止的寄存器,而TMOD则是用来设置定时/计数器的工作方式(例如设置为定时器模式还是计数器模式)。定时/计数器在单片机内部通过总线与CPU连接,因而可以接受CPU的控制,并能传送信号给CPU,从而让CPU执行设定的操作任务。
图3 定时/计数器的结构
上面我们已经了解了定时/计数器在定时模式下的工作原理:定时模式下,对外接晶振(也可以是外部时钟脉冲)的振荡信号12分频后,提供给计数器,作为计数的输入脉冲,计数器以这个12分频的脉冲周期为基本计数单位,对输入的脉冲进行计数,因为计数方式是加1计数,所以计数一直向上加,直到达到65536后溢出。
无论是定时/计数器处于计数还是计时方式,它们对内部或者外部的时钟脉冲进行计数时,都不会占用CPU的时间(这就是我们前面说的使用定时/计数器时,可以大大加快CPU的工作效率),直到产生溢出为止。它们的作用是当溢出发生后,通知CPU停止正在进行的工作,有限去处理“定时时间到”或者“计数器满”这样的事件。如果让CPU去计时或者计数,结果就是这样的:因为CPU是按顺序一步一步执行程序的,如果让CPU计时1分钟后去执行点亮LED的命令,那么它就必须按顺序执行延时1分钟的程序,才能够去点亮LED,在执行延时程序期间,CPU不能进行其它操作,例如判断按键是否按下等。
定时/计数器必须经过配置才能正确工作,怎么配置?配置什么?这就要用到TCON和TMOD这两个寄存器。所以必须知道这两个寄存器的控制方法,所谓的控制,其实就是对这两个寄存器的相应位进行控制。
定时/计数器的方式控制寄存器TMOD
TMOD是51单片机的特殊功能寄存器,功能是控制定时/计数器T0、T1的工作方式。TMOD不能进行位操作,只能进行字节操作(不能像控制I/O口那样sbit LED P1^7,LED=0;只能是进行像TMOD=0x12这样的操作)。在上电和复位时,TMOD的初始值为0,。
TMOD中各位的含义如图4所示。