第6章MCS-51的定时器计数器_第1页
第6章MCS-51的定时器计数器_第2页
第6章MCS-51的定时器计数器_第3页
第6章MCS-51的定时器计数器_第4页
第6章MCS-51的定时器计数器_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

教学基本要求:※掌握单片机定时器/计数器的结构与工作原理;※握单片机的定时器/计数器的初值计算、工作方式控制寄存器的初始化;※了解单片机的定时器/计数器的各种工作方式及其差异;※掌握单片机的定时器/计数器程序的设计方法和步骤。第6章MCS-51的定时器/计数器重点与难点:单片机定时器/计数器的结构与工作原理、控制与工作方式、编程和应用。6.1定时器/计数器结构与工作原理定时器/计数器的基本部件是两个8位的计数器(其中TH1,TL1是T1的计数器,TH0,TL0是T0的计数器)拼装而成。在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出经12分频后得到的,所以定时器也可看作是对计算机机器周期的计数器(因为每个机器周期包含12个振荡周期,故每一个机器周期定时器加1,可以把输入的时钟脉冲看成机器周期信号)。故其频率为晶振频率的1/12。如果晶振频率为12MHZ,则定时器每接收一个输入脉冲的时间为1μs。当它用作对外部事件计数时,接相应的外部输入引脚T0(P3.4)或T1(P3.5)。在这种情况下,当检测到输入引脚上的电平由高跳变到低时,计数器就加1(它在每个机器周期的S5P2时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,则计数器加1)。加1操作发生在检测到这种跳变后的一个机器周期中的S3P1,因此需要两个机器周期来识别一个从“1”到“0”的跳变,故最高计数频率为晶振频率的1/24。这就要求输入信号的电平要在跳变后至少应在一个机器周期内保持不变,以保证在给定的电平再次变化前至少被采样一次。定时器/计数器有四种工作方式,其工作方式的选择及控制都由两个特殊功能寄存器(TMOD和TCON)的内容来决定。用指令改变TMOD或TCON的内容后,则在下一条指令的第一个机器周期的S1P1时起作用。定时器的方式寄存器TMOD图6-1TMOD寄存器各位定义特殊功能寄存器TMOD为定时器的方式控制寄存器,高4位用于定时器1,低4位用于定时器0。其中M1,M0用来确定所选的工作方式。①M1M0定时器/计数器四种工作方式选择M1M0方式说明00013位定时器/计数器01116位定时器/计数器102自动装入时间常数的8位定时器/计数器113对T0分为两个8位独立计数器;对T1置方式3时停止工作(无中断重装8位计数器)表6-1工作方式选择表②C/定时器方式或计数器方式选择位。C/=1时,为计数器方式;C/=0时,为定时器方式。③GATE定时器/计数器运行控制位,用来确定对应的外部中断请求引脚(,)是否参与T0或T1的操作控制。当GATE=0时,只要定时器控制寄存器TCON中的TR0(或TR1)被置1时,T0(或T1)被允许开始计数(TCON各位含义见后面叙述);当GATE=1时,不仅要TCON中的TR0或TR1置位,还需要P3口的或引脚为高电平,才允许计数。特殊功能寄存器TCON用于控制定时器的操作及对定时器中断的控制。其各位定义如图6-2所示。其中D0~D3位与外部中断有关。图6-2TCON寄存器各位定义①TR0T0的运行控制位。该位置1或清0用来实现启动计数或停止计数。②TF0T0的溢出中断标志位。当T0计数溢出时由硬件自动置1;在CPU中断处理时由硬件清为0。③TR1T1的运行控制位。功能同TR0。④TF1T1的溢出中断标志位。功能同TF0。TMOD和TCON寄存器在复位时其每一位均清零。2、定时器控制寄存器TCON6.2定时/计数器的工作方式MCS-51片内的定时器/计数器可以通过对特殊功能寄存器TMOD中的控制位C/的设置来选择定时器方式或计数器方式;通过对M1M0两位的设置来选择四种工作方式1、方式0当M1M0设置为00时,定时器选定为方式0工作。在这种方式下,16位寄存器只用了13位,TL0的高三位未用。由TH0的8位和TL0的低5位组成一个13位计数器,如图6-3所示。图6-3定时/计数器选定为方式0工作2、方式1方式1和方式0的工作相同,唯一的差别是TH0和TL0组成一个16位计数器,如图6-4所示。图6-4定时/计数器选定为方式1工作3、方式2方式2把TL0配置成一个可以自动恢复初值(初始常数自动重新装入)的8位计数器,TH0作为常数缓冲器,TH0由软件预置值。当TL0产生溢出时,一方面使溢出标志TF0置1,同时把TH0中的8位数据重新装入TL0中,如图6-5所示。图6-5定时/计数器选定为方式2工作方式2常用于定时控制。例如希望每隔250µs产生一个定时控制脉冲,则可以采用12MHz的振荡器,把TH0预置为6,并使C/=0就能实现。T1的方式2常用作串行口波特率发生器。4、方式3方式3对定时器T0和定时器T1是不相同的。若T1设置为方式3,则停止工作(其效果与TR1=0相同)。所以方式3只适用于T0,如图6-6所示。图6-6定时/计数器选定为方式3工作方式3使MCS-51具有三个定时器/计数器(增加了一个附加的8位定时器/计数器)。当T0设置为方式3时,将使TL0和TH0成为两个相互独立的8位计数器,TL0利用了T0本身的一些控制(C/,GATE,TR0,和TF0)方式,它的操作与方式0和方式1类似。而TH0被规定为用作定时器功能,对机器周期计数,并借用了T1的控制位TR1和TF1。在这种情况下TH0控制了T1的中断。这时T1还可以设置为方式0~2,用于任何不需要中断控制的场合,或用作串行口的波特率发生器。通常,当T1用作串行口波特率发生器时,T0才定义为方式3,以增加一个8位计数器。6.3定时器/计数器的初始化1、初始化步骤MCS-51内部定时器/计数器是可编程序的,其工作方式和工作过程均可由MCS-51通过程序对它进行设定和控制。因此,MCS-51在定时器/计数器工作前必须先对它进行初始化。初始化步骤为:(1)根据题目要求先给定时器方式寄存器TMOD送一个方式控制字,以设定定时器/计数器的相应工作方式。(2)根据实际需要给定时器/计数器选送定时器初值或计数器初值,以确实需要定时的时间和需要记数的初值。(3)根据需要给中断允许寄存器IE选送中断控制字和给中断优先级寄存器IP选送中断优先级字,以开放相应中断和设定中断优先级。(4)给定时器控制寄存器TCON送命令字,以启动或禁止定时器/计数器的运行。2、计数器初值的计算定时器/计数器可用软件随时随地起动和关闭,起动时它就自动加“1”记数,一直记到满,即全为“1”,若不停止,计数值从全“1”变为全“0”,同时将计数溢出位置“1”并向CPU发出定时器溢出中断申请。对于各种不同的工作方式最大的定时时间和计数数目不同。这里在使用中就会出现两个问题:一是要产生比定时器最大的定时时间还要小的时间和计数器最大计数次数还要小的计数次数怎么办?二是要产生比定时器最大的定时时间还要大的时间和计数器最大计数次数还要大的计数次数怎么办?解决以上第一个问题只要给定时器/计数器一个非零初值,开定时器/计数器时,定时器/计数器不从0开始,而是从初值开始,这样就可得到比定时器/计数器最大的定时时间和计数次数还要小的时间和计数次数,解决第二个问题就要用到循环程序了,循环几次就相当于乘几。例如要产生1秒的定时你可先用定时器产生50ms的定时,再循环20次就行了,因为1s=1000ms,也可用其它的组合。有时也可采用中断来实现。由上可见,解决问题的基本出路在于初值的计算,下面就来具体讨论计数器的初值计算和最大值的计算。我们把计数器从初值开始作加1计数到计满为全1所需要的计数值设定为C和计数初值设定为D,由此便可得到如下的计算通式:

