STCC单片机定时计数器.ppt

上传人:177277 文档编号:9195939 上传时间:2023-03-02 格式:PPT 页数:121 大小:1.14MB
下载 相关 举报
STCC单片机定时计数器.ppt_第1页
第1页 / 共121页
STCC单片机定时计数器.ppt_第2页
第2页 / 共121页
STCC单片机定时计数器.ppt_第3页
第3页 / 共121页
STCC单片机定时计数器.ppt_第4页
第4页 / 共121页
STCC单片机定时计数器.ppt_第5页
第5页 / 共121页
点击查看更多>>
资源描述

1、1 在测控系统中,常常需要有实时时钟和计数器,以实现定时控制以及对外界事件进行计数。传统8051系列单片机有二个16位定时/计数器,它们是定时/计数器0、定时/计数器1,STC89C52单片机在此基础上增加一个16位定时/计数器2,它们简称为:T0、T1和T2。2 本章主要内容:定时器/计数器的组成与功能,工作模式和工作方式,以及与其相关的4个特殊功能寄存器TMOD、TCON、T2CON、T2MOD各位的定义及其编程,最后介绍定时器/计数器的编程及应用实例。6.1 STC89C52单片机定时器单片机定时器/计数器的组成计数器的组成 6.2 定时定时/计数器计数器0和和1 6.3 定时定时/计数

2、器计数器23 STC89C52定时/计数器由T0、T1、T2和看门狗定时器WDT_CONTR组成,T0由特殊功能寄存器TH0、TL0构成,T1由特殊功能寄存器TH1、TL1构成,T2由特殊功能寄存器TH2、TL2和RXAP2H、RCAP2L构成。6.1 STC89C52 定时器定时器/计数器的组成计数器的组成46.2 定时定时/计数器计数器0和和1 STC89C51RC/RD+系列单片机的定时/计数器0和1,与传统8051的定时/计数器完全兼容。当定时器1作波特率发生器时,定时器0可以当两个8位定时器使用。6.2.1 定时器/计数器0和1的相关寄存器6.2.2 定时/计数器0和1的四种工作方式

3、6.2.3 定时/计数器0或1的应用5 STC89C51RC/RD+系列单片机内部设置的两个16位定时器/计数器0和1都具有定时和计数两种工作模式,在特殊功能寄存器TMOD中有一位控制位 来选择T0或T1为定时器还是计数器,定时器或计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来源于系统时钟,则为定时方式,此时定时/计数器每12个时钟或每6个时钟得到一个计数脉冲,计数值加1;如果计数脉冲来自单片机外部引脚(T0为P3.4,T1为P3.5),则为计数方式,每来一个计数脉冲加1。TC/6当定时器当定时器/计数器计数器工作在定时模式工作在定时模式时,可在

4、烧录用户时,可在烧录用户程序时在程序时在STC-ISP编程器编程器中设置如图中设置如图4-12是系统时钟是系统时钟/12还是系统时钟还是系统时钟/6后让后让T0和和T1进行计数。当定时进行计数。当定时/计数器工计数器工作在作在计数模式时计数模式时,对外部计数脉冲,对外部计数脉冲计数不分频计数不分频。图4-12 计数脉冲倍速设置 67 结论:结论:单片机中的定时器和计数器是一个东单片机中的定时器和计数器是一个东西,只不过计数器用来记录外界发生的事西,只不过计数器用来记录外界发生的事情,而定时器则是由单片机提供的一个非情,而定时器则是由单片机提供的一个非常稳定的计数源。常稳定的计数源。8 综上所述

5、,我们已知定时器综上所述,我们已知定时器/计数器是一种计数器是一种可编程部件可编程部件,所以在其开始工作之前,所以在其开始工作之前,CPU必必须将一些命令(控制字)写入定时器须将一些命令(控制字)写入定时器/计数器。计数器。这个过程称为这个过程称为定时器定时器/计数器的初始化计数器的初始化。当当CPU用软件给定时器设置了某种工作方用软件给定时器设置了某种工作方式之后,式之后,定时器就会按设定的工作方式独立运定时器就会按设定的工作方式独立运行,不再占用行,不再占用CPU的操作时间的操作时间,除非定时器计,除非定时器计数溢出,才可能中断数溢出,才可能中断CPU当前操作。当前操作。6.2.1 定时器

