您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机讲义1(第六章定时器计数器)
第6章MCS-51的定时器/计数器定时器和计数器两种工作模式(1)计数器工作模式(2)定时器工作模式MCS—5l单片机的定时器/计数器具有4种工作方式(方式0、方式1、方式2和方式3),其控制字均在相应的特殊功能寄存器中,通过对它的特殊功能寄存器的编程,可方便地选择定时器/计数器2种工作模式和4种工作方式。6.1定时器/计数器的结构定时器/计数器结构特殊功能寄存器TMOD用于选择定时器/计数器T0、T1的工作模式和工作方式。特殊功能寄存器TCON用于控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。TMOD、TCON这两个寄存器的内容由软件设置。单片机复位时,两个寄存器的所有位都被清0。定时器/计数器T0、T1的逻辑结构)INTGATE(TR控制逻辑ii80C51中有两个16位加计数的定时器/计数器T0、T1(l)计数器两个8位加计数器TLi、THi组成,在不同的工作方式下,其组成结构不同。(2)计数输入可选择两种计数输入,由管理。(3)控制逻辑C/T(4)计数溢出管理溢出中断请求标志位TFi6.1.1工作方式控制寄存器TMODTMODE的功能:用于选择定时器/计数器的工作方式和控制模式格式:(1)GATE——门控位(控制方式选择)GATE=0时,计数器由内部TRi(i=0,1)位控制启、停。GATE=1时,计数器由内部TRi位和外中断引脚确(i=0,1)控制启、停。(2)——计数器模式和定时器模式选择位=0,为定时器模式。对振荡时钟12分频脉冲计数。=1,为计数器模式。计数器对外部输入脉冲计数(即:引脚T0(P3.4)或T1(P3.5)对外部脉冲(负跳变)计数)。INTiTC/TC/TC/(3)M1、M0——计数器的工作方式选择位M1、M0共有4种编码,对应于4种工作方式的选择,如表6—1所示。6.1.2定时器/计数器控制寄存器TCON功能:用于控制计数器的启、停和计数溢出的标志设置格式:(l)TF1、TF0——计数溢出标志位当计数器计数溢出时,该位置1,表示计数溢出并请求中断。进入中断服务程序后由硬件自动清0,使用查询方式时,查询有效后,应以软件方法及时将该位清0(硬件置位软件清零)。(2)TR1、TR0——计数内部启、停控制位TR1(TR0)=1,启动定时器/计数器工作TR1(TR0)=0,停止定时器/计数器工作该位可由软件置1或清0。6.1.3定时器/计数器的操作●定时器/计数器的方式设定、启停控制等,都通过对特殊功能寄存器TMOD和TCON的操作来完成。【例】设定T0为方式1的计数方式,并由内部TR0控制启停,其控制字为××××0101B,设T1为复位状态,故设定控制字为00000101B=05H。使用以下指令完成方式设定。MOVTMOD,#05H或MOV89H,#05HTCON可位寻址操作。对T0的启、停控制通过以下位操作指令完成。SETBTR0或SETB8CH;启动T0计数CLRTR0或CLR8CH;停止T0计数6.2定时器/计数器的工作方式●定时器/计数器按计数器的组成不同,分为4种工作方式如右图所示:方式0:13位计数方式。相当于有5位预分频的8位计数方式。方式1:16位计数方式。方式2:计数常数可自动重装的8位计数方式。方式3:两个8位计数器与波特率发生器的工作方式。6.2.1方式06.2.2方式16.2.3方式26.2.4方式3在方式3下,T1只作波特率发生器。在这样情况下,T1将TF1、TR1资源出借给T0使用。因此,在方式3下,T0可以构成两个独立的计数器结构,如图6-6(a)和图6-6(b)所示。TL0构成一个完整的8位定时器/计数器,而TH0则是一个仅能对fOSC/12脉冲计数的8位定时器。说明:●方式3是为了增加1个附加的8位定时器/计数器而提供的,从而使MCS-51具有3个定时器/计数器、方式3只适用于定时器/计数器T0,定时器/计数器T1不能工作在方式3。T1处于方式3时相当于TR1=0,停止计数(此时T1可用来作串行口波特率产生器)。1.工作方式3下的T0●当TMOD的低2位为11时,T0的工作方式被选为方式3,各引脚与T0的逻辑关系框图如下图所示。定时器/计数器T0分为2个独立的8位计数器:TL0和TH0。TL0使用T0的状态控制位GATE、TR0、,而TH0被固定为1个8位定时器(不能为外部计数模式),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。TC/INT02.T0工作在方式3下T1的各种工作方式●一般情况下,当T1用作串行口的波特率发生器时,T0才工作在方式3。T0处于工作方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。(1)T1工作在方式0T1的控制字中M1、M0=00时,T1工作在方式0。T1是一个13位的定时器/计数器。(2)T1作在方式1T1的控制字中M1、M0=01时,T1工作在方式1。T1是一个16位的定时器/计数器。(3)T1工作在方式2T1的控制字中M1、M0=10时,T1的工作方式为方式2。在这种方式下T1是一个8位的定时器/计数器。(4)T1工作在方式3T1的控制字中M1、M0=11时,T1停止计数。6.3定时器/计数器对输入信号的要求(1)当被选定为定时器工作模式时计数输入信号是内部时钟脉冲,每个机器周期产生1个脉冲使计数器增1。因此,定时器/计数器的输入脉冲的周期与机器周期一样,为时钟振荡频率的1/12。当采用12MHZ频率的晶体时,计数速率为1MHZ,输入脉冲的周期间隔为lμs。由于定时的精度决定于输入脉冲的周期,因此当需要高分辨率的定时时,应尽量选用频率较高的晶体。(2)当定时器/计数器用作计数器时计数脉冲来自相应的外部输入引脚T0或T1。当输入信号产生由1至0的跳变(即负跳变)时,计数器的值增1。每个机器周期的S5P2期间,对外部输入引脚进行采样。如在第一个机器周期中采得的值为1,而在下一个周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1的期间,计数器加1。由于确认1次负跳变要花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24。为了确保某一给定的电平在变化之前能被采样1次,则这一电平至少要保持1个机器周期。6.4定时器/计数器的编程和应用6.4.1方式1的应用【例6-1】假设系统时钟频率采用6MHz,要在P1.0上输出1个周期为2ms的方波。【解】方波的周期用定时器T0来确定,即在T0中设置1个初值,在初值的基础上进行计数,每隔lms计数溢出1次,即T0每隔lms产生1次中断,CPU响应中断后,在中断服务程序中对P1.0引脚信号取反。T0中断入口地址为000BH。为此要做如下几步工作:(l)计算初值设:需要装入T0的初值为X,则有:初值的计算公式为:122oscftnX其中:n=13、16、8(由计数器的的工作方式来决定n的取值)12.2oscnftms1tMHz6f16nosc现1210610126316∵X=∴X==65036将X化为十六进制,即X=FEOCH=1111111000001100B。所以,T0的初值为:TH0=0FEHTL0=0CH(2)初始化程序设计初始化程序包括定时器初始化和中断系统初始化,主要是对寄存器IP、IE、TCON、TMOD的相应位进行正确的设置,并将计数初值送入定时器中。(3)程序设计ORG0000HRESET:AJMPMAIN;转主程序ORG000BH;T0的中断入口地址AJMPIT0P;转T0中断处理程序IT0PORG0100HMAIN:MOVSP,#60H;设堆栈指针MOVTMOD,#01H;设置T0为方式100000001ACALLPT0M0;调用子程序PT0M0HERE:AJMPHERE;自身跳转PT0M0:MOVTL0,#0CH;对T0置定时初值(先低后高)MOVTH0,#0FEHSETBTR0;启动T0开始计时SETBET0;允许T0计数溢出中断SETBEA;CPU开中断RETIT0P:MOVTL0,#0CH;T0中断服务子程序,T0置初值MOVTH0,#0FEHCPLP1.0;P1.0的状态取反RETI如果CPU不做其它工作,也可以采用查询的方式进行控制,查询方式的参考程序如下:MOVTMOD,#01H;设置T0为方式100000001CLRTF0LOOP:SETBTR0;启动T0开始定时(书中这里有错)MOVTL0,#0CH;T0置初值MOVTH0,#0FEHLOOP1:JNBTF0,LOOP1;查询TF0标志是否为1,如为1,说明T0溢出,则往下执行CLRTR0;T0溢出,关闭T0CPLP1.0;P1.0的状态求反SJMPLOOP【例6-2】假设系统时钟为6MHZ,编写定时器T0产生1s定时的程序。【解】(1)定时器T0工作方式的确定(1S的确定)因定时时间较长,采用哪一种工作方式合适呢?由前面介绍的定时器的各种工作方式的特性,可以计算出:方式0(n=13)最长可定时16.384ms:方式1(n=16)最长可定时131.072ms:方式2(n=8)最长可定时512μs。由上可见,可选方式1,每隔100ms中断1次,中断10次为1s。(2)计算计数初值(100ms的定时初值)∵X=12.2oscnftms100tMHz6f16nosc现所以:X=15536=3CB0H因此:TH0=3CH,TL0=B0H(3)10次计数的实现对于中断10次计数,可使T0工作在定时方式,采用循环程序的方法实现。(4)程序设计ORG0000HRESET:LJMPMAIN;上电,转主程序入口MAIN0RG000BH;T0的中断入口地址LJMPIT0P;转T0中断处理程序ITOPORG1000HMAIN:MOVSP,#60H;设堆栈指针M0VB,#0AH;设循环次数10次MOVTMOD,#01H;设T0工作在方式100000001MOVTL0,#0B0H;给T0设初值(先低后高)MOVTH0,#03CHLOOP:SETBTR0;启动T0开始定时SETBET0;允许T0中断SETBEA;CPU开放中断HERE:SJMPHERE;等待中断IT0P:MOVTL0,#0B0H;T0中断服务子程序,重新给T0装入初值MOVTH0,#3CHDJNZB,LOOPCLRTR0;1s定时时间到,停止T0工作RETI6.4.2方式2的应用【例6-3】当T0(P3.4)引脚上发生负跳变时,从P1.0引脚上输出1个周期为lms的方波。如图所示。(假设系统时钟为6MHz)【分析】(1)T0工作方式选择T0引脚上如何引发负跳变?T0定义为方式1计数器模式,T0初值为0FFFFH,可满足要求。(2)T1定义为方式2定时器模式(方式2(n=8)最长可定时512μs)在T0引脚产生l次负跳变后,启动T1每500μs产生1次中断,在中断服务程序中对P1.0引脚信号求反,使P1.0产生周期为1ms的方波。【解】(3)计算T1的初值设T1的初值为X:则HSX0625025612106105002668(4)程序设计ORG0000HRESET:LJMPMAIN;复位入口转主程序ORG000BH;T0中断程序入口地址LJMPIT0P;转T0中断服务程序ORG001BH;T1中断程序入口地址LJMPIT1P;转T1中断服务程序ORG0100HMAIN:MOVSP,#60H;堆栈指针ACALLPT0M2;调用对T0,T1初始化子程序LOOP:MOVC,F0;标志位送进位位JNCLOOP;Cy=0则转。(T0产生过中断了吗?产生过中断,则F0=l,T0没有产生过中断,则跳到LOOP,等待T0中断)SETBTR1;启动T1定时SETBET1;允许T1中断HERE:AJMPHERE;等待T1中断PT0M2:MOVTMOD,#25H;对T1、T0初始化,T1为方式2定时器T0为方式1计数器(00100101)MOVTL0,#0FFH;T0置初值MOVTH0
本文标题:单片机讲义1(第六章定时器计数器)
链接地址:https://www.777doc.com/doc-4488142 .html