D=M-C(1)式中,M为计数器模值,该值和计数器工作方式有关。在方式0时M为213;在方式1时M为216;在方式2和方式3时M为28。3、定时器初值的计算在定时器模式下,计数器由单片机脉冲经12分频后计数。因此,定时器定时时间T的计算公式为:

T=(TM—TC)12/fOSC(µs)(2)式中TM为计数器从初值开始作加1计数到计满为全1所需要的时间。TM为模值,和定时器的工作方式有关;fOSC是单片机晶体振荡器的频率,TC为定时器的定时初值。在式(2)中,若设TC=0,则定时器定时时间为最大(初值为0,计数从全0到全1,溢出后又为全0)。由于M的值和定时器工作方式有关,因此不同工作方式下定时器的最大定时时间也不一样。例如:若设单片机主脉冲晶体振荡器频率fOSC为12MHz,则最大定时时间为:方式0时TMmax=213×1µS=8.192ms方式1时TMmax=216×1µs=65.536ms方式2和3时TMmax=28×1µs=0.256ms

例6-1设方式0工作时,定时时间为1ms,时钟振荡频率为6MHz。解:将数据代入公式(2)得:(213-TC)12/6µS=1ms=1000µsTC=213-500=7692化成二进制数为TC=1111000001100根据13位定时器/计数器特性,高8位F0H送至TH0低5位0CH送TL0,一般TL0的高三位置“0”,可用下列汇编指令实现。MOVTL0,#0CH;5位送TL0寄存器MOVTH0,#0F0H;8位送TH0寄存器C51代码如下:TL0=(8192-500)&0x1f;//取低5位送TL0寄存器