6、/计数器0和1的相关寄存器 STC89C52单片机与定时/计数器0和1的相关寄存器见表6-2所示.表6-2 定时器/计数器的0和1相关寄存器10GATEC/T M10MGATE C/T1M0M控 制 T 1控 制 T 089H和T 类同01M0M00011011方 式方式0 13位方式1 16位方式2 自动重装方式3 适用T001定时器模式计数器模式01与INT 无关00与INT 有关 1.定时/计数器工作模式寄存器TMOD(89H)M1M0:方式选择位:方式选择位C/T :功能选择位功能选择位GATE:门控位门控位11GATE=1时,若时,若TR1=1,并且,并且 INT1=1,允许允许T1

7、计数计数 若若TR1=0,或,或INT1=0,都禁止都禁止T1计数计数 GATE=0,若若TR1=1,允许计数;若允许计数;若TR1=0,禁止计数,禁止计数 返回12 由于在不同方式下计数器位数不同,由于在不同方式下计数器位数不同,因而最大计数值(量程)也不同。因而最大计数值(量程)也不同。方式方式0:M=213=8192 方式方式1:M=216=65536 方式方式2:M=28=256 方式方式3:T0定时器分成两个定时器分成两个8位计数器,位计数器,两个两个M均均256,T1停止计数。停止计数。返回返回13TR1(0):运行控制位运行控制位 2.定时定时/计数器控制寄存器计数器控制寄存器T

8、CON(88H)TF1(0):溢出标志位溢出标志位14 定时器定时器/计数器的初始化计数器的初始化初始化的步骤如下:初始化的步骤如下:确定工作方式确定工作方式-对对TMOD赋值赋值 置定时或计数的初值置定时或计数的初值-可直接写入可直接写入TH0(1),TL0(1)根据需要开放定时器根据需要开放定时器/计数器的中断计数器的中断 启动定时器启动定时器/计数器。计数器。当实现了启动要求之后,定时器就按规当实现了启动要求之后,定时器就按规定的工作方式和初值开始计数或定时。定的工作方式和初值开始计数或定时。15 因为定时器因为定时器/计数器是作计数器是作“加加1”计数,并在计满溢计数,并在计满溢出时产

9、生中断,初值出时产生中断,初值X可以这样计算:可以这样计算:X =M -计数值计数值(计数次数)计数次数)例例1:在:在6MHZ主频下,要求产生主频下,要求产生1ms的定时的定时,计算初值计算初值分析:分析:因为定时器每因为定时器每“加加1”一次所需的时间为一次所需的时间为2s,如果如果要产生要产生1ms的定时,需加的定时,需加500次,次,500即为计数值。即为计数值。方式方式1下工作下工作:初值初值 X=M-计数值计数值=65536-500=FE0CH例例2:计:计100个外部脉冲,产生中断请求,计数初值个外部脉冲,产生中断请求,计数初值x x=M-10016若若Fosc=12MHz,在在

10、P1.0 输出周期为输出周期为400us方方波波,定时定时/计数器工作方式计数器工作方式2,问计数初值为多少问计数初值为多少?初始化程序初始化程序?机器周期=12/Fosc=1us,(256-X)*1us=200usX=56=38HP1.0MOV TMOD,#02HSETB ET0SETB EAMOV TL0,#38HMOV TH0,#38HSETB TR0176.2.2 定时/计数器0和1的四种工作方式 由上节可知,通过对TMOD中的M1M0的设置,可以选择四种工作方式。也就是每个定时器可构成4种电路结构模式。在模式0、1和2,T0和T1的工作方式相同,在模式3,两个定时器的方式不同。下面以

11、T1为例,分述各种工作方式的特点和用法。1方式02方式方式13方式方式2这种工作方式可省去用户软件中重装常数的程序,并可产生相当精度的定时时间。4方式方式 3该方式只适用于定时器T0,T0被拆成两个独立的8位计数器TH0和TL0。TH0不能作为外部计数模式22T0工作在方式3下T1的各种工作方式 T0工作在方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合,定时器T1处于方式3时相当于TR1=0,停止计数。T1运行的控制运行的控制条件只有条件只有2个个,即即C/T和和M1,M0.236.2.3 定时/计数器0或1的应用 定时/计数器的应用编程主要需考虑

12、:根据应用要求,通过程序初始化,正确设置控制字,正确计算计数初值,编写中断服务程序,适时设置控制位等。通常情况下,设置顺序大致如下:l 工作方式控制字(TMOD、T2CON)的设置;l 计数初值的计算并装入THx、TLx、RCAP2H、RCAP2L;l 中断允许位ETx、EA的设置,使主机开放中断;l 启/停位TRx设置;2451系列单片机T0或T1是属于加法计数器,因此就不能直接将实际的计数值作为计数初值送入计数寄存器THx,TLx中,而必须将实际计数值以28、213、216为模求补,以其补码作为计数初值设置THx和TLx。设:实际计数值为X,计数器长度为n(n=8、13、16),则应装入计

