上一节,稀里糊涂地照着demo测试了定时计数的效果,但对内部和参数的控制还是不解,准备从基础原理学习定时计数器的工作原理和方式。
8051单片机的结构是由一内部总线连接各功能模块,通过特殊功能寄存器(SFR)集中控制,不同型号引脚定义和SFR定义不同,因此一个功能模块,可以从相关引脚功能和相关SFR功能学习了解该模块。
以8051为例,其定时计数模块的特点有
2个16位定时计数器,最大计数范围:0H-FFFFH;
相关的SFR:TMOD、TCON、TH0、TL0、TH1、TL1;
相关引脚:T0、T1、INT0、INT1;
4种工作方式;
其中,T0、T1做为计数脉冲输入,定时方式时不用,作I/O用,对应P3.4和P3.5;
INT0、INT1:与定时器运行控制有关,也可以无关,可编程设定;
模式寄存器TMOD(SFR的地址:89H,不可按位寻址)
GATE选通门:GATE=0时,只要TRx=1,计数器就开始工作;GATE=1时,只有INTx脚和TRx同时为1时,计数器才开始工作,主要用于测量INTx脚上高电平脉冲的宽度。
C/T(计数/定时方式选择位):C/T=1时,计数方式,即计数器的计数脉冲来自T0或T1引脚的外部事件,C/T=0时:定时方式,计数脉冲来自内部振荡频率12分频(1/12)。
M1、M0模式选择:分别对应四种模式
M1MO=00,方式0:13位定时计数器;
M1M0=01,方式1:16位定时计数器;
M1M0=10,方式2:自动重装入的8位定时计数器;
M1M0=11,方式3:T0成为两个独立的8位计数器;
模式 计数模 最大计数值 最大定时时间
模式0 2^13 8192 8.192ms
模式1 2^16 65536 65.536ms
模式2,3 2^8 256 0.256ms
根据上面的参数,可以得到一个公式
定时时间=(最大计数值 - 计数初始值) * 脉冲周期
控制寄存器TCON(SFR地址:88H)
TF1,TF0定时器T1,T0的溢出标志:计数器溢出时硬件自动置位,即TFx=1,进入中断后再由硬件自动清除;
TR1,TR0计数器T1,T0的控制位:由软件置位(计数器开始工作)或清零(计数器停止工作);
IE1,IE0外部中断INT1,INT0的请求标志:当单片机检测到INTx引脚上有低电平或下降沿时,IEx=1,申请中断;
IT1,IT0外部中断触发类型控制:ITx=1时,外部中断信号的下降沿触发IEx标志,ITx=0时,外部中断信号的低电平触发IEx标志;
回到定时计数功能上,要搞清以下问题
1.何时控制启动、停止计数;
2.如何控制定时还是计数;
3.如何控制定时/计数的长短;
4.如何用查询或者中断管理溢出事件;
定时/计数器运行控制方式
1.设置GATE=0,则非GATE=1,因此Y=TR0,这样:
TR0=1,启动定时器T0运行
TR0=0,停止定时器T0运行
我们把这种控制定时器运行的方法叫软触发,最常用。
2.设置GATE=1,则非GATE=0,因此Y=TR0*(非)INT0电平,进上步令TR0=1,则Y=非INT0电平,这样:
非INT0为高电平,启动定时器T0运行
非INT0为低电平,停止定时器T0运行
我们把这种控制定时器运行的方法叫硬触发,较少用,可以用来测量正脉冲的宽度。
定时器/计数器的初始化方式
1.根据要求给模式寄存器TMOD送一个模式控制字设定定时器的工作方式;(要考虑定时/计数范围/重装方式)
2.根据需要给C/T送初值以确定需要的定时时间或计数次数;(默认为0)
3.根据需要给中断允许寄存器IE送中断控制字,以开放相应的中断和设定中断优先级;(可选)
4.给TCON送命令字以启动或禁止C/T的运行
单片机控制C/T的方式
1.采用查询方式:程序一直检测TF0(或TF1),若TF0=1(或TF1=1),说明定时时间到或计数满,从而开始相应处理,如
while(TF0==0); //或while(!TF0)
TF0=0; //清除标志位
...... //开始处理溢出事件
2.采用中断方式:程序初始化时,设置定时器溢出中断允许后,内部硬件自动检测到TF0=1(或TF1=1)时,自动响应中断,进入中断服务程序。
下面通过几个例子,来验证一下上面的知识点。