定时器、计数器及实验_第1页
定时器、计数器及实验_第2页
定时器、计数器及实验_第3页
定时器、计数器及实验_第4页
定时器、计数器及实验_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

定时器/计数器及实验MCS-51单片机可提供两个16位的定时/计数器:定时/计数器1和定时/计数器0。它们均可用作定时器或事件计数器,为单片机系统提供计数和定时功能。12.1定时/计数器的结构及工作原理图12-1为定时/计数器的结构框图。由图12-1可见,定时/计数器的核心是一个加1计数器,加1计数器的脉冲有两个来源,一个是外部脉冲源,另一个是系统的时钟振荡器。计数器对两个脉冲源之一进行输入计数,每输入一个脉冲,计数值加1。当计数到计数器为全1时,再输入一个脉冲就使计数值回零,同时从最高位溢出一个脉冲使特殊功能寄存器TCON(定时器控制寄存器)的某一位TF0或TF1置1,作为计数器的溢出中断标志。如果定时/计数器工作于定时状态,则表示定时的时间到,若工作于计数状态,则表示计数回零。所以,加1计数器的基本功能是对输入脉冲进行计数,至于其工作于定时还是计数状态,则取决于外接什么样的脉冲源。当脉冲源为时钟振荡器(等间隔脉冲序列)时,由于计数脉冲为一时间基准,所以脉冲数乘以脉冲间隔时间就是定时时间,因此为定时功能。当脉冲源为间隔不等的外部脉冲发生器时,就是外部事件的计数器,因此为计数功能。 图12-1定时/计数器结构框图用作“定时器”时,在每个机器周期寄存器加1,也可以把它看作是在累计机器周期。由于一个机器周期包括12个振荡周期,所以,它的计数速率是振荡频率的1/12。如果单片机采用12MHz晶体,则计数频率为1MHz,即每微秒计数器加l。这样不但可以根据计数值计算出定时时间,也可以反过来按定时时间的要求计算出应计数的预置值。用作“计数器”时,MCS-51在其对应的外输入端T0(P3.4)或T1(P3.5)有一个输入脉冲的负跳变时加1。最快的计数速率是振荡频率的1/24。定时/计数器T0由两个8位特殊功能寄存器TH0和TL0构成,定时/计数器T1由两个8位特殊功能寄存器TH1和TL1构成。方式寄存器TMOD用于设置定时/计数器的工作方式,控制寄存器TCON用于启动和停止定时/计数器的计数,并控制定时/计数器的状态。对于每一个定时/计数器其内部结构实质上是一个可程控加法计数器,由编程来设置它工作在定时状态或计数状态。8位特殊功能寄存器TH0和TL0(或TH1和TL1)可被程控为不同的组合状态(13位、16位、两个分开的8位等),从而形成定时/计数器四种不同的工作方式,这也只需用指令改变TMOD的相应位即可。12.2定时/计数器方式寄存器和控制寄存器方式寄存器TMOD和控制寄存器TCON用于控制定时/计数器的工作方式,一旦把控制字写入TMOD和TCON后,在下一条指令的第一个机器周期初(S1P1期间)就发生作用。两个寄存器格式如下:1.定时/计数器方式寄存器TMODD7D6D5D4D3D2D1D0TMODGATEC/TM1M0GATEC/TM1M0(89H)定时器T1方式字段定时器T0方式字段其中高4位控制定时器T1,低4位控制定时器T0。M1、M0:工作方式选择位。定时器/计数器具有4种工作方式,由M1M0位来定义,如表12-1。M1M0工作方式功能说明00方式013位定时/计数器01方式116位定时/计数器10方式2可自动再装入的8位定时/计数器11方式3把定时/计数器0分成两个8位的计数器,关闭定时/计数器T1。表12-1定时/计数器工作方式选择C/T:选择“计数器”或“定时器”功能,C/T=1为计数器功能(计数在T0或T1端的负跳变)。C/T=0为定时器功能(计机器周期)。GATE:选通控制。GATE=0,由软件控制TR0或TR1位启动定时器;GATE=1,由外部中断引脚INT0(P3.2)和INT1(P3.3)输入电平分别控制T0和T1的运行。2.定时/计数器控制寄存器TCONbit8FH8EH8DH8CH8BH8AH89H88HTCONTF1TR1TF0TR0IE1IT1IE0IT1(88H)与外部中断有关TF1:定时器T1溢出中断标志,当定时器T1溢出时由内部硬件置位,申请中断,当单片机转向中断服务程序时,由内部硬件将TF1标志位清0。TR1:定时器T1运行控制位,由软件置位/清除来控制定时器T1开启/关闭。当GATE(TMOD.7)为0而TR1为l时,允许T1计数;当TR1为0时禁止T1计数。当GATE(TMOD.7)为l时,仅当TR1=1且INT1输入为高电平才允许T1计数,TR1=0或INT1输入低电平都禁止T1计数。TF0:定时器T0溢出标志,其含义与TF1类同。TR0:定时器T0的运行控制位,其含义与TR1类同。复位时,TMOD和TCON的所有位均清0。TCON的低4位与外部中断有关,在下一章再作介绍。12.3定时/计数器的工作方式2个16位定时器/计数器具有定时和计数两种功能,每种功能包括了4种工作方式。用户通过指令把方式字写入TMOD中来选择定时器/计数器的功能和工作方式,通过把计数的初始值写入TH和TL中来控制计数长度,通过对TCON中相应位进行置位或清0来实现启动定时器工作或停止计数。还可以读出TH、TL、TCON中的内容来查询定时器的状态。12.3.1方式0当M1M0两位为00时,定时器/计数器被选为工作方式0。其等效框图如图12-2所示。方式0是一个13位的定时器/计数器。定时器T1的结构和操作与定时器T0完全相同。在这种方式下,16位寄存器(TH0和TL0)只用13位。其中TL0的高3位未用,其余位占整个13位的低5位,TH0占高8位。当TL0的低5位溢出时向TH0进位,而TH0溢出时向中断标志TF0进位(硬件置位TF0),并申请中断。定时器T0计数溢出与否可通过查询TF0是否置位,或是否产生定时器T0中断而知道。图12-2定时器T0(或T1)方式0结构当C/T=0时,多路开关连接振荡器的12分频器输出,T0对机器周期计数,这就是定时工作方式。当C/T=l时,多路开关与引脚P3.4(T0)相连,外部计数脉冲由引脚T0输入。当外信号电平发生1到0跳变时,计数器加1,这时T0成为外部事件计数器。当GATE=0时,封锁“或”门,使引脚INT0输入信号无效。这时,“或”门输出为常“1”,打开“与”门,由TR0控制定时器T0的开启和关断。若TR0=1,接通控制开关,启动定时器T0,允许T0在原计数值上作加法计数,直至溢出。溢出时,计数寄存器值为0,TF0=1,并申请中断,T0从0开始计数。因此,若希望计数器按原计数初值开始计数,在计数溢出后,应给计数器重新赋初值。若TR0=0,则关断控制开关,停止计数。当GATE=1,且TR0=l时,“或”门、“与”门全部打开,外信号电平通过INT0直接开启或关断定时器计数。输入“1”电平时,允许计数,否则停止计数。这种操作方法可用来测量外信号的脉冲宽度等。当为计数工作方式时,计数值的范围是:1~8192(213)当为定时工作当时,定时时间的计算公式为:(213-计数初值)x晶振周期x12或(213-计数初值)x机器周期12.3.2方式1当M1M0两位为01时,定时器/计数器被选为工作方式1。其等效框图如图12-3所示。图12-3定时器T0(或T1)方式1结构方式1为16位计数结构的工作方式,计数器由8位TH0和8位TL0构成(定时器T1的结构和操作与定时器T0完全相同)。其逻辑电路和工作情况与方式0完全相同,所不同的只是组成计数器的位数。当为计数工作方式时,计数值的范围是:1~65536(216)当为定时工作方式时,定时时间计算公式为:(216-计数初值)x晶振周期x12或(216-计数初值)x机器周期12.3.3方式2当M1M0两位为10时,定时器/计数器被选为工作方式2。其等效框图如图12-4所示。图12-4定时器T0(或T1)方式2结构方式0和方式1的最大特点是计数溢出后,计数器全为0,因此循环定时或计数应用时就存在重新设置计数初值的问题,这不但影响定时精度,而且也给程序设计带来不便。方式2就是针对此问题而设置的,它具有自动重新加载功能,因此也可以说方式2是自动重新加载工作方式。在这种工作方式下,把16位计数器分为两部分,即以TL0作计数器,以TH0作预置寄存器,初始化时把计数初值分别装入TL0和TH0中。当计数溢出后,由预置寄存器以硬件方法自动加载。初始化时,8位计数初值同时装入TL0和TH0中。当TL0计数溢出时,置位TF0,同时把保存在TH0中的计数初值自动加载装入TL0中,然后TL0重新计数,如此重复不止,这不但省去了用户程序中的重装指令,而且有利于提高定时精度。但这种方式下计数值有限,最大只能到256。这种自动重新加载工作方式非常适用于连续定时或计数应用。当为计数工作方式时,计数值的范围是:1~256(28)当为定时工作方式时,定时时间计算公式为:(28-计数初值)x晶振周期x12或(28-计数初值)x机器周期12.3.4方式3当M1M0两位为11时,定时器/计数器被选为工作方式3。前三种工作方式下,对两个定时器/计数器的使用是完全相同的,但是在方式3下,两个定时器/计数器的工作却是不同的。定时器/计数器T0:在方式3下,定时器/计数器T0被拆成两个独立的8位计数器TL0和TH0,其中TL0既可以计数使用,又可以定时使用,定时器/计数器T0的各控制位和引脚信号全归它使用。其功能和操作与方式0和方式1完全相同,而且逻辑电路结构也极其类似,如图12-5。图12-5定时器T0(或T1)方式3结构但TH0则只能作为简单的定时器使用,而且由于定时器/计数器T0的控制位已被TL0所占用,因此只好借用定时器/计数器T1的控制位TR1和TF1,即计数溢出置位TF1,而定时的启动和停止则受TR1的状态控制。由于TH0只能作定时器使用而不能作计数器使用,因此在方式3下,定时器/计数器T0可以构成二个定时器;或一个定时器一个计数器。定时器/计数器T1:如果定时器/计数器T0已被设置为工作方式3,则定时器/计数器T1只能设置为方式0,方式1或方式2,因为它的运行控制位TR1及计数溢出标志位TF1已被定时器/计数器T0所占据,在这种情况下,定时器/计数器T1通常是作为串行口的波特率发生器使用,因为已没有计数溢出标志位TF1可供使用,因此就把计数溢出直接送给串行口,以决定串行通信的速率。当作为波特率发生器使用时,只需设置好工作方式,便自动运行。如要停止工作,只需送入一个把它设置为方式3的方式控制字就可以了。因为定时器/计数器T1不能在方式3下使用,如果硬把它设置为方式3,就停止工作。12.4定时器/计数器的初始化由于定时器/计数器的功能是由软件编程确定的,所以一般在使用定时器/计数器前都要对其进行初始化,使其按设定的功能工作。初始化步骤一般如下:1.确定工作方式,对TMOD赋值。2.预置定时或计数的初值,可直接将初值写入TH0、TL0或TH1、TL1。3.根据需要开放定时器/计数器的中断,直接对IE位赋值。4.启动定时器/计数器,若已规定用软件启动,则可把TR0或TR1置“1”;若已规定由外中断引脚电平启动,则需给外引脚加启动电平。当实现了启动要求之后,定时器即按规定的工作方式和初值开始计数或定时。12.5使用定时器T1以方式0使单片机产生周期为1000μS等宽方波脉冲实验(1000Hz音频),在P1.7输出驱动蜂鸣器发音12.5.1实现方法LED输出试验板使用11.0592MHz晶振,可近似认为其为12MHz,这样一个机器周期为1μS。欲产生1000μS周期方波脉冲,只需在P1.7以500μS时间交替输出高低电平即可。1.T1为方式0,则M1M0=00H。使用定时功能,C/T=0。GATE=0。T0不用,其有关位设为0。这样,TMOD=00H。2.方式0为13位长度计数结构,设计数初值为X,则:(213-X)x1x10-6=500x10-6得X=7692DX=1111000001100B转成16进制后,高8位=F0H,低8位=0CH。即TH1=F0H,TL0=0CH。3.由控制寄存器TCON中的TR1位来控制定时的启动和停止,TR1=1启动,TR1=0停止。12.5.2源程序文件在我的文档中建立一个文件目录(S12-1),然后建立一个S12-1.uv2的工程项目,最后建立源程序文件(S12-1.asm)。输入下面的程序:序号:1 ORG0000H2 LJMPMAIN 3 ORG030H4MAIN: MOVTMOD,#00H5 MOVTH1,#0F0H6 MOVTL1,#0CH7 MOVIE,#00H8 SETBTR19 LOOP: JBCTF1,LOOP110 AJMPLOOP11 LOOP1: MOVTH1,#0F0H12 MOVTL1,#0CH13 CLRTF114 CPLP1.715 AJMPLOOPEND编译通过后,将S12-1文件夹中的hex文件烧录到89C51芯片中,将芯片插入到LED输出试验板上,接上5V稳压电源,蜂鸣器中立即响起悦耳的1KHz音频声。12.5.3程序分析解释 序号1:程序开始。序号2:跳转到MAIN主程序处。序号3:主程序MAIN从地址0030H开始。序号4:置T1为方式0。序号5、6:载入定时初值。序号7:禁止中断。序号8:启动定时器T1。序号9、10:查询T1的溢出标志TF1。TF1=0定时未到,转LOOP继续查询;TF1=1定时到,转LOOP1。序号11、12:重装定时初值。序号13:清除溢出标志。序号14:P1.7输出端取反。序号15:跳转到LOOP处重复循环。序号16:程序结束。12.6使用定时器T1以方式2计数实验,每计10次,进行累加器加1操作,并送P1口显示12.6.1实现方法LED输出试验板使用11.0592MHz晶振,可近似认为其为12MHz,这样一个机器周期为1μS。1.T1为方式2,则M1M0=10H。使用计数功能,C/T=1。GATE=0。T0不用,其有关位设为0。这样,TMOD=60H。2.方式2为8位长度自动重装载计数结构,设计数初值为:(28-10)=246D=11110110B=F6H,即TH1=0F6H,TL1=0F6H。3.由控制寄存器TCON中的TR1位来控制定时的启动和停止,TR1=1启动,TR1=0停止。12.6.2源程序文件在我的文档中建立一个文件目录(S12-2),然后建立一个S12-2.uv2的工程项目,最后建立源程序文件(S12-2.asm)。输入下面的程序:序号:1 ORG0000H2 LJMPMAIN 3 ORG030H4MAIN: MOVTMOD,#60H5 MOVTH1,#0F6H6 MOVTL1,#0F6H7 MOVIE,#00H8 SETBTR19 MOVP1,#00H10 ACALLDEL11 LOOP: JBCTF1,LOOP112 AJMPLOOP13 LOOP1: INCA14 MOVP1,A15 ACALLDEL16 AJMPLOOP17 DEL: MOVR7,#014H18 DEL1: MOVR6,#0FFH19 DEL2:MOVR5,#01FH20 DEL3: DJNZR5,DEL321 DJNZR6,DEL222 DJNZR7,DEL123 RET24 END编译通过后,将S12-2文件夹中的hex文件烧录到89C51芯片中,将芯片插入到LED输出试验板上,接上5V稳压电源,这时P1口外接的8个LED均点亮(输出状态为00H)。将LED输出试验板配带的试验线一端插到标示有“0”电平的排针上,另一端去触碰标示为P3.5(T1)的排针,可发现,每触碰10次后,P1口按二进制加1(→01H→02H…)。有些读者可能会发现,触碰不到10次,P1口也按二进制加1。其实这是由于触碰时的抖动效应,可能一下输入了好几个脉冲。这丝毫也不影响我们对程序的理解。12.6.3程序分析解释 序号1:程序开始。序号2:跳转到MAIN主程序处。序号3:主程序MAIN从地址0030H开始。序号4:置T1为方式2。序号5、6:载入定时初值。序号7:禁止中断。序号8:启动定时器T1。序号9:点亮P1口的LED。序号10:调用延时子程序,使于观察LED点亮状态。序号11、12:查询T1的溢出标志TF1。TF1=0定时未到,转LOOP继续查询;TF1=1定时到,转LOOP1。序号13:累加器加1。序号14:累加器内容送P1口显示。序号15:调用延时子程序,使于观察LED点亮状态。序号16:跳转到LOOP处重复循环。序号17~23:延时子程序。序号24:程序结束。12.7使用定时器T1以方式1定时实验,使P1.0端每隔1分钟取反一次12.7.1实现方法LED输出试验板使用11.0592MHz晶振,可近似认为其为12MHz,这样一个机器周期为1μS。在方式1最大定时时间=65536x12/(12x106)=65536μS=65.536mS,显然离1分钟还差十万八千里。这里我们将T1设定为定时50mS,另设两个软件计数器,采用30H、31H两个单元进行秒、分计数。30H内置常数20,31H内置常数60,这样50mSx20x60=60000mS=60S=1分钟。1.T1为方式1,则M1M0=01H。使用定时功能,C/T=0。GATE=0。T0不用,其有关位设为0。这样,TMOD=10H。2.方式1为16位长度计数结构,计数初值为:(216-X)x1x10-6=50x10-3,X=65536-50000=15536D=3CB0H,即TH1=3CH,TL1=0B0H。3.由控制寄存器TCON中的TR1位来控制定时的启动和停止,TR1=1启动,TR1=0停止。12.7.2源程序文件在我的文档中建立一个文件目录(S12-3),然后建立一个S12-3.uv2的工程项目,最后建立源程序文件(S12-3.asm)。输入下面的程序:序号:1

温馨提示

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

评论

0/150

提交评论