13、数器THx和TLx的计数初值为2n-X,式中2n为取模值。例如:工作方式0,以213为模,工作方式1,以216为模等,计数初值:(X)补=2n-X。25定时模式,是对机器周期计数,而机器周期与选定主频密切相关,因此,需要根据应用系统选定的主频来确定机器周期值,现以主频为6MHz为例,则机器周期为:注意:对于传统51系列单片机,式(1)中分子取值为12,而对于STC89C52单片机,式(1)中分子取值是根据计数脉冲倍速设置来定(参见教材图4-12),若单片机选12T,则式(1)分子为12,若选6T,则式(1)分子为6。若没有特别提出,书中STC89C52单片机都选12T模式。)1(s121066

14、126MHz6126 或或或一个机器周期ss26实际定时时间Tc=x Tp式中Tp为机器周期,Tc为所需定时时间,x为所需计数次数,主频和Tc一般是已知值,在求得Tp后就可求得所需计数值x,再求x的补码,即求得定时的计数初值。(x)补=2n-x例如:设定时时间为2ms,机器周期Tp为2s,可求得定时计数次数为:设选用工作方式1,n=16,则应设置的定时计数初值为:(x)补=2n-x=216-x=65536-1000=64536=FC18H,则将其分解成两个8位十六进制数,低8位18H装入TLx,高8位FCH装入THx中。工作方式0、1、2的最大计数次数分别为8192、65536和256。对外部

15、事件计数模式,只需根据实际计数次数求补后变换成两个16进制码即可。次100022smsx276.2.3 定时/计数器0或1的应用1.方式0、1的应用【例6.1】设STC89C52单片机系统时钟频率fCLK为6MHZ,要在P1.0引脚上输出1个周期为2毫秒、占空比为50%的方波信号.P1.01ms1msT=2ms 图6-7 P1.0引脚输出波形 解:(1)计算初值:单片机工作在12T模式 1机器周期=2s=210-6s,T0工作方式0 定时1ms计数次数为:选择工作方式0,n=13,定时计数初值:(x)补=213-500=7692=1E0CH X=1111000001100B 则TH0=F0H,

16、TL0=0CH次50021smsx29(2)初始化程序:l 工作方式控制字(TMOD、T2CON)的设置;TMOD=00H,定时方式0l 计数初值的计算并装入THx、TLx、RCAP2H、RCAP2L;TH0=F0H,TL0=0CHl 中断允许位ETx、EA的设置,使主机开放中断;ET0=1,EA=1,l 启/停位TRx设置;TR0=130方法一、中断方式:ORG 0000H LJMP MAIN ORG 000BH LJMP T0P ORG 0100HMAIN:MOV SP,#60H;设置堆栈指针 MOV TMOD,#00H;T0为定时、方式0、门控GATE0=0 MOV TL0,#0CH;装

17、载计数初值 MOV TH0,#0F0H SETB TR0;启动定时器0计数 SETB ET0;允许定时器0中断 SETB EA;允许CPU中断HERE:AJMP HERE;踏步等待31/*中断服务子程序*/T0P:MOV TL0,#0CH;重装载计数初值 MOV TH0,#0FEH CPL P1.0;P1.0输出求反 RETI END 32方法二:软件查询解:(1)计算初值:机器周期=2s=210-6s,T0工作方式1计数初值:(x)补=65036=FEOCH则TH0=0FEH,TL0=0CH 650365006553621-2)(16smsx补33 ORG0000HSTART:MOVSP,#

18、60H;设置堆栈区 MOV TMOD,#01H;T0定时方式1门控GATE0=0 SETB TR0;启动定时器0计数L1:MOVTH0,#0FEH;装载计数初值 MOVTL0,#0CH LOOP1:JNB TF0,LOOP1;判计数溢出?没有,踏步等待 CLRTF0;溢出,清溢出标志位 CPLP1.0;P1.0输出求反 SJMPL1 END34中断方式、C51编程#includesbit P10=P10;void main()SP=0X60;/*设置堆栈指针*/TMOD=0 x1;/*定时器0:定时、工作方式1、门控GATE0=0*/TL0=0 x0c;/*装载计数初值*/TH0=0 xfe;

19、TR0=1;/*启动定时器0计数*/ET0=1;/*允许定时器0中断*/EA=1;/*允许CPU中断*/while(1);35 void timer0int(void)interrupt 1 TL0=0 x0c;/*重装载计数初值*/TH0=0 xfe;P10=!P10;/*P1.0输出求反*/36【例【例6.2】设设STC89C52单片机系统时钟频率单片机系统时钟频率fCLK为为6MHZ,请编出利用定时请编出利用定时/计数器计数器T0在在P1.1引脚上产生周期为引脚上产生周期为2秒秒,占空比为占空比为50%的方波信号的程序的方波信号的程序1.主程序主程序任务任务:(1)设定设定T0工作方式工

20、作方式1,单片机工作在12T模式,则机器周期为2s,最大定时,最大定时=2162s=131.072ms1s(2)定时常数的设定:定时常数的设定:TC=216-(100ms/2s)=15536=3CB0H每隔每隔100ms中断一次中断一次,中断中断10次为次为1s即:即:TH0应装应装3CH,TL0应装应装B0H。37(3)中断管理:中断管理:允许允许T0中断,开放总中断中断,开放总中断 即:即:IE应装应装10000010B。(4)启动定时器启动定时器T0:SETBTR0(5)设置软件计数器初值:(如使用设置软件计数器初值:(如使用R7)即即R7应装应装0AH(6)动态停机:动态停机:SJMP

21、$382.中断服务程序任务:中断服务程序任务:(1)恢复恢复T0常数;常数;(2)软件计数器减软件计数器减1;(3)判断软件计数器是否为判断软件计数器是否为0。为。为0时,改变时,改变P1.1状状态,并恢复软件计数器初值;不为态,并恢复软件计数器初值;不为0时中断返时中断返回。回。39;主程序:主程序:ORG 0000HAJMP MAIN ORG 000BHAJMP TOINTORG 0030H MAIN:MOVSP,#60HMOV TMOD,#01H程序总清单:40MOV TH0,#3CHMOV TL0,#0B0HMOV IE,#82HSETB TR0MOV R7,#0AHHERE:SJMP

22、HERE41;中断服务子程序中断服务子程序TOINT:MOVTL0,#0B0HMOVTH0,#3CHDJNZR7,NEXTCPLP1.1MOVR7,#0AHNEXT:RETIEND42 C程序清单:文件名:程序清单:文件名:6-2.C#include#define uchar unsigned charuchar COUNT=0;sbit P11=P11;void main()SP=0 x60;/*设置堆栈指针设置堆栈指针*/TMOD=0 x1;/*设置设置T0为定时为定时,工作方式工作方式1,GATE0=0*/TL0=0 xb0;/*装载定时计数初值装载定时计数初值=100ms*/TH0=0

23、 x3c;IE=0 x82;/*定时计数溢出中断允许,定时计数溢出中断允许,CPU中断允许中断允许*/TR0=1;/*启动定时器启动定时器0计数计数*/COUNT=0 xa;/*软件计数初值软件计数初值=10*/while(1)/*踏步等待中断踏步等待中断*/43void timer0int(void)interrupt 1/*定时器定时器0中断函数中断函数*/TL0=0 x0b;TH0=0 x3c;/*重新装载定时计数初值重新装载定时计数初值*/switch(COUNT)/*判断定时判断定时1S吗?吗?*/case 0:P11=!P11;COUNT=0 xa;break;/*1S定时到,定时

24、到,P1.1输出求反输出求反*/default:COUNT=COUNT-1;break;/*没到没到1S,软件计数值减,软件计数值减1*/44方式方式2的应用的应用【例【例6-3】将将T0(P3.4)引脚上发生负跳变信号作为)引脚上发生负跳变信号作为P1.0引脚产生方波的启动信号。要求引脚产生方波的启动信号。要求P1.0脚上输出周脚上输出周期为期为1ms的方波,如图的方波,如图6-5所示(系统时钟所示(系统时钟6MHz)。)。图6-5 负跳变触发输出一个周期为1ms的方波45 T0方式2计数,计数初值:TH0=0FFH,TL0=0FFH T1方式2定时,定时初值:0625025625.0-2)

