350 likes | 487 Vues
3.3 MCS-51 单片机的定时器 / 计数器(一). 一、 MCS-51 单片机定时器/计数器组成: 定时器 / 计数器 0(T0) : 16 位的加计数器 定时器 / 计数器 1(T1) : 16 位的加计数器 二、定时器 / 计数器的功能 对外部输入信号的计数功能。定时器 / 计数器 0(T0 )的外来脉冲输入端为 P3.4 ;定时器 / 计数器 1(T1 )的外来脉冲输入端为 P3.5 。 定时功能。定时器 / 计数器的定时功能也是通过计数实现的,它的计数脉冲是由单片机的片内振荡器输出经 12 分频后产生的信号,即为对机器周期计数。.
E N D
3.3 MCS-51单片机的定时器/计数器(一) • 一、MCS-51单片机定时器/计数器组成: • 定时器/计数器0(T0):16位的加计数器 • 定时器/计数器1(T1):16位的加计数器 • 二、定时器/计数器的功能 • 对外部输入信号的计数功能。定时器/计数器0(T0)的外来脉冲输入端为P3.4;定时器/计数器1(T1)的外来脉冲输入端为P3.5。 • 定时功能。定时器/计数器的定时功能也是通过计数实现的,它的计数脉冲是由单片机的片内振荡器输出经12分频后产生的信号,即为对机器周期计数。
T1由TH1、TL1构成,字节地址为8DH、8BH T0由TH0、TL0构成,字节地址为8CH、8AH 特殊功能寄存器TMOD控制定时计数器的工作方式 TCON则用于控制定时计数器T0和T1的启动和停止计数,同时管理定时器T0和T1的溢出标志等。 MCS-51单片机定时器/计数器逻辑结构图
定时器/计数器的控制 • 定时器/计数器的控制主要是通过以下几个寄存器实现的: • TCON---定时器/计数器控制寄存器 • TMOD---定时器/计数器工作方式控制寄存器 • IE ---中断允许控制寄存器
GATE —— 门控位。 GATE = 0 启动不受 /INT0或 /INT1的控制; GATE = 1 启动受/INT0 或/INT1 的控制。 C/T —— 外部计数器 / 定时器方式选择位 C//T = 0 定时方式; C //T = 1 计数方式。 M1M0—— 工作模式选择位(编程可决定四种工作模式)。 TMOD 89H
T N个方波 = 0 ——定时; = 1 —— 对外计数。 定时:fosc / 12 = 1 /(12/fosc)= 1 / T 波形等间隔,次数已定,时间确定 即对机器周期进行计数。 左图定时时间为 N*T 计数:脉冲不等间隔。 每个下降沿计数一次 确认一次负跳变需两个机器周期, 所以,计数频率最高为fosc / 24。
TR0 —— 定时 / 计数器0运行控制位。 软件置位,软件复位。 TR1 —— 定时 / 计数器1运行控制位。(用法与TR0类似) TCON 88H TF0、TF1 分别是定时、计数器T0、T1的溢出标志位。
(1)定时/计数器的工作方式 • M1M0—— 工作模式选择位(编程可决定四种工作模式) • 0 0 13位定时/计数器 模式0 • 0 1 16位定时/计数器 模式1 • 0 8 位定时/计数器(自动重装初值) 模式2 • 1 1 T0 8位定时/计数 模式3 • 1 1 T1 停止工作 模式3
1)工作方式0 T0的等效逻辑结构
在计数工作方式下,计数器的计数值范围是: 1~8192(2的13方) 当为定时工作方式时,定时时间的计算公式为: ( 8192 -计数初值)×晶振周期×12 或 ( 8192 -计数初值)×机器周期 其时间单位与晶振周期或机器周期相同。 如果单片机的晶振选为6.000MHz,则最小定时时间为: [8192—(8192—1)]×1/6×10-6×12=2×10-6(s)=2(us) 最长定时时间为: (8192—0)×1/6×10-6×12=16384×10-6(s)=16384(us)。
2)工作方式1 T0的等效逻辑结构
在工作方式1下,计数器的计数值范围是: 1~65536(2的16方) 当为定时工作方式1时,定时时间的计算公式为: (65536—计数初值)× 晶振周期×12 或 (65536—计数初值)× 机器周期 其时间单位与晶振周期或机器周期相同。 如果单片机的晶振选为6.000MHz,则最小定时时间为: [65536—(65536—1)]×1/6×10-6×12=2×10-6(s)=2(us) 最长定时时间为: (65536—0)×1/6×10-6×12=131072×10-6(s)=131072(us)。
3)工作方式2 T0的等效逻辑结构
方式2与方式0、1的区别: 工作方式0和工作方式1的最大特点就是计数溢出后,计数器为全0,因而循环定时或循环计数应用时就存在反复设置初值的问题,这给程序设计带来许多不便,同时也会影响计时精度。 工作方式2就具有自动重装载功能,即自动加载计数初值,所以也有的文献称之为自动重加载工作方式。在这种工作方式中,16位计数器分为两部分,即以TL0为计数器,以TH0作为预置寄存器,初始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,不再象方式0和方式1那样需要“人工干预”,由软件重新赋值,而是由预置寄存器TH以硬件方法自动给计数器TL0重新加载。 方式2在串口通讯时,常用作波特率发生器。
如果定时/计数器0工作于工作方式3,那么定时/计数器1的工作方式就因为自己的一些控制位已被定时/计数器0借用,只能工作在方式0、方式1或方式2下,等效电路参见下图:
2.怎样编制计数程序? 首先必须对定时计数器进行初始化,然后再开启定时或计数。简单的总结一下,定时计数器的初始化包括以下内容。 (1)确定工作方式——对TMOD赋值; 如:任务中的MOV TMOD,#06H指令,设定T0为计数器工作方式。 (2)预置定时计数器中计数的初值——直接写入TH和TL; 如:任务中的MOV TH0,#00H 两条指令,设定计数初值。 MOV TL0,#00H
(3)根据需要开放定时器/计数器的中断——对IE位赋值;(3)根据需要开放定时器/计数器的中断——对IE位赋值; (4)启动定时器/计数器; 如:任务中的SETB TR0 指令 初值的计算方法 X=M-计数值 M是定时器的最大计数值。视工作方式不同而不同。 工作方式0: 13位定时/计数方式,因此,最多可以计到2的13次方,也就是8192次。 工作方式1: 16位定时/计数方式,因此,最多可以计到2的16次方,也就是65536次。 工作方式2和工作方式3:都是8位的定时/计数方式,因此,最多可以计到2的8次方,也说是256次。
预置值计算: 用最大计数量减去需要的计数次数即可。 通过上面的任务,我们掌握了计数程序的编制方法,下面我们再看看定时程序怎样编制。 首先我们看一下下面的程序段。 MOV TMOD,#01H MOV TL0,#00H MOV TH0,#4CH SETB TR0 以上程序是任务一中的定时程序段,它的初始化过程和计数方式类似。
MCS-51单片机的定时器/计数器(二) • MCS-51单片机的定时器/计数器应用举例: • 利用定时器/计数器实现固定时间的定时 • 利用定时器/计数器实现对外来信号脉冲的计数 • 利用定时器/计数器实现对外来信号脉冲信号脉宽的测量
实例一:定时器/计数器实现固定时间的定时 • 题目:利用T0,使用工作方式0,在单片机的P1.0输出一个周期为2ms,占空比为1:1的方波信号。 • 解:周期为2ms,占空比为1:1的方波信号,只需要利用T0产生定时,每隔1ms将P1.0取反即可。 • 编程步骤: • 计算TMOD的值 • 由于GATE=0;M1M0=00;C/T=0; • 所以 (TMOD)=00H • 计算初值(单片机振荡频率为12MHZ) • 所需要的机器周期数: • n=(1000us/1us)=1000 • 计数器的初始值: • X=8192-1000=7192 • 所以:(TH0)=0E0H,(TL0)=18H
开始 中断入口地址 设置堆栈地址 P1.0取反 设置TMOD方式 重新给T0赋初值 送定时器初值 中断返回 开T0中断 启动T0 等待 流程图 中断程序: 主程序:
中断程序的主程序和中断服务程序的布局 • 3:程序清单 • ORG 4000H • LJMP MAIN • ORG 400BH ;T0中断入口地址 • LJMP SER ;中断服务程序 • MAIN:MOV SP,#50H ;开辟堆栈 • MOV TMOD,#00H ;工作方式设置 • MOV TH0,#0E0H ;初始值设置 • MOV TL0,#18H • SETB EA ;开中断 • SETB ET0 ;开T0中断 • SETB TR0 ;运行T0 • HERE:SJMP $ ;等待中断 • SER:CPL P1.0 ;定时到,输出取反 • MOV TH0,#0E0H ;重新加载初战值 • MOV TL0,#18H • RETI ;中断返回 • END 主程序 定时器初始化 开定时器中断 中断服务程序
实例二:利用方式1定时 • 题目:用定时器T1,使用工作方式1,在单片机的P1.0输出一个周期为2分钟、占空比为1:1的方波信号。 • 解:周期为2分钟,占空比为1:1的方波信号,只需要利用T1产生定时,每隔1分将P1.0取反即可。 • 由于定时器定时时间有限,设定T1的定时为50ms,软件计数1200次,可以实现1分钟定时。 • 编程步骤: • 1、计算TMOD的值 • 由于:GATE=0;M1、M0=0、1;C/T=0; • 所以:(TMOD)=10H • 2、计算初值(单片机的振荡频率为12MHZ) • 所需要的机器周期数: • n=(50000us/1us)=50000 • 计数器的初始值:X=65536-50000=15536 • 所以:(TH0)=3CH;(TL0)=0B0H
中断入口地址 开始 设置堆栈地址 重装初值 N (20H)-1=0? 设置TMOD方式 Y 20H单元赋值20 送定时初值 N (21H)-1=0? 开T0中断 Y 启动T0 21H单元赋值60 计数单元赋值(20H,21H) P1.0取反 等待 中断返回 流程图 中断程序: 主程序:
中断程序的主程序和中断服务程序的布局 • 程序清单 • ORG 4000H • LJMP MAIN • ORG 401BH ; T0中断入口地址 • LJMP SER ; 中断服务程序 • MAIN:MOV SP,#50H ; 开辟堆栈 • MOV TMOD,#10H ; 工作方式设置 • MOV TH1,#3CH ; 初始值设置 • MOV TL1,#0B0H • SETB EA ; 开中断 • SETB ET1 ; 开T0中断 • SETB TR1 ; 运行T0 • MOV 20H,#20 • MOV 21H,#60 • HERE:SJMP $ ; 等待中断 定时器初始化 主程序 开定时器中断 计数单元赋初值
中断服务程序 • SER: MOV TH1,#3CH ;初始值重新设置 • MOV TL1,#0B0H • DJNZ 20H,NO • MOV 20H,#20 • DJNZ 21H,NO • MOV 21H,#60 • CPL P1.0 ;定时到,输出取反 • NO:RETI;中断返回 • END 判断中断的次数 注意:此程序的#20和#60这两个立即数后面没有加H表示是十进制数。 思考:能否利用定时器来实现一个电子钟?
测量每1秒钟之内的按键按下次数 要求: • 每秒的次数用发光管显示出来 • 每秒钟按键的按下次数不超过255次
工作原理 • 实现的方法:利用T0计数器对从T0输入的脉冲进行计数,利用T1工作于定时。每定时达到1秒钟,取出计数器的值进行显示。由于每秒钟按键的按下次数不超过255次,所以只需要显示TL0的内容即可。 • 步骤: • 由于定时器的最大定时时间不能够达到1秒钟,我们设定T1定时100mS,每10次取一次计数值。 • 设定TMOD,TH1,TL1的内容,(fosc)=6MHz • 所以:(TMOD)=51H • (TH1)=3CH • (TL1)=0B0H
程序清单 • ORG 0000H • LJMP MAIN • ORG 001BH • LJMP SER • MAIN: MOV TMOD,#51H • MOV TH1,#3CH • MOV TL1,#0B0H • MOV TL0,#00H • MOV TH0,#00H • SETB EA • SETB TR0 • SETB TR1 • SETB ET1 • MOV P1,#00H • SJMP $ 中断程序的主程序和中断服务程序的布局 主程序 T0和T1初始化 T1定时,T0计数 启动T0计数,T1定时,开T1中断
中断程序清单 关T0和T1 重新对T1赋值 • SER:CLR TR0 • CLR TR1 • MOV TH1,#3CH • MOV TL1,#0B0H • DJNZ R1,#10,LL • MOV R1,#10 • MOV A,TL0 • MOV P1,A • MOV TH0,#00H • MOV TL0,#00H • LL: SETB TR0 • SETB TR1 • RETI • END 判断是否到10次 取值显示 清除T0的计数值 开T0和T1,返回
测量在(P3.2)端出现的正脉冲宽度 T P3.2
工作原理 • 实质:利用门控制位GATE实现对定时器/计数器的启/停控制,来测量脉冲宽度。 • 当GATE为1,TR1(TR0)为1时,只有INT1(INT0)引脚输入高电平时,T1(T0)才允许计数。 • 当GATE为0,只要TR1(TR0)为1时,T1(T0)就允许计数。 利用GATE=1时的这个功能,可测试INT1(P3.3)和INT0(P3.2)上正脉冲的宽度。
开始 T0初始化(TMOD,TL0,TH0赋值) N P3.2=0? Y 启动T0工作 N N P3.2=1? P3.2=0? Y Y 停止T0工作 取出TH0和TL0的值送入30H和31H 结束 流程图:
程序如下: • ORG 4000H • MOV TMOD,#09H ;定时器T0模式1定时 • MOV TH0, #00H ;设定初值 • MOV TL0, #00H ; • JB P3.2, $ ;等待INT1变低 • SETB TR0 ;启动T1 • JNB P3.2, $ ;等待INT1变高 • JB P3.2, $ ;开始计数,等待变低 • CLR TR0 ;停止计数 • MOV 30H,TH1 ;取出T1中的高八位 • MOV 31H,TL1 ;取出T1中的低八位 • SJMP $ • END 对T0进行初始化 T0计数过程 取计数值
小 结 • 本章要求: • 了解中断源、中断的功能、中断系统的组成与功能、中断优先权管理、中断响应条件、中断响应过程、中断嵌套等基本概念; • 掌握MCS-51单片机的5个中断源;掌握外部中断的触发方式,与的触发方式有边沿方式与电平方式两种; • 掌握定时器/计数器的计数脉冲来源,计数脉冲来自内部振荡频率的12分频后的脉冲则称为定时器方式,计数脉冲来自外部引脚则称为计数器方式; • 掌握中断请求标志的清除方式,边沿方式下的与、T0、T1的中断请求标志是自动被清除的,而串行口的中断是用户通过软件清除的,电平触发的与还需要硬件的支持才能被清除; • 掌握T0与T1的工作方式,以及各种方式的应用; • 掌握TCON、SCON、IE、IP、TMOD等特殊功能寄存器的功能与应用; • 掌握MCS-51单片机对各中断源的响应条件与过程。