TH0=(8192-500)>>5;//取高8位送TH0寄存器

例6-2若单片机时钟频率fOSC为12MHz,请计算定时2ms所需的定时器初值。解:由于定时器工作在方式2和方式3下时的最大定时时间只有0.256ms,因此要想获得2ms的定时时间定时器必须工作在方式0或方式1。若采用方式0,则根据式(2)可得定时器初值为:

TC=213-2ms/1µs=6129

用计算机附件中的计算器可将6129转换为十六进制数为1830H。注意:这不是定时器工作在方式0时的初值,因定时器工作在方式0时是13位,高字节8位,低字节5位,所以还要进行适当的变换,因为1830H可写成0001100000110000按13位重新组合成0001100000110000这组数就可拼成

1100000100010000这样就得到定时器工作在方式0时的初值C110H。即:TH0应装C1H;TL0应装10H(高三位为0)。若采取方式1,则有:TC=216-2MS/1µs=63536=F830H

即:TH0应装F8H;TL0应装30H。例6-3设T1作定时器,以方式1工作,定时时间为10mS;T0作计数器,以方式2工作,外界发生一次事件即溢出。解:T1的时间常数为:(216-TC)×2µs=10msTC=EC78H

初始化代码(汇编语言):

MOVTMOD,#16H;T1定时方式1,T0计数方式2,即置TMOD寄存器的内容为00010110MOVTL0,#0FFH;T0时间常数低八位送TL0MOVTH0,#0FFH;T0时间常数高八位送TH0MOVTL1,#78H;T1时间常数(低8位)送TL1MOVTH1,#0ECH;T1时间常数(高8位)送TH1SETBTR0;置TR0为1允许T0启动计数SETBTR1;置TR1为1允许T1启动计数C51代码如下:TMOD=0x16;//T1定时方式1,T0计数方式2TL0=0xff;//T0时间常数低八位送TL0TH0=0xff;//T0时间常数高八位送TH0TL1=0x78;//T1时间常数(低8位)送TL1TH1=0xec;//T1时间常数(高8位)送TH1TR0=1;//启动T0计数

TR1=1;//启动T1计数例6-4

设定时器T0,以方式1工作,试编写一个延时1秒的子程序。解:若主频频率为6MHZ可求得T0的最大定时时间为:

TMmax=216×2µs=131.072ms我们就用定时器获得100ms的定时时间再加10次循环得到1秒的延时,可算得100ms定时的定时初值:(216-TC)×2µs=100ms=100000µsTC=216-50000=15536TC=3CB0H

汇编语言程序如下:ORG0000HMOVTMOD,#01H;设置T0为定时模式1MOVR7,#10;设置0.1s计数器初值

ACALLTIME;SJMP$;1秒延时子程序TIME:MOVTL0,#0B0H;设置定时器初值

MOVTH0,#3CHSETBTR0;启动定时器0LOOP1:JBCTF0,LOOP2;测试0.1S时间到标志,如果100ms时间到,转0.1s处理

JMPLOOP1;0.1s时间没有到,继续测试0.1s时间到标志LOOP2:DJNZR7,TIME;1s时间没到,转到TIMERET;子程序返回

