6.1概述
定时/计数需求实现方式:
- 软件延时:
 - 优点: 无额外的硬件开销,时间比较精确。
 - 缺点: 牺牲了CPU的时间。
 
- 可编程定时器/计数器:
 - 特点: 通过软件编程来实现定时时间的改变,通过中断或查询方法来完成定时功能或计数功能。
 
定时器/计数器的核心与功能:
- 核心: 是一个加1计数器。
 
- 计数功能: 对外部脉冲下降沿计数,外部脉冲频率不能高于振荡脉冲频率的1/24。
 
- 定时功能: 对内部时钟脉冲计数来实现定时,计数频率为振荡脉冲频率的1/12 (每个机器周期计数器加1)。
 
- 设定与控制: 定时和计数功能的设定和控制通过软件来设定。
 
6.2定时器/计数器T0、T1
基本组成:
- 计数器: TH0、TL0和TH1、TL1。
 
- 特殊功能寄存器: TMOD、TCON。
 
- 时钟分频器
 
- 输入引脚: T0、T1。
 

相关特殊功能寄存器详解 ❗
这一部分呢其实在Chapter5中断的章节就讲过了
TMOD (工作方式控制寄存器,MOD for mode)❗
- 地址与寻址: 89H,不能位寻址。
 
- 结构: 低4位定义T0,高4位定义T1。
 

- 位定义:
 - GATE (门控位)
 GATE=0: 以运行控制位TR0或TR1启动定时器。GATE=1: 定时器除了受TRx控制之外,还受的控制- C/T̅ (定时方式或计数方式选择位)
 C/T̅=0: 定时工作方式,对内部系统时钟脉冲计数C/T̅=1: 计数工作方式。 对来自外部引脚(如P3.4/T0、P3.5/T1)的脉冲进行计数- M1、M0 (工作方式选择位)
 00: 方式0 (13位计数器)。01: 方式1 (16位计数器)。10: 方式2 (自动重装载的8位计数器)。11: 方式3 (分为两个8位计数器, 停止计数)。
这里也就涉及到了引脚复用,也就是P3.4、P3.5的第二功能
复位时
TMOD=00H,也就是所有寄存器默认工作在方式0,工作于定时器模式。TCON (控制寄存器,CON for control)❗
对应的事件触发TCON置位;TCON对应的位去请求对应的中断
位地址  | 8FH  | 8EH  | 8DH  | 8CH  | 8BH  | 8AH  | 89H  | 88H  | 
位符号  | TF1  | TR1  | TF0  | TR0  | IE1  | IT1  | IE0  | IT0  | 
- 地址与寻址: 字节地址88H,位寻址地址为88H~8FH。
 
- 外部中断控制
 IT0(TCON.0): 外部中断0触发类型选择位。IT1(TCON.2): 外部中断1触发类型选择位。- 1 代表 脉冲触发方式 (负跳变有效)。
 - 0 代表 电平触发方式 (低电平有效)。
 IE0(TCON.1): 外部中断0标志位。IE1(TCON.3): 外部中断1标志位。
- 定时器控制
 TF1(TCON.7): T1的溢出标志,溢出时内部硬件置位。TR1(TCON.6): T1运行控制位 (0为停止, 1为启动)。TF0(TCON.5): T0的溢出标志,溢出时内部硬件置位。TR0(TCON.4): T0运行控制位 (0为停止, 1为启动)。
T0/T1的数据寄存器: 
- TH1 (8DH), TL1 (8BH), TH0 (8CH), TL0 (8AH)。
 
- 复位后全自动清零。
 
定时器/计数器中断相关寄存器:
- 中断允许寄存器IE:
 EA: 中断允许总控制位。ET0, ET1, ET2: T0, T1, T2的中断允许控制位 (0禁止, 1允许)。
- 中断矢量:
 - 定时器T0: 000BH
 - 定时器T1: 001BH
 
- 中断优先级寄存器IP:
 PT0, PT1, PT2: T0, T1, T2中断优先级控制位 (0低优先级, 1高优先级)。
T0、T1的工作方式详解❗❗
方式0: 13位定时器/计数器 (M1=0, M0=0) ❗