25、(8smsx补46方法一:(中断方式)方法一:(中断方式)ORG 0000H LJMP MAIN ;跳向主程序跳向主程序MAIN ORG 000BH ;T0的中断入口的中断入口 LJMP T0XINT;T0中断服务程序中断服务程序 ORG 001BH;T1的中断入口的中断入口LJMP T1TIME;T1中断服务程序中断服务程序 47 ORG 0030H;主程序入口主程序入口 MAIN:MOV SP,#60H;设堆栈区设堆栈区 MOV TMOD,#26H;T0方式方式2计数,计数,T1方式方式2定时定时 MOV TL0,#0FFH;T0置初值,计置初值,计1个脉冲个脉冲 MOV TH0,#0FF

26、H SETB ET0;允许允许T0中断中断48MOV TL1,#06H;T1置初值 MOV TH1,#06HSETB ET1 ;允许T1产生定时中断 SETB EA;总中断允许 SETB TR0;启动T0计数 HERE:AJMP HERE49/*T0中断服务子程序*/T0XINT:CLRTR0 ;停止T0计数 SETBTR1 ;启动T1定时 RETI/*T1中断服务子程序*/T1TIME:CPL P1.0 ;P1.0取反 RETIEND50方法二:(方法二:(C程序清单)程序清单)#include sbit P10=P10;void main()SP=0X60;/*设堆栈指针设堆栈指针*/TM

27、OD=0 x26;/*T0方式方式2计数,计数,T1方式方式2定时定时*/TL0=0 xff;/*T0设置计数初值,计设置计数初值,计1个脉冲个脉冲*/TH0=0 xff;51TL1=0 x06;/*T1设置定时初值设置定时初值*/TH1=0 x06;ET0=1;/*允许允许T0中断中断*/ET1=1;/*允许允许T1中断中断*/EA=1;/*允许总中断允许总中断*/TR0=1;/*启动启动T0计数计数*/while(1)/*踏步等待中断踏步等待中断*/52/*计数器0中断服务子程序*/void timer0 xint(void)interrupt 1TR0=0;/*禁止计数器0计数*/TR1

28、=1;/*启动定时器1*/*定时器1中断服务子程序*/void timer1Tint(void)interrupt 3 P10=!P10;/*P1.0输出求反*/53【例6.4】假设某STC89C52应用系统的2个外部中断源已被占用,设置定时器T1工作在方式0,作波特率发生器用.现要求增加1个外部中断源,并控制P1.0引脚输出1个频率5KHz(周期为200us)的方波.fosc=12MHZ.T0(P3.4)100sTH0为方式为方式3定时定时TL0为方式为方式3计数计数(做外部中断源做外部中断源)100sP1.0方式3的应用例题6-4图 定时器P1.0输出的方波信号54T0工作方式3:初值计算

29、:TL0计一个脉冲 TL0=0FFHTH0定时100s,定时初值:TH0=9CHORG0000H LJMPMAIN ORG 000BH ;TL0中断入口地址 LJMP TL0INT ;跳向TL0中断服务子程序,ORG 001BH ;TH0占用T1的中断资源LJMP TH0INT ;跳向TH0中断服务子程序1561002561100-2)(8ssx补55 ORG 0100H ;主程序入口MAIN:MOV TMOD,#07H ;T0方式3,T1方式0定时 MOV TL0,#0FFH ;设置TL0计数初值 MOV TH0,#9CH ;设置TH0定时初值 SETB TR0 ;启动T0计数 MOV IE

30、,#8AH ;设置各中断允许,CPU允许 HERE:AJMP HERE ;循环等待56TL0INT:MOV TL0,#0FFH;重装TL0计数初值 SETB TR1;启动TH0定时 RETITH0INT:MOV TH0,#9CH;重装TH0定时初值 CPLP1.0;P1.0输出求反 RETI END 57查询方式#includesbit P10=P10;void timer1int(void);void main()TMOD=0 x07;TL0=0 xff;TH0=0 xa2;TR0=1;P10=1;while(1)if(TF0)TL0=0 xff;TR1=1;TF0=0;if(TF1)tim

31、er1int();TF1=0;void timer1int()TH0=0 xa2;/*重装初值影响精度,修正值为A2H*/P10=!P10;58门控位 GATE的应用【例6.5】门控GATE1使定时/计数器T1启动计数受控。当GATE1为1,TR1为1时,只有 引脚 输入高电平,T1才被允许计数,故可测引脚P3.3上正脉冲宽度(机器周期数)。解:门控为1,定时器启动计数受外部输入电平的影响,可测外部输入脉冲宽度。被测脉冲输入P3.3(),T1为定时方式。INT1INT159GATE=1,若TR1=1,INT1=1,计数开始GATE=1,若TR1=0或INT1=0,计数停止TR1=1返回图6-6

32、 60设计思路:1.建立被测脉冲:设置定时/计数器0定时、工作方式2,门控GATE0=0,定时溢出使P3.0引脚求反,从而输出周期为1ms方波作为被测脉冲,P3.0输出信号连接到P3.3引脚,61 2.测量方法:采用查询方式来测量P3.3引脚输入正脉冲宽度,设置定时/计数器1为定时工作方式1,GATE1=1,则利用(P3.3)引脚和TR1信号控制定时器1计数(启、停),当GATE1=1时,=1且TR1=1,启动定时器1计数,若 =0,或者TR1=0,禁止定时器计数,如图6-6所示。将计数器的TH1计数值送P2口,TL1计数值送P1口显示。INT1INT162 3.计数初值的计算:计算定时器0工

33、作方式2时,T0计数初值为:062502562ms5.02(x)8s补定时/计数器1设置为定时工作方式1,计片内脉冲,从0开始计数,初值为0000H,即TH1=00H,TL1=00H。63方法一、查询方式的汇编程序 ORG0000HRESET:AJMP MAIN ;复位入口转主程序ORG000BHCPLP3.0RETI ORG 0030H ;主程序入口MAIN:MOV SP,#60H MOVTMOD,#92H;T0方式2定时,;T1为方式1定时,门控为1 MOV TL1,#00H MOV TH1,#00HMOVTL0,#06HMOVTH0,#06HSETBTR0SETBET0SETBEA 64

34、 LOOP0:JB P3.3,LOOP0;等待为低电平 SETB TR1;如为低电平,设置TR1=1 LOOP1:JNB P3.3,LOOP1;等待升高电平 LOOP2:JB P3.3,LOOP2;=1,启动T1计数,CLR TR1 ;=0,停止T1计数CLRTR0 MOV P2,TH1;T1计数值送显示器MOV P1,TL1AJMP LOOP0ENDINT1INT165 执行以上程序,使引脚上出现的正脉冲宽度以机器周期数的形式显示在数码管上值:TH0=00H,TL0=FBH,则脉冲宽度TW=FBH2s=502s,理论值为500s。66 中断方式 从图6-6中知,外部中断1引脚P3.3第一次下

35、降沿信号,产生第一次中断触发,在中断服务程序中设置TR1=1,由于此时 不能启动定时器1工作,当脉冲信号出现P3.3上升沿时,自动启动定时器1计数,而当脉冲信号出现P3.3第2次下降沿,即降为0,自动停止定时器1计数,则在中断服务程序中使TR1=0,从启动T1计数到停止T1计数所记录的计数值乘以机器周期值就是正脉冲的宽度。0INT167 方法二:中断方式 ORG0000H RESET:AJMP MAIN ;复位入口地址,转主程序ORG 000BHAJMP T0TIMEORG 0013HAJMP INT1INT ORG 0030H;主程序入口地址 MAIN:MOV SP,#60H;设置堆栈指针

36、68 MOV TMOD,#92H;T1为方式1定时,GATE1=1,T0方式2定时 MOV TL1,#00H;设置T1定时初值 MOV TH1,#00HMOVTL0,#06H;设置T0定时初值MOVTH0,#06HSETBTR0;启动T0计数SETBET0;允许T0中断SETB IT1;设置外部中断1下降沿触发中断SETBEX1;允许外部中断1的中断请求SETBEA;允许CPU总中断CLR00H ;设置中断标志,该位为0,中断一次,为1中断2次 LOOP0:MOVP2,TH1 ;T1计数值送显示器MOVP1,TL1AJMPLOOP069T0TIME:CPL P3.0;P3.0输出求反RETII

37、NT1INT:JB 00H,INT12 ;第2次中断?是,转INT12SETB TR1;第1次,启动定时器1计数 SETB 00H;建立中断标志RETIINT12:CLRTR1;第2次中断,禁止定时器计数RETIEND70方法三:C51程序#include sbit P30=P30;sbit flag=PSW5;void main()SP=0X60;TMOD=0 x92;TL0=0 x06;TH0=0 x06;TL1=0 x0;TH1=0 x0;71 TR0=1;IT1=1;IE=0 x86;flag=0;while(1)P2=TH1;P1=TL1;72 void timer0int(void

38、)interrupt 1P30=!P30;void int1int(void)interrupt 2if(flag=0)TR1=1;flag=1;else TR1=0;73 执行以上程序,使引脚上出现的正脉冲宽度以机器周期数的形式显示在数码管上值:TH0=00H,TL0=F9H,则脉冲宽度为:TW=F9H2s=2492s=498s,理论值为500s。746.3 定时/计数器2 定时/计数器2是一个16加法(或减法)计数器,通过设置特殊功能寄存器T2CON中的位 可将其设置为定时器或计数器,设置特殊功能寄存器T2MOD中的DCEN位可将其作为加法(向上)计数器或减法(向下)计数器。T2C/6.3

