定时/计数器
1、 定时器介绍
1.1、CPU时序介绍
振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期),T = 1/f。
状态周期:1个状态周期含2个振荡周期,用S表示;
机器周期:1个机器周期含6个状态周期,12个振荡周期;
指令周期:一条指令完成所需要的时间,以机器周期为单位。
1.2、原理以及相关寄存器
51单片机定时器/计数器3个特点:
1、有两组定时器/计数器,因为既可以定时,又可以计数
2、定时器/计数器和单片机的CPU是相互独立的。
3、51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。
原理
定时器/计数器16位加1计数器,由高8位和低8位两个寄存器组成。随着输入脉冲信号的更新进行加1,当加到计数器全为1时,再一次接收输入脉冲信号,计数器溢出并置0,并且中断标志位TFx置1,向CPU发出中断请求。如果是定时模式,定时时间已到。如果是计数模式,则计数值已满。加1计数器的计数值 = 溢出时计数器的值 - 计数初值。
1.3、相关寄存器以及内部结构
工作方式寄存器TMOD
低四位是定时器T0,高四位是定时器T1。
GATE:门控卫。
T/C:控制是定时还是计数。0为定时模式,1为计数模式。
M1M0:
00 13位定时/计数器
01 16位定时/计数器(常用)
10 8位自动重装定时/计数器(常用)
11 T0分成两个独立8位定时/计数器,此时T1停止计数。
工作控制寄存器TCON
高四位是定时/计数器的的位数。
2、定时器的使用
2.1、初始化
1、通过TMOD,设置定时/计数器的工作方式,是定时还是计数。改变某一个定时器中断时,采用或运算,不更改其他定时的工作状态。
TMOD |= 0x01;
2、设置THx,TLx的初值,要知道是怎么计算的,实际工程中可借用工具计算。
假定设置1ms,外部晶振频率位12MHz。
机器周期 = 1 / 内部时钟频率;
内部时钟频率 = 外部晶振频率/12 因为51单片机会把外部晶振频率进行12分频
1ms/1us = 1000;
初值 = 65535 -1000 +1 = 64536 在改位16进制。
TH0 = 0xFC; //设置定时1us
TL0 = 0x18;
3、打开IE寄存器相应的中断,EA总中断 ET0定时器0的中断
EA = 1;
ET0 = 1;
4、打开TCON寄存器中的控制位 TR0
TR0 = 1;
3、硬件设计
4、软件设计
功能:实现LED1闪烁1秒
1、中断函数不需要调用?
2、中断函数重复调用吗?i是怎么到达1000的
#include "reg52.h"
typedef unsigned int u16;
5、面试问题
1、 定时器的特殊工作模式有哪些?
00 13位定时/计数器
01 16位定时/计数器
10 8位自动重装定时/计数器
11 T0分成两个8位定时/计数器,此时T1不在计数
2、 定时器中断?
定时/计数器本质是16位加1计数器,由高八位和低八位组成。
3、 定时器PWM?不会
4、 如何实现PWM调速?不会