430 likes | 683 Views
第 6 章 定时器与计数器. 6.1 定时和计数的基本概念 6.2 MCS-51 单片机定时 / 计数器的结构和工作原理 6.3 定时 / 计数器工作模式及其应用 6.4 综合应用举例. 6.1 定时和计数的基本概念. 背景知识. TH1 TL1 TH0 TL0 TMOD TCON. 背景知识. 为什么需要定时 / 计数器 ?. 根据规定的时间间隔完成某项控制功能. 为什么需要定时 / 计数器 ?. 根据规定的时间间隔完成某项控制功能. 根据需要的延时启动某项任务. 为什么需要定时 / 计数器 ?.
E N D
第6章 定时器与计数器 6.1 定时和计数的基本概念 6.2 MCS-51单片机定时/计数器的结构和工作原理 6.3 定时/计数器工作模式及其应用 6.4 综合应用举例
6.1 定时和计数的基本概念 背景知识
TH1 TL1 TH0 TL0 TMOD TCON 背景知识
为什么需要定时/计数器? • 根据规定的时间间隔完成某项控制功能
为什么需要定时/计数器? • 根据规定的时间间隔完成某项控制功能 • 根据需要的延时启动某项任务
为什么需要定时/计数器? • 根据规定的时间间隔完成某项控制功能 • 根据需要的延时启动某项任务 • 检测外部事件发生的次数
为什么需要定时/计数器? • 根据规定的时间间隔完成某项控制功能 • 根据需要的延时启动某项任务 • 检测外部事件发生的次数
为什么需要定时/计数器? • 根据规定的时间间隔完成某项控制功能 • 根据需要的延时启动某项任务 • 检测外部事件发生的次数
为什么需要定时/计数器? • 根据规定的时间间隔完成某项控制功能 • 根据需要的延时启动某项任务 • 检测外部事件发生的次数
为什么需要定时/计数器? • 根据规定的时间间隔完成某项控制功能 • 根据需要的延时启动某项任务 • 检测外部事件发生的次数
如何实现? • 软件延时 • 采用延时电路实现固定的硬件延时 • 采用可编程定时/计数器实现 可编程定时/计数器(Timer/Counter,简称T/C)正是MCS-51单片机的一种重要的功能部件
可编程定时/计数器(T/C)工作原理? 例:往桶里滴水,考察其溢出时间:
可编程定时/计数器(T/C)工作原理? 例:往桶里滴水,考察其溢出时间:
可编程定时/计数器(T/C)工作原理? 例:往桶里滴水,考察其溢出时间:
可编程定时/计数器(T/C)工作原理? 例:往桶里滴水,考察其溢出时间:
可编程定时/计数器(T/C)工作原理? 例:往桶里滴水,考察其溢出时间: • 桶有多大?------定时/计数范围 • 滴水的速度?----时钟源频率 • 原来有多少水?--初值问题 • 如何知道溢出?--溢出时的反应
6.2.1 定时/计数器概述 图6-1 定时/计数器结构
6.2.2 单片机定时/计数器的工作方式 定时器工作方式 设置为定时器工作方式时,基准时间由单片机的晶振经过12分频后获得的一个脉冲信号,即机器周期信号。机器周期信号输入到加1计数器,加1计数器实现每个机器周期使T0或T1的计数寄存器数值增加1,直至计满溢出,根据计数机器周期的次数可以得到定时时间。 计数器工作方式 设置为计数方式时,外部脉冲信号输入到引脚T0(P3.4)和T1(P3.5),CPU对外部脉冲信号进行采样计数,加1计数器由外部输入脉冲信号的下降沿触发计数。
计数方式具体工作过程 计数器在每个机器周期的S5P2期间采样T0和T1引脚的输入电平,若前一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。所以检测一个从1到0的跳变需要两个机器周期,即外部输入信号的周期应大于或等于两个机器周期,也就是说外部输入信号的频率必须小于晶振频率的1/24,若频率超过晶振频率的1/24,则无法准确计数脉冲个数。虽然对外部输入信号的占空比无特殊要求,但是为了确保输入信号电平在变化之前至少被采样一次,要求电平保持时间至少是一个完整的机器周期。对输入脉冲信号的基本要求如图6-3所示。
GATE C/ T M1 M0 GATE C/ T M1 M0 D7 D6 D5 D4 D3 D2 D1 D0 TMOD (89H) 定时器T1 定时器T0 6.2.3 工作模式寄存器 TMOD TMOD用于控制T0和T1的工作模式。 TMOD不能位寻址,只能用字节设置定时器的工作模式,低半字节设置T0,高半字节设置T1。 8051系统复位时,TMOD的所有位被清0。 TMOD各位的定义格式如图所示
—计数器/定时器方式选择位 设置为定时方式。定时器计数8051片内脉冲,即对机器周期计数 设置为计数方式。计数器的输入来自T0(P3.4)或T1(P3.5)端的外部脉冲 M1和M0—操作模式控制位。两位可形成四种编码,对应于四种模式。
GATE—门控位。 GATE=0,只要用软件使TR0(或TR1)置1就可以启动定时器,而不管INT0(或INT1)的电平是高还是低。 GATE=1,只有INT0(或INT1)引脚为高电平且由软件使TR0(或TR1)置1时,才能启动定时器工作。
6.2.4 启动控制寄存器TCON TCON除可字节寻址外,各位还可位寻址。 8051系统复位时,TCON的所有位被清0。 TCON各位的定义格式如图所示。
6.3 定时/计数器工作模式及其应用 6.3.1模式 0 及其应用 6.3.2模式 1 及其应用 6.3.3模式 2 及其应用 6.3.4模式 3 及其应用
6.3.1 工作模式0及其应用 • 1 逻辑结构 • 2 模式0的应用
1 逻辑结构 图6-7 模式0时的逻辑结构图
2 工作模式0应用 例6.4 用T0定时,选择工作模式0,由单片机P1.0输出占空比为50%、周期为2ms的方波,晶振频率为12M。 (T=2mS=2000uS) 源程序如下: ORG 0000H LJMP MAIN ORG 000BH LJMP INT_TIME0 ORG 0030H MAIN: MOV TMOD, #00H ;设置工作方式 MOV TH0, #0E0H ;设初始值:1110 0000 0001 1000: ; 1C18H:7192 MOV TL0, #18H SETB TR0 ;启动定时器 SETB EA ;开放定时器中断 SETB ET0 SETB P1.0 LJMP $ INT_TIME0: MOV TH0, #0E0H ;对定时器重新赋值 MOV TL0, #18H CPL P1.0 RETI
6.3.2 工作模式1及其应用 • 1 逻辑结构 • 2 模式1的应用
1 模式 1 的逻辑电路结构 图6-8 模式1逻辑结构图
2 模式 1 的应用举例 例6.7 用T1定时,选择工作模式1,由单片机P1.0输出50Hz的方波,晶振频率=12M。(T=20mS=20000uS) 源程序如下: ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV TMOD,#10H ;设置T1为模式1 SETB TR1 ;启动定时 LOOP: MOV TH1,#0D8H ;送初值:55536: MOV TL1,#0F0H JNB TF1,$ ;查询定时时间到否 CLR TF1 ;产生溢出,清标志位 CPL P1.1 ;取反 SJMP LOOP ;重复循环
6.3.3 工作模式2及其应用 • 1 逻辑结构 • 2 模式2的应用
1 模式 2 的逻辑电路结构 图6-9 模式2逻辑结构
2 模式 2 的应用举例 例6-10:利用定时器T1的模式2对外部信号计数。要求每计满 100次,将 P1.0引脚取反。 源程序:ORG 0000H LJMP MAIN ORG 001BH LJMP INT_TIME1 ORG 0030H MAIN: MOV TMOD,#60H ;设置T1为模式2,外部计数方式 MOV TL1,#9CH ;T1计数器初值:156 MOV TH1,#9CH SETB EA ;开放定时器中断 SETB ET1 SETB TR1 ;启动T1计数 HERE: SJMP HERE ;等待中断 INT_TIME1: CPL P1.0 RETI
6.4 综合应用举例 由于MCS-51单片机的定时/计数器是可编程的,因此在使用之前需要进行初始化。在编程时主要注意两点:第一要能正确写入控制字;第二能进行计数初值的计算。一般情况下,包括以下几个步骤: (1)确定工作方式,即对TMOD寄存器进行赋值。 (2)计算计数初值,并写入寄存器TH0、TL0或TH1、TL1 中。 (3)根据是采用中断还是查询方式决定是否置位ETx允许T/C 中断。 (4)根据是采用中断还是查询方式决定是否置位EA使CPU开 中断。 (5)置位TRx启动计数。
例6-11试选择定时/计数器T0测试INT0(P3.2)引脚上 输入的被测脉冲宽度,已经晶振频率=12M例6-11试选择定时/计数器T0测试INT0(P3.2)引脚上 输入的被测脉冲宽度,已经晶振频率=12M 分析:定时器可以用于测量脉冲宽度程序设计,测量外部脉冲宽度利用TMOD的门控位控制很方便,当设置GATE=1时,仅设置TR0(TR1)等于“1”,定时器不能被启动,还必须等外部脉冲高电平时,定时器才开始工作。 测试过程如图6-11所示 图6-11 被测脉冲波形
例6-11 源程序如下: ORG 0000H LJMP MAIN ORG 000BH LJMP INT_TIME0 ORG 0030H MAIN: MOV R2,#00H ;如果被测脉冲宽度太长,则累计溢出次数 MOV TMOD,#09H ;设置T0为模式1,门控方式 MOV TL0,#00H ;设置初值 MOV TH0,#00H SETB EA ;开放T0中断 SETB ET0 SETB TR0 ;INT0引脚高电平到来才会启动T0 JNB P3.2, $ ;等待高电平到来 JB P3.2,$ ;高电平到来,启动T0开始测量 CLR TR0 MOV R0,TH0 ;P3.2低电平,测量结束,保存结果 MOV R1,TL0 LJMP $ INT_TIME0: INC R2 MOV TL0,#00H MOV TH0,#00H RETI
例6-12: 电路如图6-12所示,P1.0引脚外接发光二极管D0, 要求D0以1s的间隔闪烁。已知晶振频率=12M 图6-12 例6-12电路原理图
例6-12源程序代码:1S=1000000uS=20*50000 ORG 0000H LJMP MAIN ORG 000BH LJMP INT_TIME0 ORG 0030H MAIN: MOV P1,#0FFH ;灯的初态 MOV 30H,#00H ;软件计数器预清0 MOV TMOD,#01H ;定时/计数器0工作于方式1 MOV TH0,#3CH MOV TL0,#0B0H ;初值15536,计50000次 SETB EA ;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 LOOP: AJMP LOOP ;真正工作时,这里可写任意程序 INT_TIME0: INC 30H ;定时器0的中断处理程序 MOV A,30H CJNE A, #20,T_END ;30H单元中的值到了20了吗? CPL P1.0 ;到了,取反P10 MOV 30H, #00H ;清软件计数器 T_END:MOV TH0,# 3CH MOV TL0,# 0B0H ;重置定时常数 RETI
例6-13 设一交通路口设红、黄、绿三盏交通灯,当红灯亮2s后,黄灯亮400ms,绿灯亮1s,试用单片机模拟交通灯控制 分析:单片机采用发光二极管模拟交通灯控制,即利用P1.0~P 1.2分别接红、黄、绿三个发光二极管。但是这里用到三个定时时间(2s、400ms 、1s),难道每个定时时间都编写不同的定时程序,那么如果需要更多的定时时间,怎么办?这里还是采用软件定时器的方式,即找到这几个定时的时间的公约数,利用软件计数器就可以完成不同的延时。
例6-13源程序如下: NumberOf50ms EQU 30H ;定义软件定时器的计数次数 ORG 0000H LJMP MAIN ORG 000Bh LJMP INT_TIME0 ORG 0030H MAIN: CLR P1.0 红灯亮 MOV NumberOf50ms,#28H 延时2s LCALL DELAY SETB P1.0 红灯灭 CLR P1.1 黄灯亮 MOV NumberOf50ms,#08H 延时400ms LCALL DELAY SETB P1.1 黄灯灭 CLR P1.2 绿灯亮 MOV NumberOf50ms,#14H 延时1s LCALL DELAY SETB P1.2 绿灯灭 LJMP MAIN
DELAY: SETB ET0 SETB EA SETB TR0 MOV TMOD,#01H MOV TH0,#3CH (50000次:50mS) MOV TL0,#0B0H DEL_LOOP: MOV A, NumberOf50ms CJNE A, #00H,DEL_LOOP CLR TR0 RET ;************************* INT_TIME0: CLR EA MOV TH0,#3CH MOV TL0,#0B0H DEC NumberOf50ms SETB EA SETB ET0 RETI END