END例6-5广告灯的左移右移方法1:延时时间使用TIMER0在MODE0下工作。1、功能说明①开始时P1.0亮,延时0.2秒后左移至P1.1亮,如此左移7次后至P1.7亮,再延时0.2秒右移至P1.6亮,如此右移7次后至P1.0亮。②延时时间0.2秒,使用TIMER0在MODE0下工作(时钟频率fOSC为12MHz)。2、硬件:见图6-7图6-7广告灯的左移右移电路图3、程序如下(例5-4给出的是C51代码,与本例相似,本例给出的是汇编语言程序):ORG00H;起始地址MOVTMOD,#00H;设定TIMER0工作在MODE0START:CLRC;C=0MOVA,#0FEH;ACC=FEH,左移初值MOVR2,#08;R2=08,设左移8次LOOP:RLCA;左移一位MOVP1,A;输出至P1MOVR3,#100;0.2秒ACALLDELAY;2000微妙DJNZR2,LOOP;左移8次MOVR2,#07;R2=07,设右移7次LOOP1:

RRCA;右移一位MOVP1,A;输出至P1MOVR3,#100;0.2秒ACALLDELAY;2000微妙DJNZR2,LOOP1;右移7次JMPSTARTDELAY:SETBTR0;启动TIMER0开始计时AGAIN:MOVTL0,#10H;设定TL0的值MOVTH0,#0C1H;设定TH0的值LOOP1:JBCTF0,LOOP3;TF0是否为1,是则跳至LOOP3,并清TF0JMPLOOP1;不是则跳到LOOP1LOOP3:DJNZR3,AGAIN;R3是否为0?不是则跳到AGAINCLRTR0;是则停止TIMR0计数RETEND方法2:延时时间0.2秒,使用TIMER0在MODE1下工作。程序略方法3:延时时间0.2秒,使用TIMER0在MODE2下工作。程序略方法4:延时时间0.2秒,使用TIMER0在MODE3下工作。程序略例6-6计数器(TIMER0)1、功能说明①T0每输入脉冲3次则P1的LED会做BCD码加1的变化,P1.3~P1.0为个位(8421码),P1.7~P1.4为十位(8421码)。②方法1:TIMER0工作在MODE0计数模式下。2、硬件:见图6-8,只是在AT89C51的14脚(T0)接一个按键,按按键提供计数脉冲。图6-8计数器(TIMER0)3、程序如下:#include<REG51.H>//插入51特殊功能寄存器头文件//--------------------------------------------------------------------------------unsignedcharcount;//定义计数变量//---------------------------------------------------voidmain(void){count=0;//计数器清0P1=0x00;//P1输出初始值00TMOD=0x04;//定时/计数器0设为方式0,计数模式

TR0=1;//启动定时/计数器0while(1){TH0=0xFF;//设定计数3次

TL0=0x1D;while(!TF0);//没有溢出,就等待

TF0=0;//清溢出标志

count++;//计数器加1

if(count==100)count=0;//如果计数值为100,计数器就清0P1=((count/10)<<4)+(count%10);//输出至P1}}方法2:TIMER0在MODE1的计数工作方式下。程序略方法3:TIMER0在MODE2的计数工作方式下。程序略方法4:TIMER0在MODE3的计数工作方式下。程序略例6-7低频信号发生器驱动程序设计一个控制程序,使AT89C51的P1口输出8路低频方波脉冲,频率分别为100、50、25、20、10、5、2、1Hz。使用定时器T0,产生5ms的定时,若晶振选11.0592MHz,则5ms相当于4608个机器周期,T0应工作于方式1,初值位x为:x=65536-4608=60928。用十六进制数表示则:x=0EE00H。对应于P1.0~P1.7,设立8个计数器,初值分别为1、2、4、5、10、20、50、100,由T0的溢出中断服务程序对它们减“1”计数,当减为零时恢复初值,并使相应的口线改变状态,这样就使P1口输出所要求的方波,图6-9例6-7低频信号发生器仿真图。下面分别是有关的部分主程序和T0中断处理程序。图6-9例6-7低频信号发生器仿真图程序如下:#include<REG51.H>//插入51特殊功能寄存器头文件//--------------------------------------------------------------------------------sbitP10=P1^0;//100Hz输出信号口设置sbitP11=P1^1;//50Hz输出信号口设置sbitP12=P1^2;//20Hz输出信号口设置sbitP13=P1^3;//10Hz输出信号口设置sbitP14=P1^4;//5Hz输出信号口设置sbitP15=P1^5;//4Hz输出信号口设置sbitP16=P1^6;//2Hz输出信号口设置sbitP17=P1^7;//1Hz输出信号口设置unsignedcharcount2,count4,count5,count10,count20;unsignedcharcount50,count100;//定义计数变量//===============================================voidmain(void){TMOD=0x01;//定时/计数器0设为方式1TH0=0xEE;//定时5ms初值的高八位送入TH0TL0=0;//初值的低八位送入TL0count2=2;//10ms计时单元置初值

