280 likes | 470 Views
第 6 章 MCS-51 单片机的 定时 / 计数器. 第 6 章 MCS-51 单片机的 定时 / 计数器. 6.1 定时器的定时与计数功能 6.2 定时器的有关特殊功能寄存器 6.3 定时器的四种工作方式 6.4 定时器的应用. 6.1 定时器的定时与计数功能. 1 定时器的结构 2 定时器的计数功能 3 定时器的定时功能. 1 定时器的结构. 定时器的实质是 16 位 加 1 计数器. 2 定时器的 计数 功能. 设置为 计数器模式时 。在每个机器周期的 S5P2 期间采样 T0 、 T1 引脚电平。
E N D
第6章 MCS-51单片机的定时/计数器 • 6.1 定时器的定时与计数功能 • 6.2 定时器的有关特殊功能寄存器 • 6.3 定时器的四种工作方式 • 6.4 定时器的应用
6.1 定时器的定时与计数功能 • 1 定时器的结构 • 2 定时器的计数功能 • 3 定时器的定时功能
1 定时器的结构 • 定时器的实质是16位加1计数器
2 定时器的计数功能 • 设置为计数器模式时。在每个机器周期的S5P2期间采样T0、T1引脚电平。 • 当晶振频率为12MHz时,最高计数频率不超过1/2MHz,即计数脉冲的周期要大于2 s。
3 定时器的定时功能 • 设置为定时器模式时:加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。 • 计数值N乘以机器周期Tcy就是定时时间t。
D7 D6 D5 D4 D3 D2 D1 D0 TCON字节地址88H 8F 8E 8D 8C 8B 8A 89 88 位地址 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 位定义 6.2.1 TCON定时器控制/状态寄存器 1)启动控制位TR0、TR1 =0,停止定时器工作;=1,启动定时器工作 例:启动T0: SETB TR0 停止T0: CLR TR0 2)溢出中断标志位TF0、TF1 定时器溢出时,由硬件置位TFx=1; 若中断开放,向CPU请求中断,CPU响应Tx中断后,自动清0 TFx。 若中断禁止,可用软件检测TFx(判跳),必须软件清0。 WAIT:JBC TF0,NEXT;检测T0是否溢出,溢出,TF0清0。 SJMP WAIT ;未溢出,继续检测 NEXT: …;处理溢出 JNB TF0, $ ;检测T0是否溢出,未溢出,继续检测 CLR TF0 ;溢出,TF0清0. …… ;处理溢出.
T0 T1 6.2.2 TMOD定时器方式寄存器(89H) 1)门控方式选择位GATE: =0,非门控方式(内部启动): 只要TRx=1,就启动定时器工作; 只要TRx=0,就停止定时器工作。 =1,门控方式(外启动):只有当TRx=1且引脚INTx=1才启动定时器。 2)功能选择位C/T: =0,定时功能,计数内部机器周期脉冲; =1,计数功能,计数引脚T0(T1)输入的负脉冲。 3)方式选择位M1、M0:4种工作方式:13/16/8位 确定定时器工作方式指令:MOV TMOD,#方式字;字节访问 例:设T0用方式2非门控定时,T1用方式1门控计数。 MOV TMOD,# 11010010B
6.2.3 定时器的计数数据寄存器TH1 TL1、TH0 TL08DH 8CH、8BH 8AH • 任何时候都可对它的当前值进行读/写操作, • 它们都只能字节寻址。 可预置初值的16位加1计数器 TH0、TL0、 TH1、TL1 预置T0初值指令: MOV TH0,#XH MOV TL0,#XL
6.3.1 定时/计数器的工作方式0 方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成加1计数器。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。
6.3.2 定时/计数器的工作方式1 方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器 。 计数个数N与计数初值X的关系为:
6.3.3 定时/计数器的工作方式2 方式2为自动重装初值的8位计数方式。 计数个数N与计数初值X的关系为: 工作方式2特别适合于用作较精确的脉冲信号发生器。如:串行口波特率发生器的使用
6.3.4 定时/计数器的工作方式3 方式3只适用于定时/计数器T0,将T0分成为两个独立的8位计数器TL0和TH0。 TL0作为定时/计数器:TL0占用原T0控制位及相关引脚:其操作和功能与方式0、1基本相同 TH0仅作定时器:TH0占用T1控制位: TR1、TF1及T1中断源。
6.3.4 定时/计数器的工作方式3 定时器T0工作于方式3时, T1只能工作在方式0、1、2 计数溢出时输出送串行口,此时T1作为串行口波特率发生器使用。以确定串行通讯的速率。 启动:设置好工作方式0、1、2时相当于TR1=1,T1便自动开始运行; 停止:当设置为工作方式3时相当于TR1=0, T1停止计数。
6.4 定时器的应用 • 1、定时器的初始化编程 • 2、定时器的溢出处理编程格式 • 3、定时器的应用举例
1、定时器初始化编程 使用定时器工作之前,先写入方式、控制寄存器,确定好定时器工作方式: • MOV TMOD,# 方式字;启动方式选择(内外共同启动/内启动) 功能选择—(计数/定时) 位数选择—(8/13/16位) • MOV THx,#XH;计算时间常数X, MOV TLx,#XL ;Tx时间常数初值装入数据寄存器, • (SETB EA ) ;开Tx中断 (SETB ETx) • SETB TRx;启动控制Tx定时器(启动/停止) 定时器初始化编程:在主程序中进行
.计算时间常数X(计算初值) 计数器运行之前,需要预先给定初值 由于计数器是加1计数器,并在益处时产生中断请求, • 因此不能将计数值N送入计数器作为初值X,而应送入计数值的补码数作为初值 计数功能:X= 2n -计数值N n:13/16/8 定时功能:X= 2n - t/T t:定时时间s、T:机器周期s • .预置初值 方式0 MOV THx,#X高8位 MOV TLx,#X低5位 方式1 MOV THx,#X高8位 MOV TLx,#X低8位 方式2 MOV THx,#X8位 MOV TLx,#X8位 方式3 MOV TH0,#X8位 MOV TL0,#Y8位
2、 溢出处理编程格式及初值恢复方式(自动重装/软件重装) 1)查询方式:先查询定时器溢出标志,再进行溢出处理。 …;定时器初始化 WAIT:JBC TFx,PT ;检测溢出标志 SJMP WAIT PT: MOV THx,#XH ;软件恢复初值,重装时间常数 MOV TLx,#XL …;溢出处理 SJMP WAIT 2)中断方式:初始化后执行其他任务,中断服务程序中处理溢出 ORG 0000H LJMP MAIN ORG 000BH(001BH);T0(T1)中断入口 LJMP PTS MAIN:…;初始化后执行其他程序 PTS: MOV THx,#XH;软件重装时间常数 MOV TLx,#XL …;溢出中断服务程序 RETI
2ms 3、定时器的应用举例 解:每隔1ms改变一次P1.0的输出状态。用T1非门控方式定时。 计算时间常数:方式1:X = 216 - t/T = 216 -1000/1 = FC18H 【例6-2、3】:设fosc=12MHz。由P1.0输出周期为2ms的等宽度连续方波,使用T1的方式0、1。 方式0:X = 213 - t/T = 213 -1000/1 = 1C18H (1)查询方式: ORG 0000H START:MOV TMOD, #10H ;(主程序开始)定时器T1工作方式1 CLR P1.0 ;设置方波的起始状态 MOV TL1, #18H MOV TH1, #0FCH ;送初值,保证定时时间为1ms SETB TR1 ;启动定时器 LOOP: JNB TF1, $ ;查询是否溢出,等待1ms定时到 MOV TL1, #18H ;溢出处理 MOV TH1, #0FCH ;再送计数初值,保证定时时间始终为1ms CLR TF1 ;清溢出标志,以便下次判断 CPL P1.0 ;改变P1.0的状态 SJMP LOOP ;产生连续的方波 END 0000 0000B MOV TL0,#18H MOV TH0,#0E0H 。。。。 MOV TL0,#18H MOV TH0,#0E0H
(2)中断方式 ORG 0000H AJMP START ;跳转主程序 ORG 001BH LJMP PITO1 ;跳转中断服务程序 ORG 0100H START:MOV SP, #60H ;堆栈初始化 MOV TMOD, #10H;(主程序开始)定时器T1工作方式1 MOV TH1, #0FCH ;设置计数初值 MOV TL1, #18H CLR P1.0 ;设置方波的起始状态 SETB EA ;开中断 SETB ET1 SETB TR1 ;启动定时器 SJMP $ ;等待中断 PITO1: MOV TL1, #18H MOV TH1, #0FCH ;再送计数初值,保证定时时间始终为1ms CPL P1.0 ;输出方波 RETI ;中断返回 END 00000000B MOV TL0,#18H MOV TH0,#0E0H MOV TL0,#18H MOV TH0,#0E0H
【例6-4】用T0以工作方式2计数,每计100次进行累加器加1操作。【例6-4】用T0以工作方式2计数,每计100次进行累加器加1操作。 解:①计算初值:方式2:X = 28 - 100 = 156 = 9CH ②TMOD初始化: GATE=0 , C/T=1, M1M0=10B ORG 0000H AJMP START ;转主程序 ORG 0100H START:MOV IE, #00H ;(主程序开始)关中断 MOV TMOD, #06H ;设置定时器T0方式2计数 MOV TH0, #9CH ;设置计数初值 MOV TL0, #9CH SETB TR0 ;启动计数 LOOP: JBC TF0, LOOP1 ;查询计数是否计满溢出 SJMP LOOP LOOP1:INC A ;累加器加1 SJMP LOOP END
【例6-5】用T0以工作方式2产生5kHz的连续方波,并由P1.0输出。设fosc=6MHz,查询方式。【例6-5】用T0以工作方式2产生5kHz的连续方波,并由P1.0输出。设fosc=6MHz,查询方式。 解:①计算初值:方式2:X = 28 – t(fosc/12)=256-100(6/12)=CEH ②TMOD初始化: GATE=0 , C/T=0, M1M0=10B ORG 0000H START:MOV TMOD, #02H;定时器T0工作方式2 CLR P1.0 ;设置方波的起始状态 MOV TL0, #0CEH ;送计数初值, MOV TH0, #0CEH ; 保证定时时间始终为100μs SETB TR0 ;启动定时器 LOOP:JNB TF0, $ ;等待100μs定时到 CLR TF0 ;清溢出标志,以便下次判断 CPL P1.0 ;改变P1.0的状态 SJMP LOOP ;产生连续的方波 END
【例6-7】用单片机的定时器设计一个工频计,并用二极管以二进制形式显示所测频率。设fosc=6MHz【例6-7】用单片机的定时器设计一个工频计,并用二极管以二进制形式显示所测频率。设fosc=6MHz 解:频率=每秒钟内T0输入的脉冲数 T0:计数方式2,T1:定时方式1 ①计算基准初值:T1定时方式1: X = 216 – t(fosc/12) =65536-125000(6/12) =0BDCH ②TMOD初始化: T1:GATE=0 , C/T=0,M1M0=01B T0:GATE=0 , C/T=1,M1M0=10B
ORG 0000H AJMP MAIN ORG 001BH AJMP T_1 ORG 0100H MAIN: MOV SP, #60H ;堆栈初始化 MOV P1,#00 ;测量前显示0 MOV TMOD, #16H; T0计数方式2,定时器T1定时方式1 MOV TH0, #00H ;设置T0计数初值 MOV TL0, #00H MOV TH1, #0BH ;设置T1定时初值125ms MOV TL1, #0DCH MOV R3,#8 ;设置软件计数器 SETB EA ;开中断 SETB ET1 ORL TCON,#0101000B;同时启动定时器T1和计数器T0 SJMP $ ;等待中断 T_1: DJNZ R3,NEXT ;1s时间未到则中断返回,继续定时 ANL TCON,#10001111B;1s定时到,同时关闭T1、T0 MOV A,TL0 ;读出频率值到A CPL A ;取反,低电平点亮二极管 MOV P1,A ;送P1口进行显示 MOV TH0, #00H ;重新设置T0计数初值 MOV TL0, #00H MOV TH1, #0BH ;重新设置T1定时初值125ms MOV TL1, #0DCH MOV R3,#8 ;重新设置软件计数器 ORL TCON,#0101000B;同时启动定时器T1和计数器T0 RETI ;中断返回 EXIT: MOV TH1, #0BH ; 1s未到,重新设置T1定时初值125ms MOV TL1, #0DCH RETI ;中断返回 END
MCS-51定时/计数器 小结 • 1、定时/计数器的结构? • 2、定时/计数器的四种工作方式? • 3、定时/计数器的初始化编程? • 4、定时/计数器的溢出处理方式? • 作业:P112 一、二、三