39、.1 与定时器/计数器2相关的寄存器6.3.2 定时/计数器2的三种工作方式6.3.3 定时/计数器2 应用756.3.1 与定时器/计数器2相关的寄存器 与T2相关的寄存器见表6-5所示,T2控制寄存器T2CON与模式寄存器T2MOD相应位配置来确定T2用于定时还是计数模式、T2的工作方式,T2的启停和中断触发方式,TL2和TH2用于装载T2的计数值,RCAP2L和RCAP2H用于装载捕获值或重新装载值。76表6-5 与定时/计数器2相关的寄存器返回771、T2MOD寄存器是定时器/计数器2的模式寄存器,字节地址为C9H,不可位寻址。特殊功能寄存器T2MOD的格式如表6-6所示。D7D6D5

40、D4D3D2D1D0T2MOD T2OE DCEN 表6-6 特殊寄存器T2MOD格式T2OE:定时/计数器2时钟输出使能位,当T2OE=1的时候,允许时钟输出到P1.0。DCEN:定时/计数器2的向下计数使能位。DCEN=1时,定时/计数器2向下计数,否则向上计数。返回返回9778 2、T2CON寄存器是T2控制寄存器,用于设置T2工作模式:定时或计数,T2的三种工作方式:捕获、重新装载、波特率发生器,字节地址为C8H,可位寻址。特殊功能寄存器T2CON的格式如表6-7所示。表6-7 特殊寄存器T2CON格式D7D6D5D4D3D2D1D0T2CONTF2EXF2RCLKTCLKEXEN2T