- 计数结构: THx高八位和TLx的低5位构成,TLx高3位未用。
 
- 计数范围: 1∼。
 
- 定时范围: 1∼ 个机器周期。
 
- 定时时间计算: ( - 计数初值) × 机器周期。
 
方式1: 16位定时器/计数器 (M1=0, M0=1) ❗

- 计数结构: THx高八位和TLx的低8位 (16位) 组成。
 
- 计数范围: 1。
 
- 定时范围: 1 个机器周期。定时时间计算: ( - 计数初值) × 机器周期。
 
【示例: 计算50ms定时时间所需的计数初值】
基于51单片机12MHz晶振的条件,我们来计算50ms定时所需的计数初值:
- 计算机器周期: 1个机器周期 = 12/12MHz = 1μs
 
- 50ms需要的机器周期数: 50ms = 50,000μs = 50,000个机器周期
 
- 计数初值计算: 65536 - 50000 = 15536 (3CB0H)
 
因此,TH0 = 3CH,TL0 = 0B0H
方式1定时是不精确的,因为每次溢出到重装载之间还有一定时间
方式2: 自动重装载的8位定时器/计数器 (M1=1, M0=0) ❗

- 特点:
 - TLx作为8位计数寄存器,THx作为8位计数常数寄存器。
 - TLx计数溢出后申请中断,同时THx的内容重新装入TLx中。
 - 适用于串行口波特率发生器。
 
【例题】请根据注释,完成对定时器T1的初始化,使其工作在方式2(8位自动重装载),用于产生特定的波特率。
方式二定时是最精确的
方式3: T0分为两个8位计数器 (M1=1, M0=1) ❗

- T0在此方式下的配置:
 - TL0: 作为8位定时器/计数器,占用T0的GATE、INT0、TR0、T0引脚 (P3.4)、TF0标志位以及T0的中断矢量 (000BH)。
 - TH0: 构成的8位定时器只能作为定时器使用,占用T1的TR1运行控制位、TF1溢出标志位及T1中断矢量 (001BH)。
 
- T1在此方式下的状态:
 - 可选工作方式: 0、1或2。
 - 功能限制: 由于TF1及T1中断矢量被TH0占用,T1仅能作为波特率发生器或其它不需要中断的场合。
 - 串行口应用: 作串行口波特率发生器时,T1的计数输出直接送至串行口。
 

定时器/计数器T2 (简介)
- 核心特性: 16位定时器/计数器,具备自动重装载和捕获能力。
 
- 3种工作方式:
 - 自动重装载
 - 捕获
 - 波特率发生器方式
 
- T2相关专用寄存器:
 - T2CON (控制寄存器): 地址C8H, 可位寻址。
 TF2(T2CON.7): T2溢出标志,特定条件下需软件清除。EXF2(T2CON.6): T2外部标志,特定条件下置位并申请中断,需软件清除。RCLK, TCLK(T2CON.5, T2CON.4): 串行中断接收/发送时钟选择位。EXEN2(T2CON.3): T2外部事件允许标志。TR2(T2CON.2): T2运行控制位。C/T̅2(T2CON.1): T2的定时或计数方式选择位。CP/RL̅2(T2CON.0): T2的捕获/重装载功能选择标志。- T2MOD (方式控制寄存器): 地址C9H, 不可位寻址。
 T2OE(T2MOD.1): 允许T2的时钟信号输出到P1.0引脚。DCEN(T2MOD.0): 向下计数允许位。- 数据寄存器: TH2 (地址CDH), TL2 (地址CCH)。
 - 捕获寄存器: RCAP2H (地址CBH), RCAP2L (地址CAH)。用于捕获计数器TL2、TH2的计数值,或预置计数初值。
 
- T2工作方式选择逻辑: (基于RCLK+TCLK, CP/RL2, TR2的组合状态)
 - 自动重装载方式: 
RCLK+TCLK=0,CP/RL2=0,TR2=1 - 捕获方式: 
RCLK+TCLK=0,CP/RL2=1,TR2=1 - 波特率发生器方式: 
RCLK+TCLK=1,TR2=1 - 关闭: 
TR2=0 
- T2工作方式图解:
 - 捕获方式结构图
 - 自动重装载方式结构图
 - 波特率发生器结构图
 
