本文主要是介绍51单片机硬件定时器设定的初值问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
网上查了很多解释关于51单片机硬件定时设定的文章,发现说的不是特别透彻,可能大家觉得一些类似基本感念的问题就不用澄清了,所以对于我这样的入门小白理解起来有些障碍,这里我把自己的理解解释的细致多一些,希望能给同道中人一些帮助。
说到定时前需要澄清几个概念:震荡周期,状态周期,机器周期,指令周期。(学习什么知识概念必须掌握清楚,否则就“糊”了!)
震荡周期:(来自百度百科)在单片机系统中,定时器需要借助单片机内部提供的脉冲进行定时,此时,定时的依据是CPU提供的周期性振荡,振荡一次所需的时间称为振荡周期。单片机系统也可以通过外部晶体振荡器(也被称为晶振)提供振荡进行工作。
对于震荡周期的理解:计算机系统中通常需要同时处理多个任务,想要协调这些任务,就必须在制定一个时间基准。电影里有这么一个场景:在执行一项特殊任务前,特种部队的每个成员需要“对表”,其实就是这个道理。因为这个时间基准是最基本的时间依据,所以它的周期是最短的,频率是最快的(周期和频率的概念请大家自行学习),同时也是最小的时间单位。为了产生这个震荡周期的时间基准,人们使用两种方法,一种是采用CPU内部的基础电路(比如LC振荡电路)实现,另外一种是采用晶体(石英)本身的物理特性实现,采用外部晶振比采用CPU内部基础电路可以提供更加准确、稳定的时间基准。
物理指标:振荡频率 f_osc,单位MHz(兆赫兹),f 是英文 frequency(意为频率)的首字母,osc是英文oscillation(意为震荡)的首字母。 f_osc就指的是晶振的振荡频率,晶振做好后这个频率就固定了。现实中,会根据需要制作拥有不同频率的晶振,比如常用的有12MHz的晶振,还有11.0592MHz。
震荡周期的计算:震荡周期为震荡频率的倒数,例如晶振的 f_osc 为12MHz,震荡周期 秒,可见是一个非常短的时间。
状态周期:网上貌似没有十分明确的解释,这里我也不瞎编了,参考其他博主的解释我理解是CPU执行一次动作所需的时间,比如CPU执行读寄存器、写寄存器这些动作时就要改变状态,可以参考《汇编语言》中对微机执行指令的介绍。
记住一个状态周期=2个震荡周期。
机器周期:我理解是CPU执行一个“任务”所需的单位时间,可以对照状态周期中解释过的“动作”的概念,一个“任务”是由若干次“动作”组成的。以51单片机为例,一个机器周期包括了6个状态周期,即12个震荡周期,此时会发现如果使用12MHz的晶振,机器周期就是1微秒(妙啊!)。其实晶振的设计是根据计算机硬件执行“任务”或者“动作”这些“固定”时间进行设计的。
指令周期:就是CPU执行一条指令所需要的的时间,即1~4个机器周期。
有了以上这些概念再说定时器的初值设定就会理解了。
说到定时器,也可以说是计数器,在硬件上就是一组8位或者16位的寄存器,既然位数是有限个,就存在计时的时候超出范围的问题,被称为“溢出”。由此这些寄存器之外又设置了一个单独的内存空间来判断计时器工作时是否超出范围,这个单独的内存空间被称为“溢出标志寄存器”,溢出后“标志寄存器”由0变为1,计时器的各个位返回0,就像一个人在操场上长跑,跑完一圈又回到原点,但是自己心里数着已经跑过的圈数。
对于51单片机,当计时器溢出时,触发中断(中断的概念请自行学习),执行中断程序。正是这个机制,可以使我们对计算机设定一个我们需要的时间,在这个时间计时完毕后执行我们需要的一些任务,这些任务可以写在中断程序当中。
当使用8位计时器时,溢出的最大值为2的8次方,即256,就是说计时器从0开始计数,再回到0,一共数了256次。对于16位计时器来讲,从0开始计数到溢出时一共数了65536次。以8位计时器为例,如果我们需要计时器计数10次后产生中断,我们需要计时器从256-10=246开始计数,如果我们需要计时器计数100次后产生中断,我们需要计时器从256-100=156开始计数,其中246和156就是这篇文章所要解释的“初值”。因此如何设定初值,取决于我们想要计时器数过多少数,这个“数过多少数”就是我们需要的“计数次数”。对于16位寄存器,它是由“高8位寄存器”和“低8位寄存器”一起组成的,所以设置初值时需要分别设置这两个寄存器。
如果我们把“计数次数”和“时间”建立起联系,就可以实现真正的“计时”而不是“计数”了,51单片机的计时器每记一个数所需要的的时间就是一个机器周期!即1微秒(这里用外部12MHz晶振,采用12分频),所以对于8位计时器,从0开始经过256微秒后溢出,对于16位计时器,从0开始经过65536微秒后溢出。当我们需要1毫秒后计时器溢出而执行中断时,采用16位寄存器进行的时间计算就是65536-1000=64536,初值就是64536。
以上是我对计时器与中断机制的粗浅理解,如果有误,请斧正。
这篇关于51单片机硬件定时器设定的初值问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!