count4=4;//20ms计时单元置初值

count5=5;//25ms计时单元置初值

count10=10;//50ms计时单元置初值

count20=20;//100ms计时单元置初值

count50=50;//250ms计时单元置初值

count100=100;//500ms计时单元置初值

TR0=1;//启动定时器0ET0=1;//开定时/计数器0的中断

EA=1;//开CPU中断

while(1);//等待中断

}voidt0(void)interrupt1using0//定时器0中断处理函数

{TH0=0xEE;//重新将定时50ms初值的高八位送入TH0P10=!P10;//100Hz输出信号取反

count2--;//10ms计时单元减1if(count2==0){count2=2;P11=!P11;}//如果时间到,10ms计时单元重新置初值,50Hz输出信号取反

count4--;//10ms计时单元减1if(count4==0){count4=4;P12=!P12;}//如果时间到,20ms计时单元重新置初值,20Hz输出信号取反

count5--;//20ms计时单元减1if(count5==0){count5=5;P13=!P13;}//如果时间到,25ms计时单元重新置初值,10Hz输出信号取反

count10--;//25ms计时单元减1if(count10==0){count10=10;P14=!P14;}//如果时间到,50ms计时单元重新置初值,5Hz输出信号取反

count20--;//50ms计时单元减1if(count20==0){count20=20;P15=!P15;}//如果时间到,100ms计时单元重新置初值,4Hz输出信号取反

count50--;//250ms计时单元减1if(count50==0){count50=50;P16=!P16;}//如果时间到,250ms计时单元重新置初值,2Hz输出信号取反

count100--;//500ms计时单元减1if(count100==0){count100=100;P17=!P17;}//如果时间到,500ms计时单元重新置初值,1Hz输出信号取反

}图6-10低频信号发生器仿真效果图例6-8波形展宽程序设P3.4输入低频的窄脉冲信号,要求在P3.4输入发生负跳变时,P1.0输出一个500μS的同步脉冲。若晶振频率为6MHz,500μS相当于250个机器周期。我们采用如图6-11所示的设计方法。P1.0的初态为高电平,T0选为方式2对外部事件计数,初值为0FFH;这样P3.4输入发生负跳变时,T0产生溢出,程序查询到TF0为1时,T0改变为500μS的定时器的工作方式,并使P1.0输出低电平,T0溢出后恢复P1.0高电平,T0又工作于外部事件计数方式。图6-11I/O波形和T0方式变换

程序如下:#include<reg51.h>sbitP1_0=P1^0;//P1.0输出展宽波形voidmain(){TMOD=0x06;//T0计数器,方式2TH0=-250;//6MHz频率500微秒定时初值

TL0=255;//初值255可使1个外来脉冲即产生溢出

TR0=1;//启动计数器

while(1){while(TF0==0);//等待首次溢出

TF0=0;//清TF0溢出标志

TMOD=0x02;//T0定时器,方式2P1_0=0;//P1.0输出0while(TF0==0);//等待再次溢出

TF0=0;//清TF0溢出标志

P1_0=1;//P1.0输出1TMOD=0x06;//T0计数器,方式2TL0=255;//重新置计数初值

}}图6-12波形展宽仿真图例6-9简易顺序控制器监控程序在一个简易顺序控制器中,用51P1口上的八个继电器来控制一个机械装置的八个机械动作,要求P1口输出如图6-13所示的波形,现在为这个控制器配一个监控程序。我们采用和例2中相似的方法。根据P1口的输出波形,可划分为十六个状态,用一个工作单元记录P1口当前的状态数(初值为0)。把16个状态的输出数据和持续时间以表格形式存放于程序存贮器中。利用定时器T0产生10ms(时间单位)的定时,在T0的中断服务程序中对当前状态的时间计数器进行计数。当计数器减1到0时,计算下一个状态,查表取出持续时间常数装入当前时间计数器,取出数据输出到P1口。这样便使P1口输出规定的波形,实现对机械装置的操作控制。下面分别为主程序和T0中断服务程序。主程序中,我们用踏步指令代替CPU的其他操作,在实际应用中CPU还执行系统状态的监视等操作(如人工干预、机械装置异常状态输入处理等)。图6-13简易顺序控制器输出波形程序如下:#include<REG51.H>//插入51特殊功能寄存器头文件//--------------------------------------------------------------------------------unsignedcharcodeOUTTAB[]=//输出状态表