监视定时器 (看门狗) T3
- 通俗名称: 看门狗 (Watchdog)。
 
- 核心工作原理: 在预设时间内若T3未被重置,其计数溢出将强制单片微机复位,从而帮助系统从硬件或软件故障中恢复。
 
- 基本构成 (以飞利浦80C552为例): 由一个11位的分频器和8位定时器T3组成。
 
- 故障场景示例: 程序代码因起始位置错误等原因导致混乱,可能陷入死循环,此时看门狗可发挥作用。
 
- T3计数脉冲时间特性:
 - 计算公式: t=12×211×Tosc=12×2048/fosc。
 - 示例: 若fosc=12MHz, 则t为2ms。
 
- T3计数溢出时间特性:
 - 决定因素: 装入T3的初值 (T3为加1计数器)。
 - 示例:
 - 初值00H: 计数255 (0FFH) 次后溢出。
 - 初值FFH: 计数1次后溢出。
 - 可编程溢出时间范围 (当fosc=12MHz时): 2ms 至 255×2ms。
 
- T3的控制机制:
 - 专用寄存器PCON:
 PD(PCON.1): 掉电方式位。当 PD=1 时,系统进入掉电方式。WLE(PCON.4): 看门狗定时器允许重装标志。WLE置位后,定时器T3只能被软件装入;装入操作完成后,WLE位会自动清除。- /EW引脚 (8XC552的pin 6):
 /EW=0: 计数器脉冲接通,T3开始工作;此时PD (PCON.1) 被强制为0,系统不能进入掉电模式。/EW=1: 计数器脉冲被封锁,T3停止工作。- 注意: 看门狗功能与掉电模式不能同时使用。
 

- 看门狗使用程序示例: 代码段
 
- 外置WatchDog芯片方案: 以MAX813为例。
 - 连接方式示意图
 - 清除watchdog程序片段: 通常通过操作特定I/O引脚产生脉冲来喂狗。 代码段
 

定时器/计数器的应用编程
- 定时器的应用
 - 溢出率与定时常数计算:
 - 定时常数 (TC): 为设定定时器溢出时间而预先置入计数器的数值。
 - 计算原理: 由于计数器是加1 (向上) 计数的,预先置入的常数应为目标计数值相对于计数器模数的补码。
 - 溢出时间公式:
 - t: 期望的定时时间
 - Tc: 机器周期 (12/)
 - : 晶振频率
 - L: 定时器/计数器的位数
 - TC: 需要装入的计数初值
 - 溢出率公式:
 - 不同方式下的计数器长度 (L):
 - T0/T1 方式0: L=13, 计数模
 - T0/T1 方式1: L=16, 计数模
 - T0/T1 方式2: L=8, 计数模
 - T2 (16位模式): L=16, 计数模
 - 定时器编程步骤:
 - 根据要求的定时时间 t、选定的定时器工作方式 (确定 L) 及晶体振荡频率 fosc,计算出所需的计数值 N=t/Tc。
 - 计算计数初值 TC=2L−N (对于向上计数器)。
 - 将十进制的TC值转换成十六进制或二进制。
 - 将计算得到的初值分别送入THi、TLi寄存器。
 - 初值装载指令示例:
 - T0/T1 方式0 (13位): TCB分解为TCH (高8位) 和TCL (低5位)。 代码段
 - T0/T1 方式1 (16位): TCB分解为TCH (高8位) 和TCL (低8位)。 代码段
 - T0/T1 方式2 (8位自动重装): TCB为8位重装载值。 代码段
 - T2 (16位模式): 与T0/T1的方式1类似,初值装入TH2, TL2;若使用自动重装,则重装值装入RCAP2H, RCAP2L。
 - 编程实例:
 - 例1: P1.0输出周期2ms方波 (T0方式0, fosc=6MHz, 定时1ms)
 - 计算TC: Tc=12/6MHz=2μs. N=1ms/2μs=500. TC=213−500=8192−500=7692=1E0CH。分解为 TH0=F0H (11110000B), TL0=0CH (00001100B, 只用低5位)。
 - TMOD设定: 
