天津大学智能车队阶段一第三部分培训内容主要包括:
1、回顾上节课内容;
2、定时器中断演示。
3、定时器原理和定时器中断介绍。
(1)方式0
(2)方式1
(3)方式2
(4)方式3:省略。
1、定时器/计数器意义和作用:
1、时间对于单片机的运行来说非常重要,时钟信号相当于单片机的心脏,正常情况下单片机的时钟是稳定不变的,每一句代码运行的时间也都是固定的(汇编语言),但特殊情况下也可以超频或者降频运行,就好比人剧烈运动起来了心脏跳得更快一样,此时单片机每句代码运行的时间缩短,表现出来效果就是单片机速度提升了。
2、定时器是单片机集成的一个模块,跟人在内心默念计时有一定的区别,定时器是独立于程序的运行的,他只在特定时间到达后发出中断请求才能打断主程序的运行。
定时器模块有两个功能,一个是定时使用,相当于另外有一个人在数着你的心跳来计时,到达一定时间后告诉你,吸引你的注意力,如果你的定时器中断允许标志位打开了,你就会被他吸引,也就是主程序被打断转去执行中断服务函数(当然,还有中断优先级的问题)。另一个是计数器,模块有对应的引脚,该引脚可以输入脉冲,而模块可以记录脉冲个数,脉冲个数到达设定的值也可以产生中断。
作用:
1、像例程一样当定时器使用来控制LED灯的亮灭时间,而且不影响主程序的运行。
2、电机测速,位移需要对时间求导。(计数器+定时器)
3、PID算法的误差对时间积分。
4、保证系统的控制周期是一定的,对算法有好处。
5、很多传感器如超声波和编码器输出信号都是脉冲方波。
2、定时器/计数器的结构
图中振荡器(晶振)与(/12)部分构成振荡器分频输入电路,Ti为计数器外部输入引脚,C/T反为计数器脉冲选择端,反相器、或门、与门及启/停电路C构成计数器启停电路,THi、TLi为加1计数器,TFi为中断标志位。此外,还涉及一个方式寄存器TMOD和一个8位的控制寄存器TCON,用于选择、控制及反应定时器/计数器的工作模式、启动方式及相关参数的状态。
3、工作原理
定时器/计数器实质上是一个加1计数器,它可以工作于定时器方式,此时输入脉冲是系统固定的机器周期(晶振脉冲频率12分频后是机器周期),也可以工作在计数器模式,此时输入的脉冲就是外部脉冲。
注意:计数器模式下外部输入的最高脉冲频率有限制。因为一个脉冲周期必须要能被单片机检测至少两次才能判断出这个周期里存在跳变沿。
4、工作方式
每个定时器T0和T1都有四种工作方式,分别是方式0,方式1,方式2,方式3.
方式0:(13位计数器最大计数值8192)
1、THi提供高8位,TLi提供低5位(高3位未使用)!
要读当前计时时间:Time = (THi <<8) +TLi;
2、需要软件重装初值,否则下一次计数从0开始。
3、中断标志位TFi硬件自动清零。
方式1:(16位计数器最大计数值65536)
1、THi提供高8位,TLi提供低8位
2、需要软件重装初值,否则下一次计数从0开始。
3、中断标志位TFi硬件自动清零。
方式2:(8位计数器最大计数值256)
1、TLi用于进行计数工作,THi用于存放计数初值并保持不变,
2、中断标志位TFi硬件自动清零。
方式3:(8位计数器可用于配置串口波特率)
省略。
5、配置方式
涉及寄存器:TMOD(8位) TCON(8位)
TMOD:
GATE:门控制位。用于启、停操作方式的选择。
C/T反:计数器/定时器方式选择。
M1,M0:模块工作方式选择位。
注意:不允许位寻址!!!!
TCON
TFn:溢出中断标志位。
TRn: 运行控制位(1:启动定时器。0:关闭定时器)
(低四位是外部中断的)
可以位寻址。
定时器启动开关:
GATE为0时:定时器/计数器启停由TRi的状态(1/0)来决定。
GATE为1时:定时器/计数器启停必须有TRi和INTi同时为1才能启动。(可通过引脚来控制定时器的启动)
THi
计数寄存器高8位
TLi
计数寄存器低8位
6、计数初值计算
定时方式下:
tOV为所需定时时间:
t O V = ( 2 n − N ) ∗ t tOV= (2^{n}-N)*t tOV=(2n−N)∗t
其中t为机器周期:
t = 12 / f o s c t = 12/fosc t=12/fosc
计数方式下:
N为要求计数的次数:
N = 2 n − X N = 2^{n} - X N=2n−X
7、使用定时器/计数器步骤
1、根据需要选择工作方式(M1,M0)
2、根据需求选择启动定时器还是计数器(C/T反)。
3、根据需求选择定时器/计数器启停方式(GATE)。
4、将步骤1、2、3涉及的bit拼成8位长度的数,赋值给TMOD寄存器。
5、(定时器)根据需求和工作方式计算计数寄存器初值,分别赋值给THi和TLi。
6、(计数器)根据需求和工作方式计算计数寄存器初值,分别赋值给THi和TLi。
7、打开定时器中断:ETi = 1
8、启动定时器:TRi = 1(根据GATE的值做考虑,见上述)
9、打开全局中断:EA = 1
10、书写定时器中断服务函数(T0中断号为1,T1中断号为3)
11、在中断服务函数里重新赋初值。
(12、在中断服务函数里清中断标志位TFi = 0)
例程
#include<reg52.h>
sbit LED=P0^0;
sbit button = P3^2;
int T0_delay = 0;
char button_flag = 0;
void main()
{
TMOD = 0x01; // 0000 0001 方式1
TH0 = 0x00; //2^16×(12 / 11.0592*10^6) 最长定时约为71ms
TL0 = 0x00;
ET0 = 1;
TR0 = 1;
EA =1; //总中断开关
while(1)
{
if(button == 0 && button_flag == 1)
{
LED=~LED;
}
else
{
button_flag = 1;
}
}
}
void T0_ISR(void) interrupt 1
{
TF0 = 0;
TH0 = 0x00;
TL0 = 0x00;
T0_delay ++;
if(T0_delay > 50)
{
LED=~LED;
T0_delay = 0;
}
}