41、R2 位地址CFHCEH CDHCCHCBHCAHC9HC8HRL2CP/T2C/79 (1):T2的捕获/重装载标志,只能通过软件的置位或清除。=1且EXEN2=1时,T2EX引脚(P1.1)负跳变产生捕获 =0且EXEN2=0时,定时器2溢出或T2EX引脚(P1.1)负跳变都可使定时器2自动重装载,若RCLK=1或TCLK=1时,控制位不起作用的,定时器被强制为溢出时自动重装载模式。(2):定时/计数器2的模式选择位,只能通过软件的置位或清除;=0,定时/计数器2为内部定时模式;=1:定时/计数器2为外部计数模式,下降沿触发。RL2CP/RL2CP/RL2CP/T2C/T2C/T2C/80

42、(3)TR2:定时/计数器2的启动控制标志;TR2=1:启动T2计数;TR2=0:停止T2计数。(4)EXEN2:T2的外部使能标志,用来选择定时/计数器工作方式,只能通过软件的置位或清除;EXEN2=0:禁止外部时钟触发T2,T2EX引脚(P1.1)负跳变对T2不起作用。EXEN2=1且T2未用作串行口波特率发生器时,允许外部时钟触发T2,即T2EX(P1.1)引脚负跳变产生捕获或重装,并置位EXF2,申请中断。81(5)TCLK:串行口发送时钟标志,只能通过软件的置位或清除。TCLK=1,将T2溢出脉冲作为串行口模式1或模式3的发送时钟,TCLK=0,将T1溢出脉冲作为串行口模式1或模式3

