第5章8051定时器/计数器的C编程定时/计数器----定时/计数器的定时和计数功能、定时器/计数器的控制寄存器、定时器/计数器的工作方式、定时/计数器用作外部中断扩展、定时中断联合举例。本章主要介绍51系列单片机定时器/计数器问题,本章将介绍以下具体内容:一、定时/计数器的定时和计数功能在TMOD中,各有一个控制位(C/T),分别用于控制定时/计数器T0和T1是工作在定时器方式还是计数器方式。1.定时功能----计数输入信号是内部时钟脉冲,每个机器周期使寄存器的值加1。所以,计数频率是振荡频率的1/12。2.计数功能----计数脉冲来自相应的外部输入引脚,T0为P3.4,T1为P3.5。当T0或T1脚上负跳变时计数值加1。定时/计数器的核心部件是二进制加1计数器(TH0、TL0或TH1、TL1)。二、定时器/计数器的控制寄存器与定时器/计数器有关的控制寄存器有:1.定时器控制寄存器TCOND7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0中断请求标志触发方式选择启动定时/计数器0低电平1下降沿0停止1启动(软件设置)2.工作方式控制寄存器TMODT1控制T0控制M0M1C/TGATEM0M1C/TGATED0D1D2D3D4D5D6D7GATE—门控位C/T—计数/定时选择M1M0—工作方式选择3.计数寄存器TH和TLT/C是16位的,计数寄存器由TH高8位和TL低8位构成。在SFR中,对应T/C0为TH0和TL0,对应T/C1为TH1和TL1。定时器/计数器的初始值通过TH1/TH0和TL1/TL0设置。计数脉冲输入三、定时器/计数器的工作方式定时器/计数器共有四种工作方式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。TL0可作定时器/计数器,用原来T0的控制信号(TR0、TF0);TH0只能作定时器用,用原来T1的控制信号(TR1、TF1)。只有将T/C1用作串行口的波特率发生器时,T/C0才工作在方式3,以便增加一个定时器。四、定时器/计数器的初始化1.初始化步骤(1)确定T/C的工作方式,编程TMOD寄存器;(2)计算T/C中的计数初值,并装载到THi和TLi;(3)开T/C中断和CPU中断,编程IE中的ETi和EA位;(4)启动T/C,编程TCON中的TRi位。可编程器件在使用前需要进行初始化:2.计数初值的计算(1)定时器的计数初值若fosc=6MHz,一个机器周期为12/fosc=2us。则:方式013位定时器最大定时间隔=213×2us=16.384ms;方式116位定时器最大定时间隔=216×2us=131.072ms;方式28位定时器最大定时间隔=28×2us=512us;若T/C工作在定时器方式1,要求定时1ms,求计数初值。5002/1000ssx需计数次数:因此,TH、TL可置-500。)256%500(0)256/500(0TLTH(2)计数器的计数初值方式013位计数器的满计数值=213=8192;方式116位计数器的满计数值=216=65536;方式28位计数器的满计数值=28=256;若T/C工作在计数器方式2,要求计数10个脉冲的计数初值。10x需计数次数:因此,TH=TL=-10。100100TLTH例题1:设晶振频率fOSC=6MHz,使用定时器1以方式1产生周期为500μs的方波脉冲,并由P1.0输出。试以中断方式实现。8051P1.0500μs五、应用举例①TMOD确定T1控制T0控制XXXX1000M0M1C/TGATEM0M1C/TGATE控制字TMOD=0x10;要产生500μs的方波脉冲,只需在P1.0端以250μs为间隔,交替输出高低电平即可实现。为此,定时间应为250μs。使用6MHz晶振,则一个机器周期为2μs,则:250us/2us=125。TH1=-(125/256),TL1=-(125%256)②计算计数器的计数初值;或者,设待求计数初值为X,(216–X)×2×10-6=250×10-6即216–X=125X=216-125=10000H-7DH=0FF83H所以,初值为:TH1=0FFH,TL1=83H③采用中断方式:编程时打开全局和局部中断。EA=1;ET1=1;④由定时器控制寄存器TCON中的TR1位控制定时器的启动和停止。TR1=1;//启动;TR1=0;//停止。程序设计主程序:main(){TMOD=0x10;//T1为方式1TH1=0xFF;TL1=0x83;//初值EA=1;//允许中断ET1=1;TR1=1;//启动定时for(;;){}//等待中断}voidt1()interrupt3using0{TH1=0xFF;//重新设置初值TL1=0x83;P1.0=!P1.0;//输出取反}中断处理程序:例题2:设晶振频率fOSC=6MHz,分别讨论各种工作方式下最长定时时间。解:1.由fOSC=6MHz可知,MC=2us;2.由于是加1计数,所以最长定时应是计数初值最小时(即为0时)的定时时间。所以此时有:方式0:(213–0)×2us=214us=16384us=16.384ms方式1:(216–0)×2us=217us=131.072ms方式2、3(28–0)×2us=29us=0.512ms注意:以上是当fOSC=6MHz,即MC=2us时各种方式下的定时时间,若fOSC=12MHz,则最长定时时间将缩短一半。例题3:1.分别用2种定时方式使P1.1口输出信号,点亮LED,LED点亮时间为50ms。方式1:利用调用延时子程序方式;方式2:利用定时器定时50ms,设晶振频率为12MHz。2.题目中没有指明用T0还是T1,可任意,我们用T0。T1控制T0控制1000XXXXM0M1C/TGATEM0M1C/TGATE控制字01H①确定TMOD控制字②计算计数器的计数初值;(216–X)×1×10-6=50×10-3即216–X=50000X=216-50000=10000H-C350H=3CB0H所以,初值为:TH0=3CH,TL0=B0H③采用中断方式:编程时打开全局中断:置位EA局部中断:置位ET0。④置位TR0位控制定时器的启动。程序设计MAIN(){TMOD=0x01;//T0为方式1TH0=0x3C;TL0=0xB0;//初值EA=1;//允许中断ET0=1;TR0=1;//启动定时}主程序:VoidINTT0()interrupt1using2{TH0=0x3C;TL0=0xB0;P1.1=!P1.1;//输出取反}中断处理程序:8051P1.0P1.7RLED7.....RLED0.....例题4:1.通过P1.0P~1.7分别轮流送“1”给8个灯;2.每次持续时间20分之一秒,即50ms,由定时器T0来定时,又知fOSC=6MHz,由例题2可知可用方式1。T1控制T0控制1000XXXXM0M1C/TGATEM0M1C/TGATE控制字01H①确定TMOD控制字②计算计数器的计数初值;(216–X)×2×10-6=50×10-3即216–X=25000X=216-25000=10000H-61A8H=9E58H所以,初值为:TH1=9EH,TL1=58H③采用中断方式:编程时打开全局中断:置位EA局部中断:置位ET0。④置位TR0位控制定时器的启动。程序设计uchara;MAIN(){TMOD=0x01;//T0为方式1TH0=0x9E;TL0=0x58;//初值EA=1;//允许中断ET0=1;TR0=1;//启动定时a=0x01;//LED0先亮}主程序:中断处理程序:VoidINTT0()interrupt1using0{TH0=0x9E;//重新设置初值TL0=0x58;P1=a;a=a1;//依次点亮if(a==0)a=0x01;}P1.0P1.7RLED3RLED0RLED1RLED2RLED4RLED5RLED6RLED7P1.6P1.5P1.4P1.3P1.2P1.18051例题5:利用T0定时,产生2s定时,使得P1口输出信号,控制8个发光二极管循环点亮,设fOSC=12MHz,。难点:P1口输出信号,控制8个发光二极管循环点亮的解题思路见例题4,但此处由于定时时间长达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程序设计uchara,ms;MAIN(){TMOD=0x01;//T0为方式1TH0=0x3C;TL0=0xB0;//初值EA=1;//允许中断ET0=1;TR0=1;//启动定时a=0x01;//LED0先亮ms=0;}主程序:中断处理程序:VoidINTT0()interrupt1using0{TH0=0x3C;//重新设置初值TL0=0xB0;ms++;if(ms==40){ms=0;P1=a;a=a1;//依次点亮if(a==0)a=0x01;}}**硬件定时与硬件计数结合方式解题思路:将引脚P3.0与引脚P3.5即T1脚连接起来。让T0作定时器用,T1作计数器用,如T0可以定时50ms,每当定时时间到,在T0中断处理程序中通过P3.0给T1脚输入负脉冲,使T1计数,当计数到2000/50=40时,说明2s时间到,在T1的中断处理程序中使P1口循环点亮8个发光二极管。**中断控制应用一级中断部分。8051P1.7P1.4RLED7...RLED0...P1.3P1.0...INT0每当INT0引脚输入的中断请求(边沿触发)被响应后,P1.0~P1.3的状态取反后从P1.4~P1.7输出。