一, 学习定时器之前需要明白:
1,51 单片机有两组定时器 / 计数器, 因为既可以定时, 又可以计数, 故称之为定时器 / 计数器.
2, 定时器 / 计数器和单片机的 CPU 是相互独立的. 定时器 / 计数器工作的过程是自动完成的, 不需要 CPU 的参与.
3,51 单片机中的定时器 / 计数器是根据机器内部的时钟或者是外部脉冲信号对寄存器中的数据加 1
4, 有了定时器 / 计数器之后, 可以增加单片机的效率, 一些简单的重复加 1 的工作可以交给定时器 / 计数器处理. CPU 转而处理一些复杂的事情. 同时可以实现精确定时作用
二, 定时计数器 工作原理
定时计数器实质上是一个加 1 计数器. 它随着计数器的输入脉冲进行自加 1, 也就是每来一个脉冲, 计数器就自动加 1,, 当加到计数器为全 1 时, 再输入一个脉冲就使计数器回零, 且计数器的溢出相 应的中断标志位置 1, 向 CPU 发出中断请求(定时 / 数器中断允许时)
如果定时计数器工作于定时模式, 则表示定时时间已到; 如果工作于计数模式, 则表示计数值已满. 可见, 由溢出时计数器的值减去计数初值才是加 1 计数器的计数值.
三, 定时计数器的结构:
由 加 1 计数器(16 位, 即 2 个字节), 由高 8 位和低 8 位两个寄存器 THx 和 TLx 组成.
TMOD 是定时 / 计数器的工作方式寄存器, 确定工作方式和功能;
TCON 是控制寄存器, 控制 T0,T1 的启动和停止及设置溢出标志
四, 定时计数器的控制
51 单片机定时 / 计数器的工作由两个特殊功能寄存器控制. TMOD 用于设置其工作方式; TCON 用于控制其启动和中断申请.
[1] 工作方式寄存器 TMOD
工作方式寄存器 TMOD 用于设置定时计数器的工作方式, 低四位用于 T0, 高四位用于 T1. 其格式如下
1,GATE 是门控位
Δ 当 GATE=0 时, 用于控制定时器的启动是否受外部中断源信号的影响. 只要用软件使 TCON 中的 TR0 或 TR1 为 1, 就可以启动定时计数器工作; (常用此方法)
Δ当 GATA=1 时, 要用软件使 TR0 或 TR1 为 1, 同时外部中断引脚 INT0/1 (如下图 中断系统部分图 )也为高电平时, 才能启动定时 / 计数器工作. 即此时定时器的启动条件, 加上了 INT0/1 引脚为高电平这一条件
2, C/T : 定时 / 计数模式选择位( C/T=0 为定时模式; C/T=1 为计数模式)
3,M1M0 : 工作方式设置位 , 定时 / 计数器有四种工作方式(如下图):
[通常用 方式 1(16 位定时计数器)和方式 2(8 位自动重装定时计数器, 常用于计算频率和串口通信使用)]
[2] 控制寄存器 TCON
TCON 的低 4 位用于控制外部中断(在中断系统已介绍),TCON 的高 4 位用于控制 定时计数器的启动和中断中请. 其格式如下
1,TF1(TCON.7) : T1 溢出中断请求标志位.
T1 计数溢出时由硬件自动置 TF1 为 1.CPU 响应中断后 TF1 由硬件自动清 0.
T1 工作时, CPU 可随时查询 TF1 的状态(TF1 可用作查询测试的标志).
TF1 也可以用软件置 1 或清 0, 同硬件置 1 或清 0 的效果一样.
2,TR 1(TCON6): T1 运行控制位.
TR1 置 1 时, T1 开始工作; TR 置 0 时 T1 停止工作
TR1 由软件置 1 或清 0 (所以, 用软件可控制定时计数器的启动与停止)
3,TF0 (TCON5): T0 溢出中断请求标志位, 其功能与 TF1 类同.
4,TR0 (TCON4): T0 运行控制位, 其功能与 TR 1 类同.
三, 定时计数器的工作方式
[1] 方式 0 (13 位计数)
1, 若为定时器 T1: 由 TL0 的低 5 位 (高 3 位未用) 和 TH0 的 8 位组成 ;
TL0 的低 5 位溢出时, 向 TH0 进位; TH0 溢出时, 置位 TCON 中的 TF0 标志(置 1), 向 CPU 发出中断请求.
2, 若为定时器 T2:TH1 溢出时, 置位 TCON 中的 TF1 ( 与定时器 T1 类同)
♦定时器模式
Δ计算公式: N=t/Tcy ; 计数初值计算的公式为: X=2^13-N.(定时器为 13 位)
定时器的初值还可以采用计数个数直接取补法获得.
Δ计数模式时, 计数脉冲是 T0(单片机 P3 口的 T0 引脚)上的外部脉冲.
Δ门控位 GATE(有特殊的作用):
当 GATE=0 时, 经反相后使或门输出为 1, 此时仅由 TRO 控制与门的开启, 与门输出 1 时, 控制开关接通, 计数开始;
当 GATE=1 时, 由外中断引脚信号控制或门的输出, 此时控制与门的开启由外中断引脚信号和 TRO 共同控制. 当 TRO=1 时, 外中断引脚信号 引脚的高电平启动计数, 外中断引脚信号 引脚的低电平停止计数.(此方式常用
来测量外中断引脚上正脉冲的宽度)→看下图
[2] 方式 1(计数位数是 16 位)
定时器 T1: 由 TLO 作为低 8 位, THO 作为高 8 位, 组成了 16 位加 1 计数器(定时器 T2 类同)
计数个数与计数初值的关系: X=2^16-N
[3] 方式 2 (自动重装初值的 8 位计数方式)
计数个数与计数初值的关系: X=2^8- N . (该方式适合用作较精确的脉冲信号发生器)
[4] 方式 3 (只适用于定时计数器 T0)
定时器 T1 处于方式 3 时, 相当于 TR1=0, 停止计数
工作方式 3 将 T0 分成为两个独立的 8 位计数器 TL0 和 TH0
三, 使用定时器的程序
初始化程序应完成:
1, 对 TMOD 赋值, 以确定 T0 和 T1 的工作方式(以及方式 0,1,2,3? 定时器还是计数器模式?)
2, 计算初值, 并将其写入 TH0,TL0 或 TH1, TL1
3, 中断方式时, 则对总中断 EA 赋值, 开放定时器中断
4, 使 TR0 或 TR1 置位, 启动定时计数器 定时或计数
五, 与 CPU 时序有关的知识
振荡周期: 为单片机提供定时信号的振荡源的周期( 晶振周期或外加振荡周期)→T(振荡) =1/ f= 1/12MHZ
状态周期: 2 个振荡周期为 1 个状态周期, 用 S 表示. 振荡周期又称 S 周期或时钟周期 .→T(状态)=1/6MHZ
机器周期: 1 个机器周期含 6 个状态周期, 12 个振荡周期. → T(机器)=12/12MHZ = 1 us (微秒)
指令周期: 完成 1 条指令所占用的全部时间, 它以机器周期为单位
六, 计数器初值的计算
1, 机器周期也就是 CPU 完成一个基本操作所需要的时间
2, 机器周期 = 1 / 单片机的时钟频率
3,51 单片机内部时钟频率是外部时钟的 12 分频. 也就 是说当外部晶振的频率输入到单片机里面的时候要进行 12 分频. 比如说你用的是 12MHZ 的晶振, 那么 单片机内部的时钟频率就是 12/12MHZ, 当你使用 12MHZ 的外部晶振的时候. 机器周期 = 1/1M=1us.
4, 定时 1ms 的初值是多少呢, 1ms/1us=1000. 也就是要计数 1000 个数, 初值 = 65535-1000+1(因为实际上计数器计数到 66636 才溢出)=64536(十进制)=FC18H (十六进制)
单片机工作方式为 1 由公式 X=2^16-N (N = 1000)得 X= 65536 - 1000=64536
定时计数器
来源: http://www.bubuko.com/infodetail-3529618.html