43、的发送时钟。(6)RCLK:串行口接收时钟标志,只能通过软件的置位或清除;RCLK=1,将T2溢出脉冲作为串行口模式1或模式3的接收时钟,RCLK=0,将T1溢出脉冲作为串行口模式1或模式3的接收时钟82 (7)EXF2:T2的捕获或重装的标志,必须用软件清0。当EXEN2=1且T2EX引脚(P1.1)负跳变产生T2的捕获或重装时,EXF2置位。当T2中断允许时,EXF2=1将使CPU进入中断服务子程序,即EXF2只能当T2EX引脚(P1.1)负跳变且EXEN2=1时才能触发中断,使EXF2=1。在递增或递减计数器模式(DCEN=1)中,EXF2不会引起中断。(8)TF2:T2溢出标志位,T2

44、溢出时置位,并申请中断,只能用软件清除。但T2作为波特率发生器使用的时候(即RCLK=1或TCLK=1),T2溢出时不对TF2置位。836.3.2 定时/计数器2的三种工作方式 T2和T0或T1有所区别,T2工作方式由特殊功能寄存器T2CON来设定如表6-8所示,T2的三种工作方式是:自动重装初值的16位定时/计数器、捕获事件和波特率发生器。84 T2的3种工作方式设定见表6-8所示RCLK+TCLK TR2工作方式工作方式00116位自动重装01116位捕获1X1波特率发生器X X0关闭 表6-8 定时/计数器2的三种工作方式RL2CP/85 1.自动重装方式:当定时器2工作于自动重装载方式

