前言
在程序运行中,我们有着去定时运行某一功能的需求,或许1s、或许0.5s。如果使用delay函数,必然导致会使得其他任务阻塞。使用定时器对于程序的精准计时有着很大作用,获取去达到计时的目的,也可以使用定时器,如超声波的测距方式。
我们生活中采用秒等单位作为生活中的基本单位,而秒的详细定义为
铯-133原子位于海平面处于非扰动基态时两个超精细能级间跃迁对应的辐射频率ΔνCs以Hz(即等于s-1)为单位表达时选取固定数值9192631770倍来定义秒
其铯-133原子的辐射频率的9192631770为1s
时钟源
单片机内部当然不可能使用铯原子作为计时的时钟源,通常是采用石英晶振制成的一种谐振器件,其时钟频率为其固有属性,只受到自身影响。
通过与51单片机的XTL1和XTL2引脚构成一个皮尔斯振荡器,通过内部时钟电路的整形调整,向单片机提供稳定的时钟频率。若为有员晶振直接将时钟引脚接到XTL1引脚。
常用于单片机的晶振频率有11.0592MHz,12MHz等,为什么会有11.0592这么特殊的晶振频率呢,这涉及到通信的问题,这里暂不引入。
12MHz表示以Hz(即等于s-1)为单位表达时选取固定数值12000000倍为1s。
当然,如果我们使用计数器模式,时钟源便为外部引脚的电平变化,分别是连接51单片机的 P3.4 P3.5 两个口。
周期
时钟周期
其时钟周期是指振荡源的周期,定义为时钟脉冲的倒数。
外部晶振12M
则时钟周期为 1s/12M = 1S/12 000 000 = 1/12us
外部晶振11.0592M
则时钟周期为 1s/11.0592M = 1S/11 059 200 = 1/11.0592us
外部晶振24M
则时钟周期为 1s/24M = 1S/24 000 000 = 1/24us
机器周期
机器周期,是指执行一单位指令所需要的 时钟周期 个数。
机器周期也称为CPU周期。
在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。
一般情况下,一个机器周期由若干个时钟周期组成。 如 1T,就表示,需要 1个时钟周期; 12T 即为 12个时钟周期。 这些都只是
一单位指令的时间(如自增、自减等),多单位指令时间进行倍乘(如赋值语句需要2个机械周期,即乘以2倍),
传统的8051单片机就是12T的,即完成1个单位指令所需时间为12个时钟周期 。 1T的完成1个单位指令所需时间则为1个机器周期。
传统的8051使用12Mhz晶振的机器周期是,1T的要比12T的速度更快,而STC89C51RC系列支持6T模式,相当于速度翻倍。
1T 12Mhz的机器周期为1/12us
12T 12Mhz的机器周期为1us
指令周期
CPU完成一条指令的时间叫指令周期
一般一条完整的指令包括:取指周期、间址周期、执行周期、中断周期。
寄存器
在使用定时器时,我们需要对定时器/计数器的初始化。
第一步,开中断,对IP和IE赋值。
第二步,配置模式,对TMOD赋值。
先确定定时器还是计数器,TMOD中有相应的控制位 [ C/T ]来选择T0或T1为定时器还是计数器.
在将控制位GATE打开,最后配置模式位M0,M1,两位可配置4种模式。
- 定时器/计数器0模式选择 13位定时器/计数器,兼容8048定时模式,TL0只用低5位参与分频,TH0整个8位全用。
- 16位定时器/计数器,TL0、TH0全用
- 8位自动重装载定时器,当溢出时将TH0存放的值自动重装入TL0 定时器0此时作为双8位定时器/计数器。
- TL0作为一个8位定时 器/计数器,通过标准定时器0的控制位控制。TH0仅作为一个 8位定时器,由定时器1的控制位控制。
定时器/计数器的核心部件是一个加法(也有减法)的计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同: 如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟得到一个计数脉冲,计数值加1; 如果计数脉冲来自单片机外部引脚(T0为P3.4,T1为P3.5),则为计数方式,每来一个脉冲加1。
由于8051单片机为8位单片机,寄存器最多为8位,计数周期太小。
通过两个寄存器组成16位寄存器(实际还是俩),其16位最多可计时 216 个机器周期,12T,12Mhz下为 65,535us。
当开启定时器后,16位计时器每个机器周期值自加,全为1时触发中断,执行中断程序,根据是否在使用定时器再将值写入16位寄存器,学习单片机嵌入式,元器件有需求可以去唯样商城看看,学生还有优惠哦。
初值计算
TL表示低8位。TH表示高八位。
其值为
0XFFFF -(初值(单位:s)/1s)*(晶振频率/12)
mg-FbIwNyO6-1662442062961)]
初值计算
TL表示低8位。TH表示高八位。
其值为
0XFFFF -(初值(单位:s)/1s)*(晶振频率/12)
其初值计算可用相应的工具,如STCISP就自带计算,但我们要理解其相应的工作方式。