建议配合本专栏的文章“单片机_第6章 实验”一起使用
目录
6.1 定时/计数器的结构与工作原理
定时/计数的三种方式(不重要)
纯软件定时/计数方法
定时——空循环预定周次,等待预定时间
计数——读取I/O口电平,统计变化次数
表示(左边的图是通过delay函数来实现软件定时/计数的,右边的图示通过main函数里面的if语句来进行定时/计数的。)
基本思路:由CPU统计状态变化次数,待预定结果出现后结束统计。
存在问题:占用过多CPU机时(因此时间不能很长,且在做这个的时候,CPU不能做其他的事情,也十分消耗CPU)
纯硬件定时方法(没有计数)
利用CD4060芯片,定时时长可以达到2.1~6小时,通过改变外面的电阻来改变定时的时间
AD8445B
XLT437定时器芯片
单片机软硬件联合定时/计数方法
图示
定时/计数器的基本原理
定时器的本质是计数器(对时钟脉冲计数),计数器则是对外来脉冲计数。
通过上图,可以看出定时器是反应内部系统时钟脉冲,而计数器是反应外部信号脉冲的。
几种定时方法比较
(1)软件定时:时间精确,且不需要外加硬件电路;占用CPU开销,因此软件定时的时间不宜太长。
(2)硬件定时:定时功能全部由硬件电路完成,不占CPU时间,但需通过改变电路的元件参数来调节定时时间,在使用上不够灵活方便。
(3)可编程定时器定时:通过对系统时钟脉冲的计数来实现的。计数值通过程序设定,改变计数值,也就改变了定时时间,使用起来既灵活有方便。
6.1.1 定时/计数器的基本原理
逻辑开关闭合后,脉冲信号将对加1计数器充值。
若计数器的容量为2^n(n为整数),则当数值达到满计数值后将产生溢出,使中断请求标志TFx进位为1,同时加1计数器清零;如果在启动计数之前将TFx清零,并将一个称为计数初值a的整数先置入加1计数器,则当观察到TFx为1时表明已经加入了(2^n-a)个脉冲,如此便能计算出脉冲的到达数量了。
定时器和计数器的实质都是计数器,差别仅在于脉冲信号的来源不同(定时器是反应内部系统时钟脉冲,而计数器是反应外部信号脉冲的)。
基本工作原理
(12分频 = 1个机器周期→1个计数脉冲)
计数器溢出空间 = 计数器最大空间 - 计数初值
定时时间计算(t与n、a、fosc三个因素有关)
定时时间 t = (计数器最大空间 - 计数初值)×机器周期=(2^n-a)×12/fosc (us)
计数计算(N与n、a两个因素有关)
定时计数值 N = (计数器最大空间 - 计数初值) = (2^n – a )
6.1.2 定时/计数器的结构
51单片机定时/计数器的结构
引脚
2个16位计数器T0 (TH0<字节地址8CH>、TL0<字节地址8AH>)和T1 (TH1<字节地址8DH>、TL1<字节地址8BH>)——加1计数器
2个8位控制寄存器TCON和TMOD——管理、控制定时/计数器的运行
2个外部引脚T0(P3.4)和T1(P3.5)——接入外部脉冲
6.2 定时器的控制
定时/计数器的控制关系(以T1为例)
6.2.1 TMOD寄存器
介绍
TMOD是定时方式控制寄存器(Timer/Counter Mode Control),字节地址为89H(不能位寻址),其定义格式如图。
TMOD的低4位为T0的方式字,高4位为T1的方式字。
TMOD不能位寻址,必须整体赋值。
M1和M0:工作方式选择位
两位可形成4种编码,对应4中工作方式(可以见下图)
C/T:定时和外部事件计数方式选择位*(C<counter,计数器>是高电平有效,T<timer,定时器>(上面有个横杠,电脑上打不出来)是低电平有效)
0:定时器方式。定时器以振荡器输出时钟脉冲的12分频信号(即机器周期)作为计数信号。定时器从初值开始在每个机器周期内自动加1,直至溢出。
1:外部事件计数器方式,以外部引脚的输入脉冲作为计数信号。计数器在外部脉冲信号的负跳变时使计数器加1,直至溢出。
GATE:门控位(具体介绍下面有)
0:定时器计数不受外部引脚输入电平的控制,只受定时器运行控制器(TR0、TR1)控制
1:定时器的计数受定时器运行控制位(TR0、TR1)和外部引脚输入电平(INT0、INT1)的控制。其中TR0和INT0控制T0的运行,TR1和INT1控制T1的运行。
故通常令GATE=0,且无论GATE取何值时,都与TRx有关。
结构图与方式选择位
门控位的介绍
GATE为0时,T1的技术仅由TR1控制,TR1为1时允许T1技术,TR1为0时禁止T1计数;GATE为1时,仅当TR1为1且INT1输入为高电平时才允许T1技术,TR1为0或INT1输入低电平都将禁止T1计数。
工作方式:T0有4种工作方式,T1有3种工作方式,每种工作方式都有定时和计数2种方式,故共有14种组合关系。(因为T0的方式3借用了T1)
举例:
例1:设置T0为定时方式1,允许TR0启动,T1为计数方式0,允许INT1启动,则 TMOD = 1100 0001B =0xc1解析:根据TMOD的每一位的含义,有:
T0为定时方式1:D2=0,M1M0=01T0允许TR0启动:D3=0
T1为计数方式0:D6=1,M1M0=00
T1允许INT1启动:D7=1
因此,TMOD为1100 0001,即TMOD=0xC1。(注意TMOD只能以字节的形式给出,它不可以位寻址)
例2:系统上电默认值为TMOD = 0,则默认状态应为:T0和TI均为定时方式0,允许TR0、TR1启动。
6.2.2 TCON寄存器
部分可见“5.2.2 中断系统”里面的“TCON寄存器”
介绍
TCON为定时/计数寄存器(Timer/Counter Control Register),字节地址为88H,可位寻址。
TCON的定义结构图
位7(TF1):定时器T1溢出标志位
T1溢出时,硬件自动使TF1置1,并向CPU申请中断。当进入中断服务程序时,硬件自动将TF1清0。TF1也可以用软件清0。
位6(TR1):定时器T1运行控制位
由软件置位和清0。
GATE为0时,T1的技术仅由TR1控制,TR1为1时允许T1技术,TR1为0时禁止T1计数;GATE为1时,仅当TR1为1且INT1输入为高电平时才允许T1技术,TR1为0或INT1输入低电平都将禁止T1计数。
位5(TF0):定时器T0溢出标志位。其功能和操作情况同位7
位4(TR0):定时器T0运行控制位。其功能和操作情况同位6
位3~0:外部中断INT1和INT0请求及请求方式控制位,其功能见第5章
注意:系统上电默认值为TCON = 0,则默认状态应为:TR0和TR1均为关闭状态、电平触发方式、没有0# ~3#中断请求
6.3 定时/计数器的工作方式
工作方式
6.3.1 方式1
原理
使用16位定时/计数器(n=16,THx+TLx),满计数值为2^16(M1 M0为01组合时)
逻辑结构图
定时器工作(定时时间、计数初值、最大定时时间、定时范围)
定时时间:t = (2^16- a)×12/fosc (μs)
计数初值:a = 2^16- t×fosc/12
最大定时时间(a=0,fosc =12MHz):t = 2^16(μs) = 65536 (μs)
定时范围为1~65,536 μs(≈65ms)。
计数器工作(定时计数值、最大计数值、最高计数频率)
定数计数值: N = (2^16 – a )
最大计数值:N = 65536 (脉冲)
由于检测一个负跳变需要2个机器周期,即24个振荡周期→最高计数频率=1/24*fosc。
当fosc=12MHz时,外部脉冲的最大允许频率为0.5MHz 。
实例1 设单片机的fosc=12MHz,采用T1定时方式1在P2.0脚上输出周期为2ms的方波。
方法一:查询方式
方法二:中断方式(具体的例题解析将单独发送)
小结
(1)设置TMOD——确定定时/计数器的工作状态
使用T0还是T1?
采用定时模式还是计数模式?
采用工作方式0、方式1、方式2、方式3?
强调:TMOD的设置只能以字节形式给出
(2)计算计数初值——产生期望的定时/定数间隔
定时计数初值 a = 2^16- t×fosc/12
(t ≤65536μs, fosc=12MHz时)
定数计数初值 a = 2^16- N
(N≤65536, 脉冲频率≤0.5MHz,fosc=12MHz时)
装载计数初值:
THx = a / 256 TLx = a / % 256
(3)确定采用何种方式处理溢出结果
若是中断方式→中断初始化设置和中断服务程序:
若是查询方式——采用条件判断语句
(4)启动定时器:TR0 = 1 或 TR1= 1
(5)进行定时或计数结束后的其它工作
(6)为下次定时/计数做准备(清TFx标志+重装载计数初值)
若是中断方式,则无需软件清TFx标志位;
若是查询方式,需要软件清除TFx标志位。
计数实例 用单片机实现一个频率计功能,用于测量接在P3.4引脚的脉冲波频率(<10KHz),并将测量结果显示在数码管上。
6.3.2 方式2
图示
采用8位计数器,TLx
可自动重装载计数初值(TLx溢出后, THx→TLx);
没有装载计数初值的延误(方式1在重设计数初值时会产生实际定时时间延误),方式2定时精度相对较高,适合作为串行口波特率发生器;
延时时间 t = (2^8-a)×12/fosc (微秒) → 12MHz时的最大定时量为256μs。
实例2 采用T0定时方式2在P2.0口输出周期为0.5ms的方波(设fosc=12MHz)。
6.3.3 方式0
使用13位的定时/计数器(THx7-0+TLx4-0)
定时时间 t = (2^13 - a)×12/fosc (μs)
计数初值 a = 2^13 - t×fosc/12
12MHz时的最大定时量t=2^13μs = 8192μs = 8.192ms
例题 计算T0方式0定时5ms的计数初值a(设fosc=12MHz)
解:计数初值a=2^13-5000×12/12=3192= 1100 0111 1000B
由于方式0的TL0高3位未用(一般填0) ,因此 a= 0110 0011 0001 1000 = 6318H
即,TH0 = 0x63; TL0 = 0x18。
比较方式0和方式1
除计数器位数不同外,方式0与方式1的逻辑结构并无差异。
方式0采用13位计数器是为了与早期产品MCS-48单片机兼容。
方式0的初值计算比较麻烦,一般采用方式1替代。
6.3.4 方式3(仅T0有此方式)
通常设定T1定时方式2为串行通信的波特率发生器(如下图)
TH0+TF1+TR1组成的8位定时器(不能计数,且方式2但无重装载功能)
TL0+TF0+TR0组成的8位定时/计数器(方式2但无重装载功能)
T1组成的无中断标志位的定时/计数器(方式0~方式2)
特点:
方式3下T0可有2个具有查询/中断功能的8位定时器;外加1个没有查询/中断功能的T1定时/计数器
T0用作工作方式3时,TT1仍可设置为工作方式0~2(此时没有查询/中断功能)
通常将T1定时方式2作为波特率发生器使用
6.4 定时/计数器的编程和应用
使用方法:
定时器应用——用于定时控制,或作为分频器发生各种不同频率的方波;
计数器应用——用于外部脉冲统计或外部中断源扩充;
定时/计数器复合应用—将定时与计数两种方式结合起来。
实例5(波形展宽) 由P3.4口输入一个低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500μs的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc= 6MHz)。
实例6(长延时、非对称) 采用10MHz晶振,在P2.0脚上输出周期为2.5s,高电平占空比为20%的脉冲信号。
本章小结
1.定时/计数器的工作原理是:利用加1计数器对时钟脉冲或外来脉冲进行自动计数。当计满溢出时,可引起中断标志(TFx)硬件置1,据此表示定时时间到或计数次数到。定时器本质上是计数器,前者是对时钟脉冲进行计数,后者则是对外来脉冲进行计数。
2. 51单片机包括两个16位定时器T0(TH0、TL0)和T1(TH1、TL1),还包括两个控制寄存器TCON和TMOD。通过TMOD控制字可以设置定时与计数两种模式,设置方式0~方式3四种工作方式;通过 TCON控制字可以管理计数器的启动与停止。
3.方式0~方式2分别使用13位、16位、8位工作计数器,方式3具有3种定时/计数器状态。
4.定时/计数器主要编程步骤:
①确定定时/计数器的工作状态,设定TMOD;
②确定计数初值,a= 2^n-t*fosc/ 12,装载计数初值;
③编程方法要点:
中断方式:中断初始化,启动定时器,中断函数,TFx清零,重装载计数初值。
查询方式:启动定时器,TFx判断,TFx清零,重装载计数初值。