1标题:定时/计数器教学目的与要求:1.理解80C51定时/计数器工作原理2.掌握80C51定时/计数器控制寄存器的名称及设置3.掌握定时/计数器工作方式4.掌握根据不同的工作方式设置定时/计数器的方法授课时数:4教学重点:如何根据定时时间设置定时/计数器的初值及TCON,TMOD教学内容及过程:一、80C51定时/计数器定时/计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,可用来实现定时控制、延时、频率测量、脉宽测量、信号发生、信号检测等。此外,定时/计数器还可作为串行通信中波特率发生器。(一).定时/计数器概述80C51单片机内部有两个定时/计数器T0和T1,其核心是计数器,基本功能是加1。对外部事件脉冲(下降沿)计数,是计数器;对片内机周脉冲计数,是定时器。计数器由二个8位计数器组成。定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后加1计满后溢出。调整计数器初值,可调整从初值到计满溢出的数值,即调整了定时时间和计数值。定时/计数器作为计数器时,外部事件脉冲必须从规定的引脚输入。且外部脉冲的最高频率不能超过时钟频率的1/24。8051定时器/计数器逻辑结构图(二)定时/计数器的控制寄存器⒈定时/计数器控制寄存器TCONTCONT1中断标志T1运行标志T0中断标志T0运行标志INT1中断标志INT1触发方式INT0中断标志INT0触发方式位名称TF1TR1TF0TR0IE1IT1IE0IT0CPUTCON(88H)TH1TL1TH0TL0INT1(P3.3)INT0(P3.2)中断T1(P3.5)定时器1定时器0溢出启动(8DH)(8BH)(8CH)(8AH)启动内部总线溢出工作方式工作方式70T0(P3.4)70TMOD(89H)70702位地址8FH8EH8DH8CH8BH8AH89H88H各位含义如下:(1)TCON.7TF1:定时器1溢出标志位。当定时器1计满数产生溢出时,由硬件自动置TF1=1。在中断允许时,向CPU发出定时器1的中断请求,进入中断服务程序后,由硬件自动清0。在中断屏蔽时,TF1可作查询测试用,此时只能由软件清0。(2)TCON.6TR1:定时器1运行控制位。由软件置1或清0来启动或关闭定时器1。当GATE=1,且为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1即可启动定时器1。(3)TCON.5TF0:定时器0溢出标志位。其功能及操作情况同TF1。(4)TCON.4TR0:定时器0运行控制位。其功能及操作情况同TR1。⒉定时/计数器工作方式控制寄存器TMODTMOD用于设定定时/计数器的工作方式低4位用于控制T0,高4位用于控制T1。高4位控制T1低4位控制T0门控位计数/定时方式选择工作方式选择门控位计数/定时方式选择工作方式选择GC/TM1M0GC/TM1M0⑴M1M0——工作方式选择位M1M0工作方式功能00方式013位计数器01方式116位计数器10方式2两个8位计数器,初值自动装入11方式3两个8位计数器,仅适用T0⑵C/T——计数/定时方式选择位C/T=1,计数工作方式,对外部事件脉冲计数,用作计数器。C/T=0,定时工作方式,对片内机周脉冲计数,用作定时器。⑶GATE——门控位GATE=0,运行只受TCON中运行控制位TR0/TR1的控制。GATE=1,运行同时受TR0/TR1和外中断输入信号的双重控制。只有当INT0/INT1=1且TR0/TR1=1,T0/T1才能运行。TMOD字节地址89H,不能位操作,设置TMOD须用字节操作指令。(三).定时/计数器工作方式⒈工作方式013位计数器,由TL0低5位和TH0高8位组成,TL0低5位计数满时不向TL0第6位进位,而是向TH0进位,13位计满溢出,TF0置“1”。最大计数值213=8192。【例1】用定时器1,方式0实现1s的延时。解:因方式0采用13位计数器,其最大定时时间为:8192×1s=8.192ms,因此,可选择定时时间为5ms,再循环200次。定时时间选定后,再确定计数值为5000,则定时器1的初值为X=M计数值=81925000=3192=C78H=0110001111000B因13位计数器中TL1的高3位未用,应填写0,TH1占高8位,所以,X的实际填写值应为3X=0110001100011000B=6318H,即:TH1=63H,TL1=18H,又因采用方式0定时,故TMOD=00H。可编得1s延时子程序如下:DELAY:MOVR3,#200;置5ms计数循环初值MOVTMOD,#00H;设定时器1为方式0MOVTH1,#63H;置定时器初值MOVTL1,#18HSETBTR1;启动T1LP1:JBCTF1,LP2;查询计数溢出SJMPLP1;未到5ms继续计数LP2:MOVTH1,#63H;重新置定时器初值MOVTL1,#18HDJNZR3,LP1;未到1s继续循环RET;返回主程序⒉工作方式116位计数器,最大计数值为216=65536。【例2】(1)要求:信号灯循环显示,时间间隔为1s。(2)方法:用定时器方式1编制1s的延时程序,实现信号灯的控制。系统采用12MHz晶振,采用定时器1,方式1定时50ms,用R3做50ms计数单元,其源程序可设计如下:ORG0000HCONT:MOVR2,#07HMOVA,#0FEHNEXT:MOVP1,AACALLDELAYRLADJNZR2,NEXTMOVR2,#07HNEXT1:MOVP1,ARRAACALLDELAYDJNZR2,NEXT1SJMPCONTDELAY:MOVR3,#14H;置50ms计数循环初值MOVTMOD,#10H;设定时器1为方式1MOVTH1,#3CH;置定时器初值MOVTL1,#0B0HSETBTR1;启动定时器1LP1:JBCTF1,LP2;查询计数溢出SJMPLP1;未到50ms继续计数LP2:MOVTH1,#3CH;重新置定时器初值MOVTL1,#0B0H4DJNZR3,LP1;未到1s继续循环RET;返回主程序END⒊工作方式28位计数器,仅用TL0计数,最大计数值为28=256,计满溢出后,一方面使溢出标志TF0=1;另一方面,使原来装在TH0中的初值装入TL0。优点:定时初值可自动恢复;缺点:计数范围小。适用于需要重复定时,而定时范围不大的应用场合。【例3】试用定时器1,方式2实现例1中1s的延时。解:因方式2是8位计数器,其最大定时时间为:256×1s=256s,为实现1s延时,可选择定时时间为250s,再循环4000次。定时时间选定后,可确定计数值为250,则定时器1的初值为:X=M计数值=256250=6=6H。采用定时器1,方式2工作,因此,TMOD=20H。可编得1s延时子程序如下:DELAY:MOVR5,#28H;置25ms计数循环初值MOVR6,#64H;置250s计数循环初值MOVTMOD,#20H;置定时器1为方式2MOVTH1,#06H;置定时器初值MOVTL1,#06HSETBTR1;启动定时器LP1:JBCTF1,LP2;查询计数溢出SJMPLP1;无溢出则继续计数LP2:DJNZR6,LP1;未到25ms继续循环MOVR6,#64HDJNZR5,LP1;未到1s继续循环RET⒋工作方式3方式3仅适用于T0,T1无方式3。⑴T0方式3在方式3情况下,T0被拆成二个独立的8位计数器TH0、TL0。①TL0使用T0原有的控制寄存器资源:TF0,TR0,GATE,C/T,INT0,组成一个8位的定时/计数器;②TH0借用T1的中断溢出标志TF1,运行控制开关TR1,只能对片内机周脉冲计数,组成另一个8位定时器(不能用作计数器)。⑵T0方式3情况下的T1T1由于其TF1、TR1被T0的TH0占用,计数器溢出时,只能将输出信号送至串行口,即用作串行口波特率发生器。【例4】用定时器0。方式3实现1s的延时。解:根据题意,定时器0中的TH0只能为定时器,定时时间可设为250s;TL0设置为计数器,计数值可设为200。TH0计满溢出后,用软件复位的方法使T0(P3.4)引脚产生负跳变,TH0每溢出一次,T0引脚便产生一个负跳变,TL0便计数一次。TL0计满溢出时,延时时间应为50ms,循环20次便可得到1s的延时。由上述分析可知,TH0计数初值为5X=(256250)=6=06HTL0计数初值为X=(256200)=56=38HTMOD=00000111B=07H可编得1s延时子程序如下:DELAY:MOVR3,#14H;置100ms计数循环初值MOVTMOD,#07H;置定时器0为方式3计数MOVTH0,#06H;置TH0初值MOVTL0,#38H;置TL0初值SETBTR0;启动TL0SETBTR1;启动TH0LP1:JBCTF1,LP2;查询TH0计数溢出SJMPLP1;未到500s继续计数LP2:MOVTH0,#06H;重置TH0初值CLRP3.4;T0引脚产生负跳变NOP;负跳变持续NOPSETBP3.4;T0引脚恢复高电平JBCTF0,LP3;查询TH0计数溢出SJMPLP1;100ms未到继续计数LP3:MOVTL0,#38H;重置TL0初值DJNZR3,LP1;未到1s继续循环RET(四)、定时/计数器的应用⒈定时器/计数器初始化的主要内容(1)选择工作方式:通过对方式寄存器TMOD进行设置(2)给定时器赋初值(3)根据需要设置中断控制字(4)启动定时器1.定时器/计数器初值设定方法(1)根据定时长短,选择工作方式(2)计算定时/计数初值80C51定时/计数初值计算公式:其中:N与工作方式有关:方式0时,N=13;方式1时,N=16;方式2、3时,N=8。机周时间与主振频率有关:机周时间=12/fosc,fosc=12MHZ时,1机周=1S;fosc=6MHZ时,1机周=2S。【例】已知晶振6MHz,要求定时0.5mS,试分别求出T0工作于方式0、方式1、方式2、方式3时的定时初值。解:⑴工作方式0:213–500S/2S=8192-250=7942=1F06H,1F06H化成二进制:1F06H=0001111100000110B=0001111100000110B6其中:低5位00110前添加3位000送入TL0,TL0=00000110B=06H;高8位11111000B送入TH0TH0=11111000B=F8H。⑵工作方式1:T0初值=216-500s/2s=65536–250=65286=FF06HTH0=FFH;TL0=06H。⑶工作方式2:T0初值=28-500s/2s=256-250=6TH0=06H;TL0=06H。⑷工作方式3:T0方式3时,被拆成两个8位定时器,定时初值可分别计算,计算方法同方式2。两个定时初值一个装入TL0,另一个装入TH0。因此:TH0=06H;TL0=06H从上例中看到,方式0时计算定时初值比较麻烦,根据公式计算出数值后,还要变换一下,容易出错,不如直接用方式1,且方式0计数范围比方式1小,方式0完全可以用方式1代替,方式0与方式1相比,无任何优点。3.定时器/计数器应用步骤⑴合理选择定时器/计数器工作方式⑵计算定时/计数器定时初值(按上述公式计算)⑶编制应用程序①定时/计数器的初始化包括定义TMOD、写入定时初值、设置中断系统、启动定时/计数器运行等。②正确编制定时/计数器中断服务程序注意是否需要重装定时初值,若需要连续反复使用原定时时间,且未工作在方式2,则应在中断服务程序中重装定时初值。【例】试用T1方式2编制程序,在P1.0引脚输出周期为400S的脉冲方波,已知fosc=12MHZ。解:①计算定时初值T1初值=28-200s/1s=256–200=56=38HTH1=38H;TL1=38H②设置TMOD:00100000B=20HT0控制位,与T1无关T1方式2T1定时器T1启动与无关③编制程序如下:ORG0000H;复位地址