MOV TMOD, #00H(T0方式0, 定时, GATE=0)。 - 中断服务程序中重装初值并反转P1.0。
 - 例2: P1.0输出周期2ms方波 (T1方式1, fosc=6MHz, 定时1ms)
 - 计算TC: N=1ms/2μs=500. TC=216−500=65536−500=65036=FE0CH。TH1=FEH, TL1=0CH。
 - TMOD设定: 
MOV TMOD, #10H(T1方式1, 定时, GATE=0)。 - 中断服务程序中重装初值并反转P1.0。
 - 例2A: P1.0输出周期2ms方波 (T2, fosc=6MHz, 定时1ms, 自动重装载)
 - 计算TC: N=1ms/2μs=500. 由于T2方式可以是自动重装载,通常直接设置计数值 N。若用向下计数,初值为 N−1=499=01F3H。 RCAP2H=01H, RCAP2L=F3H。
 - T2CON, T2MOD设定: T2CON设置工作模式, T2MOD设置DCEN(若向下计数)。
 - 中断服务程序中清除TF2并反转P1.0 (自动重装无需手动重装初值)。
 - 例3: 产生200µs和400µs方波,T1作串行口波特率发生器 (fosc=9.216MHz)
 - 分析: T0方式3 (TL0定时100µs, TH0定时200µs), T1方式2 (波特率发生器)。
 - 计算TC: Tc=12/9.216MHz≈1.302μs.
 - TL0 (100µs): N0=100/1.302≈76.8. TC0=28−77=256−77=179=B3H.
 - TH0 (200µs): N1=200/1.302≈153.6. TC1=28−154=256−154=102=66H.
 - T1 (波特率2400bps): TC2=F6H (具体计算参考串行通信章节)。
 - TMOD设定: 
MOV TMOD, #23H(T1方式2, T0方式3)。 - 中断服务程序分别处理TL0和TH0溢出。
 


- 计数器的应用
 - 工作条件: TMOD中的C/T̅位设为1时,定时器/计数器工作在计数模式,对外部输入引脚T0 (P3.4)或T1 (P3.5)上的负跳变脉冲进行计数。
 - 例4: 扩展外部中断源,产生5KHz方波,T1作波特率发生器
 - 需求分析: 利用T0的方式3,TL0作为外部事件计数器 (模拟外部中断),TH0作为8位定时器产生方波。T1设置为方式2作为串行口的波特率发生器。
 - 常数计算 (fosc=12MHz, Tc=1µs):
 - TH0 (产生5KHz方波,周期200µs,半周期100µs): N=100μs/1μs=100. TCTH0=28−100=156=9CH.
 - TL0 (计数器,每来一个脉冲就中断): 初值设为FFH,这样下一个脉冲即溢出。
 - TMOD设定: 
MOV TMOD, #27H(T1方式2, T0方式3且TL0为计数器 C/T=1, TH0为定时器)。 - 程序中分别处理INT0, INT1, TL0, TH0的中断。
 
门控位GATE的应用
- 功能: 当TMOD中的GATE位为1时,定时器/计数器的运行不仅受TRx位控制,还受外部中断引脚INTx的状态控制。TRx=1且INTx引脚为高电平时,定时器/计数器才会计数。
 
- 定时器模式应用: 相当于对外部脉冲的宽度进行测量。
 
- 例5: 测量输入脉冲的高电平宽度 (查询方式)
 

- 测量大于定时器量程的脉冲宽度 (中断法)
 - 原理: 脉冲宽度 = (定时器溢出时间 × 溢出次数) + 最后不足一次溢出的定时时间。
 - 示例配置: T0方式1 (定时) GATE=1,T1方式1 (计数) 用于检测脉冲边沿。T1中断优先级高于T0。
 - 常数计算 (fosc=6MHz, Tc=2µs):
 - T0定时100ms: N=100ms/2μs=50000. TCT0=216−50000=15536=3CB0H.
 - T1计数初值: FFFEH (下降沿计数两次为一个周期,若测高电平则第一个下降沿启动T0,第二个下降沿停止T0,这里可能指用T1检测INT引脚变化)。 (课件中T1初值为FFEH,用于计数两次溢出)
 

