定时/实现方式:1.软件定时;2.不可编程硬件定时;3.可编程定时§2.9MCS-51单片机的定时/计数器。定时/计数器简称定时器,8051单片机有2个16位的定时/计数器:定时器0(T0)和定时器1(T1)。它们都有定时器或事件计数的功能,可用于定时控制、延时、对外部事件计数和检测等场合。T0由2个特殊功能寄存器TH0和TL0构成,T1则由TH1和TL1构成。一、定时/计数器的定时和计数功能1.定时功能----计数输入信号是内部时钟脉冲,每个机器周期使寄存器的值加1。所以,计数频率是振荡频率的1/12。2.计数功能----计数脉冲来自相应的外部输入引脚,T0为P3.4,T1为P3.5。作计数器时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数,当输入脉冲信号从1到0的负跳变时,计数器就自动加1。计数的最高频率一般为振荡频率的1/24。定时/计数器的核心部件是二进制加1计数器(TH0、TL0或TH1、TL1)。二、定时器/计数器的控制寄存器与定时器/计数器有关的控制寄存器有:1.定时器控制寄存器TCOND7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0中断请求标志触发方式选择启动定时/计数器0低电平1下降沿0停止1启动2.工作方式控制寄存器TMODT1控制T0控制M0M1C/TGATEM0M1C/TGATED0D1D2D3D4D5D6D7GATE—门控位C/T—计数/定时选择M1M0—工作方式选择计数脉冲输入三、定时器/计数器的工作方式定时器/计数器共有四种工作方式1.方式0—13位方式TF0T0TR0GATEINT01≥1&C/T=1振荡器1/12C/T=0TL0TH08位低5位13位计数器定时器计数器2.方式1—16位方式振荡器1/12TL0TH0TF01≥1&T0TR0GATEINT0C/T=0C/T=18位8位16位计数器3.方式2—8位自动装入时间常数方式TF0振荡器1/121≥1&T0TR0GATEINT0C/T=0C/T=1TL0TH04.方式3—2个8位方式仅T0可以工作在方式3—此时T0分成2个独立的计数器—TL0和TH0,前者用原来T0的控制信号(TR0、TF0),后者用原来T1的控制信号(TR1、TF1)。1.计数器初值的计算把计数器计满为零所需要的计数值设定为C,计数初值设定为TC,由此可得到公式:TC=M-C式中,M为计数器模值,该值和计数器工作方式有关。在方式0时M为213;在方式1时M为216;在方式2和方式3时M为28。四、定时/计数器常数的计算2.定时器初值的计算在定时器模式下,计数器由单片机主脉冲经12分频后计数。因此,定时器定时时间T的公式:T=(M-TC)T计数上式也可写成:TC=M-T/T计数式中,M为模值,和定时器的工作方式有关;T计数是单片机振荡周期TCLK的12倍;TC为定时器的定时初值。五、应用举例可编程器件在使用前需要进行初始化:①确定TMOD控制字:编程时将控制字送TMOD;②计算计数器的计数初值:编程时将计数初值送THi、TLi;③开中断(如果使用中断方式):编程实置位EA、ETi④TRi位置位控制定时器的启动和停止。例题1:设晶振频率fOSC=6MHz,使用定时器1以方式1产生周期为500μs的方波脉冲,并由P1.0输出。试以中断方式实现。8051P1.0500μs①TMOD确定T1控制T0控制XXXX1000M0M1C/TGATEM0M1C/TGATE控制字10H要产生500μs的方波脉冲,只需在P1.0端以250μs为间隔,交替输出高低电平即可实现。为此,定时间应为250μs。使用6MHz晶振,则一个机器周期为2μs,设待求计数初值为X,则:②计算计数器的计数初值;(216–X)×2×10-6=250×10-6即216–X=125X=216-125=10000H-7DH=0FF83H所以,初值为:TH1=0FFH,TL1=83H③采用中断方式:编程时打开全局和局部中断。④由定时器控制寄存器TCON中的TR1位控制定时器的启动和停止。TR1=1,启动;TR1=0,停止。例题2:假设单片机的振荡频率fosc=6MHz,现要求产生1ms的定时,试分别计算定时器T1在方式0、方式1和方式2时的初值。解:方式0:最大计数值为M=213,因此定时器的初值应为X=213-(1×10-3)/(12/(6×10-6)=7692D=1111000001100B其中高8位为TH1的初值,即F0H,低5位为TL1的初值,注意,这里TL1的初值应为00001100B即0CH,而不是60H,因为在方式0时,TL1的高3位是不用的,应都设为0。方式1:最大计数值为M=216,因此定时器的初值应为X=216-(1×10-3)/(2×10-6)=65036D=1111111000001100B=FE0CH此时高8位TH1的初值为FEH,低8位TL1的初值为0CH。方式2:最大计数值为M=28,因此定时器的初值应为X=28-(1×10-3)/(2×10-6)=256-500=-254计算得到的初值为负值,说明当fosc=6MHz时,不能采用方式2(即常数自动装入)来产生1ms的定时,除非把单片机的时钟频率降得很低。定时器/计数器应用实例实例内容:利用T0定时,产生2s定时,使得P1口输出信号,控制8个发光二极管循环点亮,设fOSC=12MHz,。难点:P1口输出信号,控制8个发光二极管循环点亮,但此处由于定时时间长达2s,所以单靠一个定时器不能解决问题。可以采取硬件定时和软件计数(或硬件计数)结合方式。硬件定时与软件计数结合方式解题思路:让T0作定时器用,如T0可以定时50ms,每当定时时间到,在T0中断处理程序中一个寄存器内容加1,同时判断是否加到2000/50=40,如果不到40,则直接返回,如果计到40,说明2s时间到,使P1口循环点亮8个发光二极管后再返回。T0工作在方式1,控制字01H,计数初值:(216–X)×1×10-6=50×10-3即216–X=50000X=216-50000=10000H-C350H=3CB0H所以,初值为:TH1=3CH,TL1=B0H程序设计ORG0000HLJMPMAIN;主程序入口ORG000BHLJMPINTT0;T0中断入口ORG1000HMAIN:MOVTMOD,#01H;T0为方式1MOVTH0,#3CHMOVTL0,#B0H;初值SETBEA;允许中断SETBET0SETBTR0;启动定时MOVA,#01H;LED0先亮MOVP1,A;MOVR0,#0SJMP$;等待中断主程序:中断处理程序:INTT0:MOVTH0,#3CH;重新设置初值MOVTL0,#B0HINCR0CJNER0,#40,NEXT;不等直接返回MOVR0,#0;2s到RLA;依次点亮NEXT:RETI**硬件定时与硬件计数结合方式解题思路:将引脚P3.0与引脚P3.5即T1脚连接起来。让T0作定时器用,T1作计数器用,如T0可以定时50ms,每当定时时间到,在T0中断处理程序中通过P3.0给T1脚输入负脉冲,使T1计数,当计数到2000/50=40时,说明2s时间到,在T1的中断处理程序中使P1口循环点亮8个发光二极管。**