{0x00,0x01,0x00,0x02,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80};unsignedintcodeGNTAB[]=//时间常数表

{2000,2200,2400,2600,2800,3000,3200,3400,3600,3800,4000,4200,4400,4600,4800,5000};//--------------------------------------------------------------------------------unsignedcharstaudata;//状态数变量unsignedintcount;//计数变量//---------------------------------------------------voidSPRI(unsignedchara)//P1口操作子函数

{P1=OUTTAB[a];}//根据状态数取数据→P1口//------------------unsignedint

GNI(unsignedchara)//取时间常数子变量

{unsignedinti;i=GNTAB[a];//取时间常数

return(i);//返回时间常数值

}//------------------voidmain(void){P1=0;//P1口初始化

staudata=0;//状态计数器初始化

TMOD=0x01;//定时/计数器0设为方式1TH0=0xff;//0xdc;//定时50ms初值的高八位送入TH0TL0=0x00;//定时50ms初值的低八位送入TL0IE=0x82;//开T0中断,开CPU中断

TR0=1;//启动定时器0while(1);//等待中断

}//=====================voidt0(void)interrupt1using0//定时器0中断处理函数

{TH0=0xff;//0xDC;//重新将定时50ms初值的高八位送入TH0

if(count!=0){count--;}//如果不为0,计数器减1else{

staudata++;//计算下一个状态数

staudata= staudata&0x0f;

SPRI(staudata);//调用对P1口操作函数

count=GNI(staudata);//调用取时间常数函数

}}图6-14简易顺序控制器仿真效果图例6-10脉冲宽度测试程序该程序的功能是测试P3.3上输入的正脉冲宽度,将测试的结果送内部RAM缓冲器中。门控位为1时,仅当P3.3为高电平时,T1才启动计数,利用这个方法,便可以测试P3.3输入脉冲的宽度,测试原理见图6-15。在本例中脉冲宽度以机器周期为单位,且小于65536。请读者修改下面给出的程序,使之能测试宽度更大的脉冲。图6-15脉冲宽度测试原理程序如下:#include<reg51.h>sbitP3_3=P3^3;//定义脉冲输入引脚voidmain(){unsignedchar*P,i;

inta;P=0x30;//指针指向片内30H单元

TMOD=0x90;//GATE=1,工作方式为计数器T1//(T1设为门控制方式1定时)TL1=0x00;TH1=0x00;//装入初值

do{}while(P3_3==1);//等待INT1变低

TR1=1;//启动计数器

while(P3_3==0);//等待INT1变高,即脉冲上升沿

while(P3_3==1);//等待INT1变低,即脉冲下降沿

TR1=0;//停止计数

i=TH1;//读入TH1值

a=i*256+TL1;//计数结果转换为10进制

for(a;a!=0;)//a不等于0时循环,转换为BCD码

{*P=a%10;//个位存放在30单元

a=a/10;P++;}}图6-16脉冲宽度测试仿真效果图

AT89C52中有一个功能较强的定时器/计数器T2,它是一个16位定时/计数器,可通过设置特殊功能寄存器T2CON中的C/T2位,选择将其作为定时器或计数器。6.5.1T2控制寄存器T2CON和T2MOD6.5.1.1状态控制寄存器T2CONT2CON是定时/计数器T2的状态控制寄存器,用于确定T2的工作方式、各种功能选择及有关状态信息。T2CON可位寻址,因此所有标志或控制位都可以用位操作指令来置位或清零。T2CON的格式如下(0xc8):D7D6D5D4D3D2D1D0TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2TF2(T2CON.7):定时器2溢出标志。定时器2溢出时置位,必须由软件清除。当RCLK或TCLK=l时,TF2将不会置位。

EXF2(T2CON.6):定时器2外部标志。当EXEN2=1且T2EX的负跳变产生捕获或重装时,EXF2置位。定时器2中断使能时,EXF2=1将使CPU从中断向量处执行定时器2中断子程序。EXF2位必须用软件清零,在递增/递减计数器模式DCEN=l中,EXF2不会引起中断。

RCLK(T2CON.5):接收时钟标志。RCLK置位时,定时器2的溢出脉冲作为串行口模式l和模式3的接收时钟。RCLK=0时,将定时器l的溢出脉冲作为接收时钟。

