资源描述
第第6 6章章 MCS-51MCS-51的定时的定时/计数器计数器【学习目标学习目标】l 理解单片机定时理解单片机定时/计数器计数器T0T0和和T1T1的的功能和结构功能和结构;l 掌握定时掌握定时/计数器计数器工作方式寄存器工作方式寄存器TMODTMOD的用途和设置的用途和设置方法;方法;l 掌握定时掌握定时/计数器计数器控制寄存器控制寄存器TCONTCON的用途和设置方法;的用途和设置方法;l 理解定时理解定时/计数器的计数器的4 4种工作方式种工作方式;l 掌握定时掌握定时/计数器计数器T0T0和和T1T1的的应用方法应用方法。定时定时/计数器是单片机系统一个重要的部件,计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,可用来其工作方式灵活、编程简单、使用方便,可用来实现实现定时控制定时控制、延时延时、频率测量频率测量、脉宽测量脉宽测量、信信号发生号发生、信号检测信号检测等。此外,定时等。此外,定时/计数器还可作计数器还可作为串行通信中波特率发生器。为串行通信中波特率发生器。MCS-51MCS-51有有两个可编程的定时器两个可编程的定时器/计数器计数器T1T1、T0T0。2 2种种工作模式工作模式:(1 1)计数器计数器工作模式工作模式(2 2)定时器定时器工作模式工作模式4 4种种工作方式工作方式(方式方式0-0-方式方式3)3)。6.1 6.1 定时定时/计数器概述计数器概述在单片机应用系统中,实现定时的方法一般有以下三种:在单片机应用系统中,实现定时的方法一般有以下三种:(1 1)软件定时)软件定时(2 2)硬件定时)硬件定时(3 3)可编程定时)可编程定时/计数器计数器 采用了软、硬件结合的方法,即使用专门的定时采用了软、硬件结合的方法,即使用专门的定时/计数器计数器进行定时。定时进行定时。定时/计数器通过对系统时钟脉冲或外部脉冲信号计数器通过对系统时钟脉冲或外部脉冲信号进行计数来实现定时功能。进行计数来实现定时功能。在单片机应用中,定时和计数的需求比较多,为了使用在单片机应用中,定时和计数的需求比较多,为了使用方便并增加单片机的功能,就把定时电路集成到芯片中,称方便并增加单片机的功能,就把定时电路集成到芯片中,称之为之为定时定时/计数器计数器。目前,。目前,几乎所有的单片机都集成了可编程几乎所有的单片机都集成了可编程定时定时/计数器,为单片机提供定时和计数功能。计数器,为单片机提供定时和计数功能。6.1.1 6.1.1 定时定时/计数器的结构计数器的结构 MCS-51 MCS-51 单单片片机机内内部部有有两两个个1616位位的的可可编编程程定定时时/计计数数器器,称称为为定定时时器器0 0(T0T0)和和定定时时器器1 1(T1T1),都都具具有有定定时时和和计计数数的的功功能能,可可编程选择其作为定时器或作为计数器用。编程选择其作为定时器或作为计数器用。TMODTMOD:选择定时器选择定时器/计数器计数器T0T0、T1T1的工作模式和工作方式。的工作模式和工作方式。TCONTCON:控制控制T0T0、T1T1的启动和停止计数,同时包含了的启动和停止计数,同时包含了T0T0、T1T1的状态。的状态。定时器定时器:对片内机器时钟对片内机器时钟(周期方波周期方波)进行计数进行计数计数器计数器:对对TxTx引脚引脚输入的负脉冲进行计数输入的负脉冲进行计数单片机内部有单片机内部有两个定时两个定时/计数器计数器T0T0和和T1T1,其核心是计数器,其核心是计数器,基本功能是基本功能是加加1 1。对外部事件脉冲(对外部事件脉冲(下降沿下降沿)计数,是计数器;对片)计数,是计数器;对片内机周内机周脉冲计数脉冲计数,是定时器。,是定时器。计数器由计数器由二个二个8 8位计数器位计数器组成。组成。定时时间和计数值可以编程设定,其方法是在计数器内设定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后置一个初值,然后加加1 1计满后溢出计满后溢出。调整计数器初值,可调整计数器初值,可调整从调整从初值初值到到计满溢出计满溢出的数值,即调整了定时时间和计数的数值,即调整了定时时间和计数值。值。定时定时/计数器作为计数器时,外部事件脉冲必须从规定的计数器作为计数器时,外部事件脉冲必须从规定的引脚输入。且外部脉冲的最高频率不能超过时钟频率的引脚输入。且外部脉冲的最高频率不能超过时钟频率的1/241/24。见教材。见教材P138P1386.1.2 6.1.2 定时定时/计数器的工作原理计数器的工作原理6.2 6.2 定时定时/计数器的控制计数器的控制 MCS-51 MCS-51单片机的定时单片机的定时/计数器是一种可编程的部件,在计数器是一种可编程的部件,在启动定时启动定时/计数器工作之前,计数器工作之前,CPUCPU必须将一些命令(称为控必须将一些命令(称为控制字)写入定时制字)写入定时/计数器中,这个过程称为定时计数器中,这个过程称为定时/计数器的计数器的初始化初始化。定时。定时/计数器的初始化通过两个特殊功能寄存器计数器的初始化通过两个特殊功能寄存器TMODTMOD和和TCONTCON的状态设置来实现。的状态设置来实现。TMODTMOD用于设置其工作方式、选择定时或计数功能;用于设置其工作方式、选择定时或计数功能;TCONTCON用于控制其启动、中断申请以及作为运行状态的用于控制其启动、中断申请以及作为运行状态的标志等。标志等。高高4 4位控制位控制T1T1低低4 4位控制位控制T0T0门控门控位位计数计数/定时定时方式选择方式选择工作方式工作方式选择选择门控门控位位计数计数/定时定时方式选择方式选择工作方式工作方式选择选择G GC/TC/TM1M1M0M0GATEGATEC/TC/TM1M1M0M0 1 1定时定时/计数器工作方式寄存器计数器工作方式寄存器TMODTMOD TMOD TMOD为为T0T0、T1T1的工作方式寄存器,主要用于控制定时的工作方式寄存器,主要用于控制定时/计数器计数器T0T0和和T1T1的工作模式和的工作模式和4 4种工作方式。种工作方式。低低4 4位位用于控用于控制制T0T0,高高4 4位位用于控制用于控制T1T1。1 1)M1M0 M1M0 工作方式选择位工作方式选择位M1M0M1M0工作方式工作方式功能功能0000方式方式0 01313位计数器位计数器0101方式方式1 11616位计数器位计数器1010方式方式2 2两个两个8 8位计数器,初值自动装入位计数器,初值自动装入1111方式方式3 3两个两个8 8位计数器,仅适用位计数器,仅适用T0T02 2)C/T C/T 计数计数/定时方式选择位定时方式选择位 C/T=1,C/T=1,计数计数工作方式工作方式,对外部事件脉冲计数对外部事件脉冲计数,用作计数器。用作计数器。C/T=0,C/T=0,定时定时工作方式工作方式,对片内机周脉冲计数对片内机周脉冲计数,用作定时器。用作定时器。3 3)GATE GATE 门控位门控位 GATE=0GATE=0,运行只受运行只受TCONTCON中运行控制位中运行控制位TR0/TR1TR0/TR1的控制。的控制。TR0TR0或或TR1TR1置置1 1即可启动定时器。即可启动定时器。GATE=1GATE=1,运行同时受运行同时受TR0/TR1TR0/TR1和外中断输入信号的双重控制。和外中断输入信号的双重控制。只有当只有当INT0/INT1=1INT0/INT1=1且且TR0/TR1=1,T0/T1TR0/TR1=1,T0/T1才能运行。才能运行。TMODTMOD字节地址字节地址8989H,H,不能位操作不能位操作,设置设置TMODTMOD须用字节操作指令。须用字节操作指令。2 2定时定时/计数器控制寄存器计数器控制寄存器TCONTCON TCONTCON的的作作用用是是控控制制定定时时器器的的启启动动、停停止止,标标志志定定时时器器的的溢溢出出和中断情况。和中断情况。TCONTCON低低4 4位与外中断位与外中断 、有关,已在中断中叙述。有关,已在中断中叙述。高高4 4位与定时位与定时/计数器计数器T0T0、T1T1有关。有关。TF1:TF1:定时定时/计数器计数器T1T1溢出标志。溢出标志。TF0:TF0:定时定时/计数器计数器T0T0溢出标志。溢出标志。TR1:TR1:定时定时/计数器计数器T1T1运行控制位。运行控制位。TR1=1,T1TR1=1,T1运行运行;TR1=0,T1TR1=0,T1停。停。TR0:TR0:定时定时/计数器计数器T0T0运行控制位。运行控制位。TR0=1,T0TR0=1,T0运行运行;TR0=0,T0TR0=0,T0停。停。TCONTCON的字节地址为的字节地址为8888H H,每一位有位地址,均可位操作。每一位有位地址,均可位操作。TCONTCONT1T1中断中断标志标志T1T1运行运行标志标志T0T0中断中断标志标志T0T0运行运行标志标志INT1INT1中断中断标志标志INT1INT1触发触发方式方式INT0INT0中断中断标志标志INT0INT0触发触发方式方式位名称位名称TF1TF1TR1TR1TF0TF0TR0TR0IE1IE1IT1IT1IE0IE0IT0IT0位地址位地址8 8FHFH8 8EHEH8 8DHDH8 8CHCH8 8BHBH8 8AHAH8989H H8888H H6.6.3 3 定时器定时器/计数器的工作方式计数器的工作方式 如前述,如前述,MCS-51MCS-51的定时的定时/计数器有计数器有4 4种工作方式,由种工作方式,由TMODTMOD寄存器中寄存器中M0M0、M1M1位的状态确定,不同的工作方式有不同的工位的状态确定,不同的工作方式有不同的工作特点,下面以作特点,下面以T0T0为例,分述各种工作方式的特点和用法。为例,分述各种工作方式的特点和用法。1 1方式方式0 0 当当M1M0=00M1M0=00时,定时时,定时/计数器工作于方式计数器工作于方式0 0,构成一个,构成一个1313位位定时定时/计数器。计数器。当当C/T=0=0时,工作于定时方式,时,工作于定时方式,其定时时间为其定时时间为t=t=(2 21313-T0-T0初值)初值)机器周期机器周期=(8192-T08192-T0初值)初值)时钟周期时钟周期1212当当C/T=1=1时,工作于计数方式。时,工作于计数方式。工作方式工作方式0 0 1313位位计数器,由计数器,由TL0TL0低低5 5位和位和TH0 8TH0 8位组成,位组成,TL0TL0低低5 5位计数满位计数满时不向时不向TL0TL0第第6 6位进位,而是向位进位,而是向TH0TH0进位,进位,1313位计满溢出,位计满溢出,TF0TF0置置“1 1”。最大计数值最大计数值2 21313=8192=8192。工作方式工作方式1 1 1616位位计数器,计数器,最大计数值为最大计数值为2 21616=65536=65536。当。当fosc=12MHZ,fosc=12MHZ,最最大定时大定时65536 65536 S S,而用方式而用方式0 0最大定时时间为最大定时时间为8192 8192 S.S.工作方式工作方式2 2 8 8位位计数器,计数器,仅用仅用TL0TL0计数计数,最大计数值为最大计数值为2 28 8=256=256,计满溢,计满溢出后,一方面进位出后,一方面进位TF0TF0,使溢出标志使溢出标志TF0=1TF0=1;另一方面,使原另一方面,使原来装在来装在TH0TH0中的中的初值初值装入装入TL0TL0。优点:定时初值可自动恢复优点:定时初值可自动恢复,TH0TH0中存放初值中存放初值;缺点:计数范缺点:计数范围小。围小。适用于需要重复定时适用于需要重复定时,而定时范围不大的应用场合。,而定时范围不大的应用场合。工作方式工作方式3 3 方式方式3 3仅适用于仅适用于T0T0,T1T1无方式无方式3 3。T0T0方式方式3 3 在方式在方式3 3情况下情况下,T0T0被拆成二个独立的被拆成二个独立的8 8位计数器位计数器TH0TH0、TL0TL0。TL0TL0可以为定时可以为定时/计数器;计数器;TH0TH0只能作为只能作为8 8位定时器。位定时器。TL0TL0使用使用T0T0原有的控制寄存器资源原有的控制寄存器资源:TF0,TR0,GATE,C/T,INT0,TF0,TR0,GATE,C/T,INT0,组成一个组成一个8 8位的定时位的定时/计数器;计数器;TH0TH0借用借用T1T1的中断溢出标志的中断溢出标志TF1,TF1,运行控制开关运行控制开关TR1,TR1,只能只能对片内机周脉冲计数对片内机周脉冲计数,组成另一个组成另一个8 8位定时器位定时器(不能用作计数器不能用作计数器)。T0T0方式方式3 3情况下的情况下的T1T1 T1 T1由于其由于其TF1TF1、TR1TR1被被T0T0的的TH0TH0占用,计数器溢出时,只能占用,计数器溢出时,只能将输出信号送至串行口,即将输出信号送至串行口,即用作串行口波特率发生器用作串行口波特率发生器。6.4 6.4 定时器定时器/计数器的的初始化计数器的的初始化 1 1初始化步骤初始化步骤 MCS-51 MCS-51内部定时内部定时/计数器是可编程序的,其工作方式和工计数器是可编程序的,其工作方式和工作过程均可由作过程均可由MCS-51MCS-51通过程序对它进行设定和控制。因此,通过程序对它进行设定和控制。因此,MCS-51MCS-51在定时在定时/计数器计数器工作前必须对它进行初始化工作前必须对它进行初始化。初始化步骤如下:初始化步骤如下:1 1)通过通过TMODTMOD,设定定时,设定定时/计数器相应的工作方式。计数器相应的工作方式。2 2)计算定时计算定时/计数器定时计数器定时初值初值3 3)根据需要给中断允许寄存器根据需要给中断允许寄存器IEIE选送中断控制字,并给中断选送中断控制字,并给中断优先级寄存器优先级寄存器IPIP选送中断优先级控制字,以开放相应中断并选送中断优先级控制字,以开放相应中断并设定中断优先级。设定中断优先级。4 4)给控制寄存器给控制寄存器TCONTCON选送命令字,以便启动或禁止定时选送命令字,以便启动或禁止定时/计计数器的运行。数器的运行。GATE=0 GATE=0时,直接由软件置位启动;时,直接由软件置位启动;GATE=1 GATE=1时,除软件置位外,还必须在外部中断引脚处加上时,除软件置位外,还必须在外部中断引脚处加上相应的电平值才能启动。相应的电平值才能启动。2 2计数器计数器初值的计算初值的计算 定时定时/计数器中的计数器是在计数计数器中的计数器是在计数初值基础上以加初值基础上以加1 1计数计数的,并能在计数器从的,并能在计数器从全全“1 1”变为变为“0 0”时自动产生定时时自动产生定时溢出溢出中断请求中断请求。因此,定时因此,定时/计数器的初值因工作方式的不同而计数器的初值因工作方式的不同而不同。设最大计数值为不同。设最大计数值为M M,则各种工作方式下的,则各种工作方式下的M M值如下:值如下:方式方式0 0:M=2M=21313=8192=8192;方式方式1 1:M=216=65536M=216=65536;方式方式2 2:M=28=256M=28=256;方式方式3 3:定时器:定时器0 0分成分成2 2个个8 8位计数器,所以位计数器,所以2 2个定时器的个定时器的 M M值均为值均为256256。把计数器计数溢出所需要的计数值设定为把计数器计数溢出所需要的计数值设定为L L,当最大计数值,当最大计数值M M值已知时,初值值已知时,初值X X可计算如下:可计算如下:X=M X=M L L3 3定时器定时器初值的计算初值的计算 当当定定时时/计计数数器器为为定定时时工工作作方方式式时时,计计数数器器对对单单片片机机晶晶振振频率经频率经1212分频后的脉冲进行计数,即对机器周期进行计数。分频后的脉冲进行计数,即对机器周期进行计数。因此,定时器定时初值因此,定时器定时初值X X的计算公式为的计算公式为l若设单片机晶振频率若设单片机晶振频率fosc为为12MHz,则每个机器周期的时间,则每个机器周期的时间是是1 s,最大定时时间为,最大定时时间为方式方式0:Tmax=2131 s=8192 s8ms方式方式1:Tmax=2161 s=65536 s65ms方式方式2和方式和方式3:Tmax=281 s=256 sl若设单片机晶振频率若设单片机晶振频率fosc为为6MHz,则每个机器周期的时间,则每个机器周期的时间是是2 s,最大定时时间为,最大定时时间为方式方式0:Tmax=2132 s=16384 s16ms方式方式1:Tmax=2162 s=131072 s131ms方式方式2和方式和方式3:Tmax=282 s=512 st=(213-T0初值)初值)机器周期机器周期=(8192-T0初值)初值)时钟周期时钟周期12解:解:工作方式工作方式0 0:2 21313500500 S/2S/2 S=8192-250=7942=1F06HS=8192-250=7942=1F06H 1F06H 1F06H化成二进制:化成二进制:1 1F06H=0001 1111 0000 0110BF06H=0001 1111 0000 0110B=000 =000 1111100011111000 0011000110 B B其中:其中:低低5 5位位0011000110前添加前添加3 3位位000000送入送入TL0TL0 TL0=000 TL0=000 0011000110B=06HB=06H;高高8 8位位1111100011111000B B送入送入TH0TH0 TH0=TH0=1111100011111000B=F8HB=F8H。【例例6.1】已知晶振已知晶振6 6MHzMHz,要求定时要求定时0.50.5msms,试分别求出试分别求出T0T0工作于方式工作于方式0 0、方式、方式1 1、方式、方式2 2、方式、方式3 3时的定时初值。时的定时初值。工作方式工作方式1 1:T0T0初值初值=2=21616-500-500 s s/2/2 s s=65536=65536250=65286=FF06H250=65286=FF06H TH0=FFH TH0=FFH;TL0=06HTL0=06H。工作方式工作方式2 2:T0T0初值初值=2=28 8-500-500 s s/2/2 s s=256-250=6=256-250=6 TH0=06H TH0=06H;TL0=06HTL0=06H。工作方式工作方式3 3:T0T0方式方式3 3时,被拆成两个时,被拆成两个8 8位定时器,定时初值可分别计算,位定时器,定时初值可分别计算,计算方法同方式计算方法同方式2 2。两个定时初值一个装入。两个定时初值一个装入TL0TL0,另一个装入另一个装入TH0TH0。因此:因此:TH0=06HTH0=06H;TL0=06HTL0=06H。从上例中看到,从上例中看到,方式方式0 0时计算定时时计算定时初值比较麻烦初值比较麻烦,根据,根据公式计算出数值后,还要变换一下,容易出错,不如直接用公式计算出数值后,还要变换一下,容易出错,不如直接用方式方式1 1,且方式,且方式0 0计数范围比方式计数范围比方式1 1小,小,方式方式0 0完全可以用方式完全可以用方式1 1代替,方式代替,方式0 0与方式与方式1 1相比,无任何优点相比,无任何优点。6.5 6.5 定时定时/计数器的应用计数器的应用6.5.1 6.5.1 定时器应用举例定时器应用举例【例例6.26.2】要求在要求在P1.0P1.0引脚输出周期为引脚输出周期为1s1s的脉冲方波,已的脉冲方波,已知知foscfosc12MHz12MHz。试分别用。试分别用T1T1工作于方式工作于方式0 0、方式、方式1 1、方式、方式2 2编制程序。编制程序。1 1用定时器用定时器1 1方式方式0 0实现输出周期为实现输出周期为1s1s的脉冲方波的脉冲方波解:解:1s1s也就是也就是1000ms1000ms,1000ms1000ms的脉冲方波就是高低电平各的脉冲方波就是高低电平各宽宽500ms500ms,晶振为,晶振为12MHz12MHz时机器周期为时机器周期为1 1 s s,因方式,因方式0 0采用采用1313位计数器,其最大定时时间为:位计数器,其最大定时时间为:8192181921 s=8.192mss=8.192ms,因此,定时时间不可能选择超过因此,定时时间不可能选择超过10ms10ms,可选择定时时间为可选择定时时间为5ms5ms,再循环,再循环100100次。次。本例可采用中断方式编程。本例可采用中断方式编程。(1)计算初值)计算初值X=213-5000 s/1 s=8192-5000=3192=0C78H=0000110001111000B0C78H=0000110001111000B=0000110001111000B其中低其中低5位位11000前添加前添加3位位000送入送入TL1,TL1=00011000B=18H;高;高8位送入位送入TH1,TH1=01100011B=63H。(2)寄存器初始化)寄存器初始化TMOD:T0作为定时器工作方式作为定时器工作方式0,故,故TMOD应设置为应设置为00H。TCON:复位值为复位值为00H,T1关闭,要启动时可采用位操作。关闭,要启动时可采用位操作。IE:采用中断方式编程,要开中断。采用中断方式编程,要开中断。ORG 0000HLJMP MAINORG 001BHLJMP INTT1ORG 0100HMAIN:MOV SP,#60H;主程序入口,设堆栈指针主程序入口,设堆栈指针MOV R3,#100;置置5ms计数循环初值计数循环初值MOVTMOD,#00H;设定时器设定时器1为方式为方式0MOVTH1,#63H;置定时器初值置定时器初值MOV TL1,#18HCLR P1.0SETB EA;开中断开中断SETB ET1SETB TR1;启动启动T1SJMP$INTT1:MOVTH1,#63H;重新置定时器初值重新置定时器初值MOVTL1,#18HDJNZ R3,LOOP1;未到未到500ms继续循环继续循环CPLP1.0;500ms到,对到,对P1.0输出求反输出求反MOV R3,#100;恢复恢复5ms计数循环初值计数循环初值LOOP1:RETI;返回主程序返回主程序ENDORG0000HLJMP MAINORG 001BHLJMP INTT1ORG 0100HMAIN:MOV SP,#60H;主程序入口,设堆栈指针主程序入口,设堆栈指针MOV R3,#100;置置5ms计数循环初值计数循环初值MOVTMOD,#00H;设定时器设定时器1为方式为方式0MOVTH1,#63H;置定时器初值置定时器初值MOV TL1,#18HCLR P1.0SETB EA;开中断开中断SETB ET1SETB TR1;启动启动T1SJMP$INTT1:MOVTH1,#63H;重新置定时器初值重新置定时器初值MOVTL1,#18HDJNZ R3,LOOP1;未到未到500ms继续循环继续循环CPLP1.0;500ms到,对到,对P1.0输出求反输出求反MOV R3,#100;恢复恢复5ms计数循环初值计数循环初值LOOP1:RETI;返回主程序返回主程序END#include unsigned char i;sbit P1_0=P10;main()TMOD=0X00;/设定时器设定时器1为方式为方式0 TL1=0X18;/置定时器置定时器1的初值的初值TH1=0X63;i=100;/置置5ms计数循环初值计数循环初值P1_0=0;EA=1;/开中断开中断ET1=1;TR1=1;/启动定时器启动定时器1while(1);/等待中断等待中断void intt1()interrupt 3 TL1=0X18;/重装定时初值重装定时初值TH1=0X63;i-;if(i=0)/循环次数到,对循环次数到,对P1.0取反取反 P1_0=!P1_0;i=100;/重置计数循环初值重置计数循环初值2 2用定时器用定时器1 1方式方式1 1实现输出周期为实现输出周期为1s1s的脉冲方波的脉冲方波 方式方式1 1采用采用1616位计数器,其最大定时时间为位计数器,其最大定时时间为655361655361 s=65.536mss=65.536ms,因此,定时时间不可能选择超,因此,定时时间不可能选择超过过65ms65ms,为与方式,为与方式0 0比较,比较,选择定时时间为选择定时时间为5ms5ms,再循环,再循环100100次。次。定时时间选定后,再确定计数值为定时时间选定后,再确定计数值为50005000,则定时器,则定时器0 0的的初值为初值为 X=2 X=21616-5000-5000 s/1s/1 s=65536-5000=60536=s=65536-5000=60536=EC78H=EC78H=11101110 11001100 01110111 10001000B B 方式方式1 1采用采用1616位计数器,不必像方式位计数器,不必像方式0 0要对要对TH0TH0、TL0TL0进进行组合。因此,行组合。因此,X X的实际填写值不必调整。即的实际填写值不必调整。即TH1=ECHTH1=ECH,TL1=78HTL1=78H,因采用方式,因采用方式1 1定时,故定时,故TMOD=00010000B=10HTMOD=00010000B=10H。本例可采用查询方式编程。本例可采用查询方式编程。汇编语言程序如下汇编语言程序如下(采用查询方式编程采用查询方式编程):ORG0000HMOVR3,#100;置置5ms计数循环初值计数循环初值CLRP1.0MOVTMOD,#10H;设定时器设定时器1为方式为方式1MOVTH1,#0ECH;置定时器初值置定时器初值MOVTL1,#78HSETB TR1;启动定时器启动定时器1LOOP1:JNB TF1,LOOP1;查询查询TF1标志是否为标志是否为1,如为,如为1则则T1溢出溢出CLRTF1;清除溢出标志清除溢出标志DJNZ R3,LOOP2;计数循环值到,对计数循环值到,对P1.0口取反口取反CPLP1.0MOVR3,#100LOOP2:MOVTH1,#0ECH;置定时器初值置定时器初值MOVTL1,#78HSJMP LOOP1END汇编语言程序如下汇编语言程序如下(采用查询方式编程采用查询方式编程):ORG0000HMOVR3,#100;置置5ms计数循环初值计数循环初值CLRP1.0MOVTMOD,#10H;设定时器设定时器1为方式为方式1MOVTH1,#0ECH;置定时器初值置定时器初值MOVTL1,#78HSETB TR1;启动定时器启动定时器1LOOP1:JNB TF1,LOOP1;查询查询TF1标志是否为标志是否为1,如为,如为1则则T0溢出溢出CLRTF1;清除溢出标志清除溢出标志DJNZ R3,LOOP1;计数循环值到,对计数循环值到,对P1.0口取反口取反CPLP1.0MOVR3,#100LOOP2:MOVTH1,#0ECH;置定时器初值置定时器初值MOVTL1,#78HSJMP LOOP1END#includeunsignedchari;sbitP1_0=P10;main()TMOD=0X10;/置工作方式置工作方式TL1=0X78;/赋定时初值赋定时初值TH1=0XEC;TR1=1;/启动定时器启动定时器i=100;/置计数循环初值置计数循环初值P1_0=0;while(1)if(TF1=1)/查询溢出标志查询溢出标志TF1=0;/清除溢出标志清除溢出标志i-;if(i=0)/循环次数到,对循环次数到,对P1.0取反取反P1_0=!P1_0;i=100;TL1=0X78;/重装定时初值重装定时初值TH1=0XEC;【例例6.3】图所示电路中,设系统时钟频率为图所示电路中,设系统时钟频率为12MHz,发光,发光二极管由二极管由MCS-51的的P1.0引脚控制。编写程序,当按下开关启引脚控制。编写程序,当按下开关启动定时器,在动定时器,在P1.0引脚上输出周期为引脚上输出周期为1s,占空比为,占空比为20的脉的脉冲信号,使发光二极管循环交替亮灭。冲信号,使发光二极管循环交替亮灭。分析:分析:根据输出要求,根据输出要求,脉冲信号脉冲信号在一个周期内在一个周期内高电平占高电平占0.2s,低电平占,低电平占0.8s,超出了定时器的最超出了定时器的最大定时间隔,因此需利大定时间隔,因此需利用用定时器定时器0产生一个基准产生一个基准定时配合软件计数来实定时配合软件计数来实现。现。取取50ms作为基准定作为基准定时,采用方式时,采用方式1,这样一这样一个周期需要个周期需要20个基准定个基准定时,其中高电平占时,其中高电平占4个基个基准定时。准定时。ORG0000HLJMPMAINORG000BHLJMP INTT0ORG0013HLJMPINT_X1ORG0100HMAIN:MOVSP,#60H;主程序入口主程序入口,设堆栈指针设堆栈指针MOVR6,#14H;置一个周期计数循环次数置一个周期计数循环次数MOVR5,#04H;置一个周期内高电平计数循环次数置一个周期内高电平计数循环次数MOVTMOD,#01H;置定时器置定时器0为方式为方式1MOVTH0,#3CH;置定时器初值置定时器初值MOVTL0,#0B0HSETB P1.0;P1.0初始状态为高电平初始状态为高电平SETBIT1;设置为边沿触发方式设置为边沿触发方式MOVIE,#10000110;开中断开中断SJMP$INT_X1:SETBTR0;启动启动T0RETIINTT0:DJNZR5,LOOP1;判断高电平计数次数,未到跳转到判断高电平计数次数,未到跳转到LOOP1CLRP1.0;高电平次数若到高电平次数若到P1.0清零清零LOOP1:DJNZR6,LOOP2;判断周期计数次数,未到则跳出中断判断周期计数次数,未到则跳出中断SETBP1.0;周期循环次数若到周期循环次数若到P1.0置置1MOVR6,#14H;重置外循环次数重置外循环次数MOVR5,#04HLOOP2:MOVTH0,#3CH;置定时器初值置定时器初值MOVTL0,#0B0HRETIENDORG0000HLJMPMAINORG000BHLJMP INTT0ORG0013HLJMPINT_X1ORG0100HMAIN:MOVSP,#60H;主程序入口主程序入口,设堆栈指针设堆栈指针MOVR6,#14H;置一个周期计数循环次数置一个周期计数循环次数MOVR5,#04H;置一个周期内高电平计数循环次数置一个周期内高电平计数循环次数MOVTMOD,#01H;置定时器置定时器0为方式为方式1MOVTH0,#3CH;置定时器初值置定时器初值MOVTL0,#0B0HSETB P1.0;P1.0初始状态为高电平初始状态为高电平SETBIT1MOVIE,#10000110;开中断开中断SJMP$INT_X1:SETBTR0;启动启动T0RETIINTT0:DJNZR5,LOOP1;判断高电平计数次数,未到跳转到判断高电平计数次数,未到跳转到LOOP1CLRP1.0;高电平次数若到高电平次数若到P1.0清零清零LOOP1:DJNZR6,LOOP2;判断周期计数次数,未到则跳出中断判断周期计数次数,未到则跳出中断SETBP1.0;周期循环次数若到周期循环次数若到P1.0置置1MOVR6,#14H;重置外循环次数重置外循环次数MOVR5,#04HLOOP2:MOVTH0,#3CH;置定时器初值置定时器初值MOVTL0,#0B0HRETIEND#includesbitP1_0=P10;unsignedchari;/定义计数变量定义计数变量voidmain()i=0;/初始化初始化TMOD=0 x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;EX1=1;IT1=1;P1_0=1;while(1);voidint_x1(void)interrupt2TR0=1;voidtime0(void)interrupt1/中断服务程序中断服务程序TH0=(65536-50000)/256;/重载初始值重载初始值TL0=(65536-50000)%256;/重载初始值重载初始值i=i+1;if(i=4)P1_0=0;/高电平时间到变低高电平时间到变低elseif(i=20)/周期时间到变高周期时间到变高 P1_0=1;i=0;/计数变量清零计数变量清零6.5.2计数器计数器应用举例应用举例【例例6.4】设计简易频率计。如图所示,被测信号从设计简易频率计。如图所示,被测信号从P3.4脚脚输入。设待测脉冲频率输入。设待测脉冲频率65536/s,测量结果依次放在片内,测量结果依次放在片内RAM50H、51H单元。已知晶振频率为单元。已知晶振频率为6MHz。试编程实现。试编程实现。分析:分析:所谓频率,即指所谓频率,即指单位时间内的脉冲个数单位时间内的脉冲个数。依题意,外部。依题意,外部被测信号从被测信号从T0(P3.4)脚输入,因此脚输入,因此T0必须工作在计数方式。在必须工作在计数方式。在计数方式,可以计数的被测信号的最高频率为晶振的计数方式,可以计数的被测信号的最高频率为晶振的1/24,即,即250kHz。要测试。要测试T0引脚上脉冲的频率,可利用引脚上脉冲的频率,可利用T1定时定时1个单位个单位时间时间(1s),T0对外部脉冲计数,若设对外部脉冲计数,若设T1定时定时100ms,当,当T1定时定时10个个100ms时,则定时时,则定时1s到,在此期间所计的脉冲数即为待测到,在此期间所计的脉冲数即为待测频率值。频率值。下面计算下面计算T1定时定时100ms的初值的初值X:(216-X)*2 s=100000 s得出:得出:X=65536-50000=15536=3CB0HT0用来对外部信号计数用来对外部信号计数,因此其计数初值为,因此其计数初值为0。则。则TMOD应应为:为:00010101B即即15H。ORG 0000HLJMP MAINORG 0100HMAIN:MOV TMOD,#15H;T1为方式为方式1定时,定时,T0为方式为方式1外部计数外部计数 MOV TH0,#00H;T0计数初值置计数初值置0 MOV TL0,#00H MOV TH1,#3CH;T1定时定时100ms MOV TL1,#0B0H MOV R3,#10;计数器初始化;计数器初始化 SETB TR1;启动;启动T1定时定时 SETB TR0;启动;启动T0计数计数BACK1:JNB TF1,BACK1;等待定时;等待定时100ms到到 CLR TF1;计数器溢出标志清零;计数器溢出标志清零 MOV TH1,#3CH;为下次定时;为下次定时100ms准备准备 MOV TL1,#0B0H DJNZ R3,BACK1;计数次数不到;计数次数不到10次次(即即1s时间未到时间未到),继续等待继续等待 CLR TR0;1s时间到,时间到,T0停止对外部信号计数停止对外部信号计数 MOV R0,#50H;存结果;存结果 MOV R0,TL0 INCR0 MOV R0,TH0 SJMP$ENDORG 0000HLJMP MAINORG 0100HMAIN:MOV TMOD,#15H;T1为方式为方式1定时,定时,T0为方式为方式1外部计数外部计数 MOV TH0,#00H;T0计数初值置计数初值置0 MOV TL0,#00H MOV TH1,#3CH;T1定时定时100ms MOV TL1,#0B0H MOV R3,#10;计数器初始化;计数器初始化 SETB TR1;启动;启动T1定时定时 SETB TR0;启动;启动T0计数计数BACK1:JNB TF1,BACK1;等待定
展开阅读全文