几个相关的概念:
1、时钟与机器周期
时钟电路是计算机的心脏,它控制着计算机的工作节奏。时钟信号的频率称为振荡频率或时钟频率。振荡频率的倒数为振荡周期。
规定了每个机器周期包括6个状态周期(用s)表示,每个状态周期划分为两个节拍,分别对应着两个节拍时钟的有效期间。因此,一个机器周期有12个振荡周期,分别为S1P1、S1P2、S2P1…….S6P2
i. 与定时器、计数器有关的寄存器
方式寄存器TMOD
D7 GATE | D6 C/T | D5 M1 | D4 M0 | D3 GATE | D2 C/T | D1 M1 | D0 M0 |
定时器方式和外部事件计数方式的差别是计数脉冲源和用途的不同,C/T的实质是选择计数脉冲源。
对外部输入脉冲计数的目的通常是为了测试脉冲的周期、频率或对输入的脉冲数进行累加。
△ 计算脉冲的周期、频率是否用到了输入捕捉方式?
GATE=1时。定时器的计数受外部引脚输入电平的控制。
GATE=0时,定时器的计数不受外部引脚输入电平的控制。
INTO控制T0的计数,INT1控制T1的计数。
控制寄存器TCON
D7 TF1 | D6 TR1 | D5 TF0 | D4 TR0 | D3 IE1 | D2 IT1 | D1 IE0 | D0 IT0 |
特殊功能寄存器TCON的高4位为定时器的计数控制位和溢出标志位,低4位为外部中断的触发方式控制位和锁存外部中断请求源。
TR0:定时器T0的运行控制位。由软件置位和清“0”
GATE | TR0 | INTO | T0的运行状态 |
0 | 1 | X | 允许T0计数 |
0 | 0 | X | 禁止T0计数 |
1 | 1 | 1 | 允许T0计数 |
1 1 1 | 1 0 0 | 0 1 0 | 禁止T0计数 |
△ 加入GATE=1时,引入INTO信号的目的是什么?
TF0:T0的溢出标志:TF0可由程序查询和清“0”。 TF0也是中断请求源,当CPU响应T0中断时由硬件清“0”TF0。
TR1、TF1类是TR0、TF0
T2的状态控制寄存器
D7 TF2 | D6 EXF2 | D5 RCLK | D4 TCLK | D3 EXEN2 | D2 TR2 | D1 C/T2 | D0 CP/RL2 |
ii. 工作方式
51系列单片机定时器T0有四种工作方式:方式0、方式1、方式2、方式3
定时器T1有三种工作方式:方式0、方式1、方式2
52系列单片机除拥定时器T0、T1外还有定时器T2
定时器T2有三种工作方式:捕捉方式、常数自动再装入方式和串口的波特率发生器方式。
方式0:13位的定时器/计数器
如定时器T0,方式0为13位计数器,由TL0的低5位与TH0的8位组成,TL0低5计数溢出时向TH0进位,TH0计数溢出时置“1”溢出标志TF0。定时器T0方式0的结构框图见教材P115。
定时器初值计算公式:设计数初值为a,则T=12/fosc×(213-a)us
方式1:16位的定时器/计数器
基本类同方式0
方式2:常数自动重新装入的8位定时器/计数器
方式2为自动恢复初值的8位计数器。TL0作为8位计数器,TH0作为计数初值寄存器。当TL0计数溢出时,计数器完成两项工作。①置位“1”溢出标志TF0,向CPU请求中断②将TH0内容送TL0,使TL0从初值开始重新加1计数。
T0工作于方式2定时,有点:精度比较高;缺点:定时时间小
T=12/fosc×(28-a)
分析:T0工作于方式0和方式1时,定时产生误差的原因?
T0工作于方式0、方式1,初值a是由中断服务程序恢复,而CPU响应T0溢出中断的时间随程序状态的不同而不同。
(CPU执行指令不同或者在执行其他中断程序都影响响应时间)
CPU响应中断之前T0从0开始继续计数,CPU响应中断时又从初值开始计数,这样是定时产生误差。
△ 误差来源即是T0从0开始计数到T0再次从初值开始计数这之间少计的脉冲。
方式3:仅适用于T0,两个8位计数器
T1设为方式3时,停止计数。T0分为两个独立的8位计数器TL0和TH0.
TL0使用T0的所有状态控制位GATE、TR0、INT0(P3、2)、T0(P3、4)、TF0
TH0被固定为一个8位定时器方式,使用T1的窗台控制位TR1、TF1。
一般情况下,只有当T1用于串行口的波特率发生器时,T0才在需要时选工作方式3,一增加一个计数。
此时T1的运行由方式来控制,方式3停止计数,方式0~2允许计数,计数溢出时不置“1”标志TF1。定时器T1作为波特率发生器时,应禁止T1中断。T1工作于定时方式(C/T=0),计数脉冲为振荡器的十二分频信号。也可以选择外部T1(P3-5)上的输入脉冲作为T1计数信(C/T=1).T1的溢出率又和它的工作方式有关,一般选方式2定时。
△ 其实只能选择方式2作为计数器(定时方式)的工作方式,因为方式2是自动重装初值的方法。由于计数溢出时并不置位“1”标志TF1,CPU不响应中断,方式0、方式1重赋初值一般都放在中断服务程序中,所有计数器在溢出后总是从0开始计数,由此而得到波特率便不是我们所涉及要求的(为2SMOD×fosc/32×12×256)
T1的溢出率如何和波特率发生联系?
By:霜月孤鸟
2016.2.24