51单片机定时器的基本原理如下:
“定时器”-顾名思义,就是用来计时的。为了便于理解它计时的过程,可以想象一下钟表,在发条的驱动下,秒针每走一下,就表示1秒钟,如果要知道时间过了多少秒,就只需要数一数秒针走了几下,对吧!!
那么单片机的定时器跟钟表是同一个原理,它内部也有一个“秒针”,只不过这个“秒针”不是由发条驱动,而是由我们常说的晶振来驱动,并且它每走一下不是1秒,而是由晶振的大小决定的。怎么决定的呢? 就需要了解两个概念---“时钟周期”和“机器周期”。
时钟周期—就是晶振频率的倒数,比如采用的晶振的频率是12MHz,那么时钟周期就是 1/12 us
机器周期—对于80C51单片机来说,机器周期就是时钟周期的12倍,也就是1 us(对于12MHz的晶振来说)
好了,回到上面单片机内部的 “秒针”,它就是在机器周期的驱动下往前走的,也就是每走一下就是1 us(对于12MHz的晶振来说)
接着讲80C51的定时器0(T0)的用法
从书上可以知道 T0有多种工作方式,我们这里挑最常用的方式1来讲一下。方式1是16位递增模式。怎么理解?
上面讲了,在机器周期的驱动下,定时器一点一点的计时,每来一个机器周期,单片机就要统计一下数量,并且存储起来,任何用来存储数据的空间都是有容量限制的。这里用来存储机器周期数量的空间叫寄存器(TH0和TL0),16位说的就是这个寄存器的大小(2^16,最大存储的数是 65535),递增的意思就是每来一个机器周期,寄存器里面的数据就加一(不是减一)。那么有个问题,如果机器周期的数量超过了它的容量(65535)那怎么办呢?就会产生溢出(触发定时器0中断),同时寄存器归零。
通过上面的讲解,应该能明白,当寄存器从0开始累计,最大能到65535,也就是最大能计时65535×1us=65535us,也就是65.535毫秒。如果要做其他的计时(小于65535us),就只需要改变寄存器的初始值,比如寄存器的初始值是10000,那么在机器周期的驱动下,寄存器的数据从10000开始往上递增,直到65535,这中间经过的时间就是(65535-10000=55535us)
下面的代码展示了 如何初始化定时器T0并且使用
留一个问题: 如果要计时超过 65535us,怎么办,比如计时1秒
“定时器”-顾名思义,就是用来计时的。为了便于理解它计时的过程,可以想象一下钟表,在发条的驱动下,秒针每走一下,就表示1秒钟,如果要知道时间过了多少秒,就只需要数一数秒针走了几下,对吧!!
那么单片机的定时器跟钟表是同一个原理,它内部也有一个“秒针”,只不过这个“秒针”不是由发条驱动,而是由我们常说的晶振来驱动,并且它每走一下不是1秒,而是由晶振的大小决定的。怎么决定的呢? 就需要了解两个概念---“时钟周期”和“机器周期”。
时钟周期—就是晶振频率的倒数,比如采用的晶振的频率是12MHz,那么时钟周期就是 1/12 us
机器周期—对于80C51单片机来说,机器周期就是时钟周期的12倍,也就是1 us(对于12MHz的晶振来说)
好了,回到上面单片机内部的 “秒针”,它就是在机器周期的驱动下往前走的,也就是每走一下就是1 us(对于12MHz的晶振来说)
接着讲80C51的定时器0(T0)的用法
从书上可以知道 T0有多种工作方式,我们这里挑最常用的方式1来讲一下。方式1是16位递增模式。怎么理解?
上面讲了,在机器周期的驱动下,定时器一点一点的计时,每来一个机器周期,单片机就要统计一下数量,并且存储起来,任何用来存储数据的空间都是有容量限制的。这里用来存储机器周期数量的空间叫寄存器(TH0和TL0),16位说的就是这个寄存器的大小(2^16,最大存储的数是 65535),递增的意思就是每来一个机器周期,寄存器里面的数据就加一(不是减一)。那么有个问题,如果机器周期的数量超过了它的容量(65535)那怎么办呢?就会产生溢出(触发定时器0中断),同时寄存器归零。
通过上面的讲解,应该能明白,当寄存器从0开始累计,最大能到65535,也就是最大能计时65535×1us=65535us,也就是65.535毫秒。如果要做其他的计时(小于65535us),就只需要改变寄存器的初始值,比如寄存器的初始值是10000,那么在机器周期的驱动下,寄存器的数据从10000开始往上递增,直到65535,这中间经过的时间就是(65535-10000=55535us)
下面的代码展示了 如何初始化定时器T0并且使用
留一个问题: 如果要计时超过 65535us,怎么办,比如计时1秒