单片机定时/计数器
时间:2014-11-18 08:23 来源:自动控制网
在单片机应用技术中,常要求有一些实时时钟,以实现定时或延时控制;也常要求有一些计数器,实现对外部事件的计数控制。MCS-51单片机片内有两个16位的可编程的定时/计数器T0、T1,以满足这方面的需要。 1、定时/计数器的结构及工作原理 定时/计数器的核心是一个加1计数器(有的是减1计数器),加1计数器的脉冲有两个来源,一个是外部脉冲源,另一个是系统的时钟振荡器。计数器对两个脉冲源之一进行计数,每输入一个脉冲,计数值加1。当计数到计数器为全1时,再输入1个脉冲就使计数值回零,同时从最高位溢出一个脉冲使定时/计数控制寄存器TCON的TF0或TF1置1,作为计数器的溢出中断标志位。 两个16位的定时/计数器T0、T1分别由两个8位的特殊功能寄存器TH0、TL0,TH1、TL1组成,用来存放定时/计数初值。它们可以别程序控制为不同的组合状态(13位、16位、两个分开的8位),形成定时/计数器的四种工作方式,这些设置可以通过工作方式寄存器TMOD的相应位进行控制。定时/计数器的启动和停止可以由定时/计数器控制寄存器TCON进行控制。TMOD、TCON的内容可以由软件编程设置。 2、工作方式寄存器TMOD 工作方式寄存器TMOD用于选择定时/计数器的工作模式和工 作方式,字节地址为89H,其格式如表1:表1 工作方式寄存器TMOD
TMOD的高 4位控制T1,低4位控制T0。各位定义如下 GATE:门控位。GATE=0时,仅由运行控制位TR0或TR1置1来启动定时/计数器运行。GATE=1 时,由运行控制位TR0或TR1置1和外部中断引脚 INT0或INT1上的高电平共同来启动定 时/计数器的运行。 C/T:计数模式定时模式选择位。C/T=0为定时模式。 C/T=1为计数模式,计数器对外部引脚P3.4、 P3.5的外部脉冲进行计数。 M1、M0:定时/计数器工作方式选择位。M1、M0共有4种编码,对应4种工作方式,如表2 表2 M1、M0对应工作方式
3、定时/计数器控制寄存器TCON TCON的字节地址为88H,,用于控制定时 /计数器的启动,其格式如表3.9 : 表3 定时/计数器控制寄存器TCON
低4位与外部中断有关,高4位的功能如下: TR0:定时/计数器0的运行控制位。TR0=1,启动定时/计数器0的必要条件,还与GATE 位状态有关。TR0=0,停止定时/计数器0。 TF0:T0溢出标志位。当定时/计数器计数溢出时,该位置1。使用查询方式时,应以软件 方法及时将该位清0。使用中断方式时,进入中断服务程序后由硬件自动清0。 TR1:定时/计数器1的运行控制位。TR1=1,启动定时/计数器1的必要条件,还与GATE 位状态有关。TR1=0,停止定时/计数器1。 TF1:T1溢出标志位。当定时/计数器计数溢出时,该位置1。使用查询方式时,应以软件方法及时将该位清0。使用中断方式时,进入中断服务程序后由硬件自动清0。 4、定时/计数器实际应用 由上面介绍可知,定时/计数器时可编程的,所以在任何一个定时/计数器开始定时或计数之前,必须对TMOD的各位进行软件编程设置,将初值写入THX、TLX(X=0、1),置位 TCON相应位来实现启动和停止定时/计数器。 例题 设计一个程序,要求定时/计数器0为 定时状态,工作于方式0下,定时时间为 2ms,每隔2ms将P1口所接8置发光二极管亮灭状态左移一位,已知晶振频率为6MHZ。分别用查询方式和中断方式实现。 首先要对定时/计数器工作方式进行设定,按题目要求TMOD各位应为00000001B。 接着来计算初值:题目要求定时,则对内部机器周期进行计数。每个机器周期包括12个振荡周期,晶振为6MHZ,则1个机器周期=12个振荡周期=2us。题目要求定时时间为2ms,那么应数1000次机器周期,1000次之后要求计数器产生溢出。由于要求工作方式1,即16位定时/计数器。那么应装入定时/计数器得初值为2的16-1000=64536。 转换为16进制为0FC18H,分别装入TH0和TL0。最后编写程序置位TR0启动定时器。 采用查询方式:ORG 0000H MAIN:MOV A,#01H LOOP0:MOV TMOD,#01H ;T0初始化 MOV TH0,#0FCH ;装入定时初值 MOV TL0,#18H MOV P1,A ;点亮最右边一位发光二极管 SETB TR0 ;启动T0 LOOP1:JNB TF0,LOOP1 ; ;查询TF0,等待定时时间到 RLC A ;定时时间到,左移一位 CLR TF0 ;软件清TF0位 JMP LOOP0 ;返回,重装初值 采用中断方式:ORG 0000H AJMP MAIN ;转主程序 ORG 000BH ;T0中断入口,只有一个中断,可以放在此处 MOV TH0,#0FCH ;重新装入初值 MOV TL0,#18H RLC A ;左移一位 MOV P1,A ;送P1口 RETI ;中断返回 MAIN:MOV TMOD,#01H ;T0初始化 MOV TH0,#0FCH ;定时初值 MOV TL0,#18H MOV A,#01H SETB TR0 ;启动定时器0 SETB EA ;CPU开放中断 SETB ET0 ;允许T0中断 SJMP $ ;等待 |