45、时,可通过C/T2#配置为定时器或计数器,并且可编程控制向上或向下计数,计数方向通过特殊功能寄存器T2MOD(见表6-6)的DCEN 位来选择的,DCEN 置为“0”,定时器2默认为向上计数,当DCEN置位“1”时,则定时器2 通过T2EX 引脚来确定向上计数还是向下计数(见图6-8)。86 (1)当DCEN=0 时见图6-7所示,定时器2自动设置为向上计数,在这种方式下,T2CON 中的EXEN2 控制位有两种选择,若EXEN2=0,定时器2 为向上计数至0FFFFH 溢出,置位TF2 激活中断,同时把16 位计数寄存器RCAP2H 和RCAP2L重装载,RCAP2H 和RCAP2L 的值可

46、由软件预置。若EXEN2=1,定时器2 的16 位重装载由溢出或外部输入端T2EX 从1 至0 的负跳变触发。这个脉冲使EXF2 置位,如果中断允许,同样产生中断。87(2)当DCEN=1时,如图6-8所示,定时器T2向上或向下计数。在这种模式下,T2EX引脚控制着计数的方向。l T2EX上的一个逻辑1使得T2递增计数,计到0FFFFH溢出,并置位TF2,若中断允许,还将产生中断。定时器的溢出也使得RCAP2H和RCAP2L中的16位值重新加载到TH2和TL2中。l T2EX 上的一个逻辑0使得T2 递减计数。当TH2 和TL2 计数到等于RCAP2H 和RCAP2L中的值的时候,计数器下溢,

47、置位TF2,并将0FFFFH值加载到TH2和TL2中。T2上溢或下溢,外部中断标志位EXF2 被锁死。在这种工作模式下,EXF2不能触发中断。88 2.捕获方式:在捕获方式下,通过T2CON 控制位EXEN2 来选择两种选项。(1)当EXEN2=0,此时,T2是一个16位定时器还是计数器由T2CON中 来选择,溢出时置位TF2标志,若T2中断允许(ET2=1)将会引起中断,如图6-9所示。T2C/89 (2)当EXEN2=1,T2仍是一个16位定时器或计数器,但增加一个功能:u外部输入T2EX引脚(P1.1)1至0的负跳变将使得TH2和TL2中的值分别捕捉到RCAP2H和RCAP2L中。uT2

48、EX 的跳变会引起T2CON 中的EXF2 置位。捕捉模式如图6-9所示。在该方式中,TH2和TL2无重新装载值,当T2EX引脚产生捕获事件时,计数器仍以T2引脚(P1.0)脉冲或振荡频率1/12(或1/6)计数。注意:EXF2像TF2 一样会引起中断(EXF2中断向量与定时器2溢出中断地址相同002BH,在T2中断服务程序中可以通过查询TF2和EXF2来确定引起中断的事件)。90 3.波特率发生器通过设置T2CON(见表6-7)中的TCLK或RCLK可选择T1或T2 作为串行口波特率发生器。当TCLK=0时,定时器T1作为串行口发送波特率发生器;当TCLK=1时,定时器T2作为串行口发送波特

49、率发生器;RCLK对串行口接收波特率有同样作用,通过对TCLK、RCLK的设置,串行口能够得到不同来源的发送和接收的波特率。波特率一个通过定时器T1产生,另一个通过定时器T2产生。91 如图6-10所示为T2 工作于波特率发生器模式逻辑结构图,该工作模式与自动重装模式相似,当T2溢出时,波特率发生器模式使得T2的寄存器用RCAP2H和RCAP2L中的16位数值重新装载,寄存器RCAP2H和RCAP2L值由软件预置.92 (1)T2配置为计数方式时,外部时钟信号由T2引脚引入,当工作于方式1或方式3时,波特率由下面公式确定:方式1和方式3的波特率=定时器T2溢出率/16 (2)T2可配置为定时方

50、式,在多数应用情况下,一般配置成定时模式(=0)。T2作为波特率发生器与作为定时器操作有所不同,作为定时器时,它会在每个机器周期递增(1/6或1/12晶振频率);然而,T2作为波特率发生器,它的波特率计算公式如下:RCAP2L)(RCAP2H,-(65536n31晶振频率的波特率和方式方式式中,n=16(6时钟模式)或n=32(12时钟模式),(RCAP2H,RCAP2L)是RCAP2H和RCAP2L寄存器内容,为16位无符号整数。T2C/93 T2作为波特率发生器如图6-10所示,只有在T2CON中RCLK=1或TCLK1时,波特率工作方式才有效。在波特率发生器工作方式中,TH2的溢出并不置

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 管理/人力资源 > 绩效管理

一课资料网交流QQ群:678591818  网站客服QQ:2935355895 copyright@ 2020-2024 www.ekdoc.com网站版权所有

经营许可证编号:鄂ICP备20004875号