TCLK(T2CON.4):发送时钟标志。TCLK置位时,定时器2的溢出脉冲作为串行口模式l和模式3的发送时钟。TCLK=0时,将定时器l的溢出脉冲作为发送时钟。

EXEN2(T2CON.3):定时器2外部使能标志。当EXEN2置位且定时器2未作为串行口时钟时,允许T2EX的负跳变产生捕获或重装。EXEN2=0时,T2EX的跳变对定时器2无效。

TR2(T2CON.2):定时器2启动/停止控制位。置l时启动定时器。

C/T2(T2CON.1):定时器/计数器选择(定时器2)。

0:内部定时器;

1:外部事件计数器(下降沿触发)。

CP/RL2(T2CON.0):捕获/重装标志。置位:EXEN2=1时T2EX的负跳变产生捕获。清零:EXEN2=1时定时器2溢出或T2EX的负跳变都可使定时器自动重装。当RCLK=1或TCLK=1时,该位无效且定时器强制为溢出时自动重装。6.5定时/计数器T26.5.1.2模式控制寄存器T2MODT2MOD是定时/计数器T2的模式控制寄存器,不可位寻址,格式如下(0xC9):D7D6D5D4D3D2D1D0------T2OEDCEN“-”:不可用,保留将来之用。但不可将其置1,这些位在将来8051系列产品中用来实现新的特性,这种情况下,以后用到保留位,复位时或非有效状态时,它的值应为0,而这些位为有效状态时,它的值为1,从保留读到的值是不确定的。

T2OE(T2MOD.1):定时器2输出使能位。

DCEN(T2MOD.0):向下计数使能位。定时器2可配置成向上/向下计数器。6.5.2T2的操作模式定时器2有3种操作模式:捕获、自动重新装载(递增或递减计数)和波特率发生器,这3种模式由T2CON中的控制位RCLK+TCLK和CP/RL2来进行选择,见表6-2。表6-2定时/计数器T2工作模式RCLK+TCLKCP/RL2TR2操作模式00116位自动重装01116位捕获1X1波特率发生器XX0(关闭)6.5.2.1捕获模式在捕获模式中,通过T2CON中的EXEN2设置两个选项。如果EXEN2=0,定时器2作为一个l6位定时器或计数器(由T2CON中C/T2位选择),溢出时置位TF2(定时器2溢出标志位)。通过使能IE寄存器中定时器2的中断使能位,该位可用于产生中断。如果EXEN2=1,与以上描述相同,但增加了一个特性,即外部输入T2EX由1变0时将定时器2中TL2和TH2的当前值各自捕获到RCAP2L和RCAP2H。另外,T2EX的负跳变使T2CON中的EXF2置位,EXF2也像TF2一样能够产生中断,其向量与定时器2溢出中断地址相同,定时器2中断服务程序通过查询TF2和EXF2来确定引起中断的事件。捕获模式如图6-17所示。在该模式中TL2和TH2无重新装载值。当T2EX产生捕获事件时,计数器仍以T2EX的负跳变或振荡频率的l/12。图6-17定时/计数器2的捕获模式6.5.2.2自动重装模式(递增/递减计数器)在16位自动重装模式中,定时器2可通过C/T2配置为定时器/计数器,通过编程控制递增/递减计数。计数的方向是由DCEN(递减计数使能位)确定。DCEN位于T2MOD寄存器中,当DCEN=0时,定时器2默认为向上计数;当DCEN=1时,定时器2可通过T2EX确定递增或递减计数。图6-18显示了当DCEN=0时,定时器2自动递增计数,在该模式中通过设置EXEN2位进行选择。如果EXEN2=0,定时器2递增计数到0FFFFH并在溢出后将TF2置位,然后将RCAP2L和RCAP2H中的16位值作为重新装载值装入定时器2。RCAP2L(0xCA)和RCAP2H(0xCB)的值是通过软件设置的。如果EXEN2=1,16位重新装载可通过溢出或T2EX从高电平1到低电平0的负跳变实现,此负跳变同时将EXF2置位。如果定时器2的中断被使能,则当TF2或EXF2置1时产生中断。如图6-19所示,DCEN=1时定时器2可递增或递减计数,此模式允许T2EX控制计数的方向。当T2EX置1时,定时器2递增计数,计数到0FFFFH后溢出并置位TF2,同时将产生中断(如果中断被使能)。定时器2的溢出将使RCAP2L和RCAP2H中的16位值作为重新装载值装入TL2(0xCC)和TH2(0xCD)。图6-18定时/计数器2的自动重装模式(DCEN=0)图6-19定时/计数器2的自动重装模式(DCEN=1)当T2EX置零时,将使定时器2递减计数。当TL2和TH2计数到等于RCAP2L和RCAP2H时,定时器产生溢出,定时器2溢出置位TF2,并将0FFFFH重新装入TL2和TH2。当定时器2递增/递减产生溢出时,外部标志位EXF2翻转。如果需要,可将EXF2位作为第l7位。在此模式下,EXF2标志不会产生中断。6.5.2.3波特率发生器模式寄存器T2CON的位TCLK和RCLK允许从定时器l或定时器2获得串行口发送和接收的波特率。当TCLK=0时,选用定时器1作为串行口发送波特率发生器;当TCLK=1时,选用定时器2作为串行口发送波特率发生器。RCLK对串行口接收波特率有同样的作用。通过这两位,串行口能得到不同的接收和发送波特率:一个通过定时器l产生,另一个通过定时器2产生。当定时器2工作在波特率发生器模式时,与自动重装模式相似,当TH2溢出时,波特率发生器模式使定时器2寄存器重新装载来自寄存器RCAP2H和RCAP2L的16位的值,寄存器RCAP2H和RCAP2L的值由软件预置。当定时器2工作于模式1和模式3时,波特率由定时器2的溢出率决定:定时器可配置成“定时”或“计数”方式,在许多应用上,定时器被设置在“定时”方式(C/T2*=0)。当定时器2作为定时器时,它的操作不同于波特率发生器。通常定时器2作为定时器,会在每个机器周期递增(1/12振荡频率)。当定时器2作为波特率发生器时,将以振荡频率递增(12时钟模式时为l/2振荡频率),因此,波特率公式如下:

