310 likes | 447 Views
知识点:. 定时器 / 计数器的工作方式. 定时器工作原理. 定时器 / 计数器的控制. 定时器 / 计数器的初值的设置. 问题的提出. 在实际工作、生活中,许多控制离不开时间。尤其是定时控制更是以时间为核心,如家用的洗衣机中的洗涤、脱水都是定时的。 单片机又是如何完成定时的呢? 通过前面的学习, 当晶振频率一定时,单片机的机器周期相应固定,如晶振频率为 12MHE 时单片机的机器周期为 1μs 。单片机对其机器周期进行计数便可以实现定时。如计数值为 1000 则定时 1ms 、如计数值为 1000000 则定时 1s ,以此类推。
E N D
知识点: 定时器/计数器的工作方式 定时器工作原理 定时器/计数器的控制 定时器/计数器的初值的设置
问题的提出 在实际工作、生活中,许多控制离不开时间。尤其是定时控制更是以时间为核心,如家用的洗衣机中的洗涤、脱水都是定时的。 单片机又是如何完成定时的呢? 通过前面的学习,当晶振频率一定时,单片机的机器周期相应固定,如晶振频率为12MHE时单片机的机器周期为1μs。单片机对其机器周期进行计数便可以实现定时。如计数值为1000则定时1ms、如计数值为1000000则定时1s,以此类推。 本章要解决的是单片机如何完成对机器周期进行计数。
当计数器计满时,自动将TFX置“1”,作为向单片机中断请求信号。当计数器计满时,自动将TFX置“1”,作为向单片机中断请求信号。 MCS-51单片机片内有两个16位的定时器/计数器,定时器0(T0)和定时器1(T1)。它们均可用作定时控制、延时以及对外部事件的计数及检测。 经过除以12变成1MHz的脉冲 记住:此时脉冲的周期为1/1MHz= 1μs 当外部晶体振荡器为12MHz时,它提供(输出)12MHz的脉冲。 加1计数器对1MHz的脉冲进行自动计数,直至计数器计满 在起/停控制信号中“起”信号作用下开关接通 当C/T=0时,开关接通 ÷12 振荡器 C/T=0 中断 加1计数器 TFX TX端 C/T=1 当C/T=1时,开关向下接通,TX端的外部信号至此 加1计数器对1MHz的脉冲进行自动计数,直至计数器计满 当计数器计满时,自动将TFX置“1”,作为向单片机中断请求信号。 起/停 控制信号 在起/停控制信号中“起”信号作用下开关接通
TH0 TH0 TL0 TL0 16位的定时器/计数器分别由两个8位的专用寄存器组成,由此可见:定时器/计数器的核心是一个加1计数器。 即T0由TH0和TL0构成,T1由THl和TLl构成。 T0 输入 TL0、TL1、TH0、TH1的地址顺序依次是8AH、8BH、8CH、8DH。这些寄存器用来存放定时或计数初值,每个定时器都可以由软件设置成定时工作方式或计数工作方式。 定时器/计数器可工作在定时方式或计数方式,由方式寄存器TMOD确定,由控制寄存器TCON控制。
注意: 1、当定时器工作在计数方式时,外部输人信号是加到T0(P3.4)或T1(P3.5)端。 一个外部输入信号的下降沿触发加1计数器加1,直至计满溢出。 外部输入信号的高电平与低电平保持时间均需大于一个机器周期。 2、当定时/计数器工作在定时方式时,加1计数器每一个机器周期加1,直至计满溢出。 一旦定时器/计数器被设置成某种工作方式后,它就会按设定的工作方式独立运行,不再占用CPU的操作时间,直到加1计数器计满溢出,才向CPU申请中断。
定时器/计数器工作方式及控制 定时器/计数器是一种可编程的部件,在其工作之前必须做三件事: 1、将方式字写入TMOD 2、将控制字写入TCON 3、将计数初值写入相应计数器 这个过程称为定时器/计数器的初始化
工作方式寄存器TMOD TMOD用于控制T0和T1的工作方式,其各位定义如下:
控制寄存器TCON TCON用于控制定时器的启动、停止以及标明定时器的溢出和中断情况。各位的含义如下:
定时器/计数器的工作方式 TMOD中的M1、M0具有4种组合,从而构成了定时器/计数器的4种工作方式,这4种工作方式除了方式3以外,其它3种工作方式的基本原理都是一样的。 下面分别介绍4种工作方式的特点及工作情况。
工作方式0 其中: 200ML:最大值 N:计数值 X: 初值 200ML N X 在单片机中定时/计数的原理是对其寄存器的内容完成对机器周期/外部脉冲进行+1计数直至溢出。为了获取不同时间/不同脉冲个数,只要对寄存器预先写入一个数据就可以实现。这个数据称为初值。
方式0:16位的计数器(THO和TL0)只用了13位构成13位定时器/计数器。方式0:16位的计数器(THO和TL0)只用了13位构成13位定时器/计数器。 TL0的高3位未用,当TL0的低5位计满时,向TH0进位,而TH0溢出后对中断标志位TF0置1,并向CPU申请中断。 13位计数器: 最大计数值为213=8192(相当200ML) 定时值t(相当N,但t 是时间单位) 初值(相当X) 即:t/机器周期+初值= 213=8192 t=(213-T0初值)×机器周期
1、初值 根据上式可知:初值= 213- t/机器周期 例如:定时值为5000μs,机器周期为1μs 初值=8192-5000/μs=3192=0000110001111000B 将初值写入T0寄存器的方法是:高8位写入01100011TH0,低5位11000写入TL0
例如:要求计满129个外部脉冲后溢出中断,则计数初值为8192-129=8063=1F7FH例如:要求计满129个外部脉冲后溢出中断,则计数初值为8192-129=8063=1F7FH 即TLO=1FH、TH0=FBH 又如:已知单片机的机器周期为1μs,要求定时值到达5000μs时溢出中断,则定时初值为8192-(5000μs/1μs) = 3192=0C78H 即TLO=18H、TH0=63H
工作方式1 T0工作在方式1的逻辑结构如下图所示。由图可见,它与工作方式0的差别仅在于工作方式1是以16位计数器参加计数,且定时时间为: t=(216-T0初值)×机器周期 即:初值= 216-t/机器周期
工作方式2 T0在工作方式2的逻辑结构如下图所示。
定时器/计数器构成一个能重复置初值的8位计数器。定时器/计数器构成一个能重复置初值的8位计数器。 在工作方式0、工作方式1中,若用于重复定时计数,则每次计满溢出后,计数器变为全0,故还得重新装入初值。 而工作方式2可在计数器计满溢出时自动装入初值,工作方式2把16位的计数器拆成两个8位计数器。TL0用作8位计数器,TH0用来保存初值,每当TL0计满溢出时,可自动将TH0的初值再装入TL0中。工作方式2的定时时间为: t=(28—T0初值)×机器周期 即:初值=256- t/机器周期
工作方式3 工作方式3的逻辑结构图如下图所示。
该工作方式只适用于定时器/计数器T0。T0在工作方式3被拆成两个相互独立的计数器,其中,TL0使用原T0的各控制位、引脚和中断源C/T 、GATE、TR0、INT0 和TF0; 而TH0则只能作为定时器使用,但它占用T1的TR1和TF1,即占用了T1的中断标志和运行控制位。 一般在系统需增加一个额外的8位定时器时,可设置为工作方式3,此时,T1虽仍可定义为工作方式0、工作方式1和工作方式2,但只能用在不需中断控制的场合。
思考题 TH0=C1 TL0=10 TH0=E4 TL0=A8 TH0=EC TL0=78 TH0=06 TL0=06 1、要求计满2000个外部脉冲后溢出中断,方式0,求计数初值的TL0=?、TH0=? 2、已知单片机的机器周期为1μs,要求定时值到达7000μs时溢出中断,定时、方式1,求定时初值的TL0=?、TH0=? 3、T0方式1,定时值5ms,TH0=?、TL0=? 4、T1方式2,定时值250μs,TH1=?、TL1=?
定时器/计数器应用举例 应用定时器/计数器时应注意两点:一是初始化(写入控制字),二是对初值的计算。 初始化步骤为: ①向TMOD写工作方式控制字。 ②向计数器TL、TH装入初始值。 ③置TR=1,启动计数。 ④置ET=1,允许定时器/计数器中断(若需要时)。 ⑤置EA=1,CPU开中断(若需要时)。
例如:设T0为工作方式1,设置为定时状态,定时时间为2ms,每当2ms到,申请中断,在中断服务程序中将P1.0的内容取反送出(假设晶振为6MHz)。例如:设T0为工作方式1,设置为定时状态,定时时间为2ms,每当2ms到,申请中断,在中断服务程序中将P1.0的内容取反送出(假设晶振为6MHz)。 解:已知晶振频率为6MHz,机器周期=2μs 下面先计算2ms定时的TO初始值 当T0工作在方式1时 TO初始值=216-定时时间/机器周期 =216-2ms/ 2μs =216-2×10-3/2×10-6 =65536-1000=64536 =FC18H。 即:TH0=FCH、TL0=18H
编程如下: ORG0000H; AJMP MAIN ;转主程序 ORG 000BH ; INT: MOV TL0,#18H ;T0中断服务程序 MOV TH0,#0FCH ;重设计数初值 CPL P1.0 ; 输出取反 RETI ; MAIN:MOV SP,#63H ;置堆栈指针 MOV TMOD,#01H ;T0初始化 MOV TL0;#18H ; MOV TH0;#0FCH; SETB TR0 ;启动T0计数 SETB ET0 ;允许T0中断 SETB EA ;CPU开中断 RLL: SJMP RLL ;等待 END
中断程序 主程序与中断服务程序的关系 中断服务程序入口地址 主程序MAIN 中断响应 RETI ORG 000BH INT: MOV TL0,#18H MOV TH0,#0FCH CPL P1.0 RETI MAIN:MOV SP,#63H MOV TMOD,#01H MOV TL0;#18H MOV TH0;#0FCH SETB TR0 SETB ET0 SETB EA RLL: SJMP RLL END 返回
又例如:当GATE=1时,TR0=1时,只有INTO 引脚上出现高电平时,T0才被允许计数。试利用这一功能测试INTO引脚上的正脉冲的宽度(机器周期数)。 设外部待测脉冲由INTO(P3.2)输入,T0工作在方式1,设置为定时状态,GATE置为“1”,测试时,在INTO端为“0”时置TR0为“1”,当INTO 端变为“1”时启动计数;INTO端再次变为“0”时停止计数,此时的计数值就是被测正脉冲的宽度。
TR0=1、INT0=1时开始计数 TR0=0、INT0=0时停止计数 编程思路: 在此期间对机器周期进行计数 根据题意:T0工作在方式1、定时状态、INT0=“1”期间对机器周期进行计数。 于是,确定方式字如下:即TMOD=09H。并在INT0=0期间置TR0=1
编程如下: ORG 0000H MOV TMOD,#09H ;T0工作方式1定时,GATE=1 MOV TL0,#00H ; MOV TH0,#00H ; RLL1:JB P3.2,RLL1 ;等待P3.2变低 SETB TR0 ;启动T0 RLL2:JNB P3.2,RLL2 ;等待P3.2变高 RLL3:JB P3.2,RLL3 ;等待P3.2再变低 CLR TR0 ;T0停止计数 MOV A,TL0 ;存放计数值 MOV B,TH0 SJMP $
思考题 ORG 0000H ; AJMP MAIN ;转主程序 ORG 000BH ; INT: MOV TL0,#0CH ;T0中断服务程序 MOV TH0,#0F0H ;重设计数初值 CPL P1.7 ; 输出取反 RETI ; MAIN:MOV SP,#63H ;置堆栈指针 MOV TMOD,#01H ;T0初始化 MOV TL0;#0CH ; MOV TH0;#0F0H; SETB TR0 ;启动T0计数 SETB ET0 ;允许T0中断 SETB EA ;CPU开中断 RLL: SJMP RLL ;等待 END 1、设T0为工作方式0,设置为定时状态,定时时间为0.5ms,每当0.5ms到,申请中断,在中断服务程序中将P1.7的内容取反送出(假设晶振为12MHz)。请编写该方案的程序.