(RCAP2H,RCAP2L)=RCAP2H和RCAP2L的内容,为16位无符号整数。表6-3由定时器2产生的常用波特率波特率振荡器频率定时器212MHz时钟模式RCAP2HRCAP2L375K12MHzFFFF9.6K12MHzFFD94.8K12MHzFFB22.4K12MHzFF641.2K12MHzFEC830012MHzFB1E11012MHzF2AF3006MHzFD8F1106MHzF9576.5.2.4波特率公式汇总定时器2工作在波特率发生器模式,外部时钟信号由T2引脚进入,波特率为:如果定时器2采用内部时钟信号,则波特率为:此处n=32(12时钟模式)或16(6时钟模式)。

fosc一振荡器频率。自动重装值可由下式得到:RCAP2H,RCAP2L=65536-[fosc/(32X波特率)]。6.5.3T2的设置表6-4T2作为定时器模式T2CON内部控制(注1)外部控制(注2)16位重装00H08H16位捕获01H09H波特率发生器接收和发送相同波特率34H36H只接收24H26H只发送14H16H表6-5T2作为计数器模式TMOD内部控制(注1)外部控制(注2)16位02H0AH自动重装03H0BH注:(1)仅当定时器溢出时进行捕获和重装;

(2)当定时/计数器溢出且T2EX(P1.1)发生电平负跳变时产生捕获和重装(定时器2用于波特率发生器模式时除外)。5.2.4可编程时钟输出52系列的单片机,可以设定定时/计数器2,通过P1.0输出时钟信号。Pl.0除作为通用I/O口外,还有两个功能可供选用,即用于定时/计数器2的外部计数输入和定时/计数器2时钟信号输出,图6-20时钟输出方式下的定时器T2结构。通过软件对T2CON.1位C/T2复位为0,对T2MOD.1位T20E置1就可将定时/计数器2选为时钟信号发生器,而T2CON.2位TR2控制时钟信号开始或结束(TR2为启停控制位)。由主振频率(fosc)和定时/计数器2定时、自动重装入方式的计数初值来决定时钟信号的输出频率,其设置公式如下:图6-20时钟输出方式下的定时器T2结构例6-11P1.0输出频率8-99Hz的可调方波用定时器T2来做(12M晶振),初始值为50Hz的相当于20ms周期。仿真效果见图6-21。//========================================================//系统初始频率为50Hz的方波相当于20ms周期,用定时器来做12M晶振下定时//频率从8Hz--99Hz可调节,所以可以做如下参考程序://========================================================#include<reg52.h>unsignedcharcodeLEDcode[]=//定义"0--F"十六个数据的共阴极LED七段显示码

{0x3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论