89 89C51C51定时定时/ /计数器计数器 定时定时/ /计数器控制寄存器计数器控制寄存器 定时定时/ /计数器工作方式计数器工作方式 定时定时/ /计数器的应用计数器的应用第第6 6章章 89C5189C51的定时器的定时器/ /计数器计数器 定时定时/ /计数器是单片机系统一个重要的部计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,件,其工作方式灵活、编程简单、使用方便,可用来实现可用来实现定时控制定时控制、、延时延时、、频率测量频率测量、、脉宽脉宽测量测量、、信号发生信号发生、、信号检测信号检测等此外,定时等此外,定时/ /计数器还可作为串行通信中波特率发生器计数器还可作为串行通信中波特率发生器89C5189C51有有两个可编程的定时器两个可编程的定时器/ /计数器计数器T1T1、、T0T02 2种种工作模式工作模式::((1 1))计数器计数器工作模式工作模式((2 2))定时器定时器工作模式工作模式4 4种种工作方式工作方式( (方式方式0-0-方式方式3)3)6.1 6.1 定时器定时器/ /计数器的结构计数器的结构TMODTMOD::选择定时器选择定时器/ /计数器计数器T0T0、、T1T1的工作模式和工作方式。
的工作模式和工作方式 TCONTCON::控制控制T0T0、、T1T1的启动和停止计数,同时包含了的启动和停止计数,同时包含了T0T0、、T1T1的状态定时器定时器: :对片内机器时钟对片内机器时钟( (周期方波周期方波) )进行计数进行计数计数器计数器: :对对TxTx引脚引脚输入的负脉冲进行计数输入的负脉冲进行计数8989C51C51单片机内部有单片机内部有两个定时两个定时/ /计数器计数器T0T0和和T1T1,,其核心其核心是计数器,基本功能是是计数器,基本功能是加加1 1对外部事件脉冲(对外部事件脉冲(下降沿下降沿)计数,是计数器;对片)计数,是计数器;对片内内机周脉冲计数机周脉冲计数,是定时器是定时器计数器由计数器由二个二个8 8位计数器位计数器组成定时时间和计数值可以编程设定,其方法是在计数器定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后内设置一个初值,然后加加1 1计满后溢出计满后溢出调整计数器调整计数器初值,可调整从初值,可调整从初值初值到到计满溢出计满溢出的数值,即调整了定的数值,即调整了定时时间和计数值时时间和计数值定时定时/ /计数器作为计数器时,外部事件脉冲必须从规计数器作为计数器时,外部事件脉冲必须从规定的引脚输入。
且外部脉冲的最高频率不能超过时钟定的引脚输入且外部脉冲的最高频率不能超过时钟频率的频率的1/241/246.1.1 6.1.1 工作方式控制寄存器工作方式控制寄存器TMODTMOD高高4 4位控制位控制T1T1低低4 4位控制位控制T0T0门控门控位位计数计数/ /定时定时方式选择方式选择工作方式工作方式选择选择门控门控位位计数计数/ /定时定时方式选择方式选择工作方式工作方式选择选择G GC / TC / TM1M1M0M0G GC / TC / TM1M1M0M0TMODTMOD用于设定定时用于设定定时/ /计数器的工作方式计数器的工作方式低低4 4位位用于控制用于控制T0T0,,高高4 4位位用于控制用于控制T1T1⑴ ⑴ M1M0 —— M1M0 —— 工作方式选择位工作方式选择位M1M0M1M0工作方式工作方式功能功能0000方式方式0 01313位计数器位计数器0101方式方式1 11616位计数器位计数器1010方式方式2 2两个两个8 8位计数器,初值自动装入位计数器,初值自动装入1111方式方式3 3两个两个8 8位计数器,仅适用位计数器,仅适用T0T0⑵ ⑵ C/T —— C/T —— 计数计数/ /定时方式选择位定时方式选择位 C/T=1,C/T=1,计数计数工作方式工作方式, ,对外部事件脉冲计数对外部事件脉冲计数, ,用作计数器。
用作计数器 C/T=0,C/T=0,定时定时工作方式工作方式, ,对片内机周脉冲计数对片内机周脉冲计数, ,用作定时器用作定时器⑶ ⑶ GATE —— GATE —— 门控位门控位 GATE=0GATE=0,,运行只受运行只受TCONTCON中运行控制位中运行控制位TR0/TR1TR0/TR1的控制 GATE=1GATE=1,,运行同时受运行同时受TR0/TR1TR0/TR1和外中断输入信号的双重控制和外中断输入信号的双重控制 只有当只有当INT0/INT1=1INT0/INT1=1且且TR0/TR1=1,T0/T1TR0/TR1=1,T0/T1才能运行才能运行 TMODTMOD字节地址字节地址8989H,H,不能位操作不能位操作, ,设置设置TMODTMOD须用字节操作指令须用字节操作指令 6.1.2 6.1.2 定时器定时器/ /计数器控制寄存器计数器控制寄存器TCONTCONTCONTCON低低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.2 6.2 定时器定时器/ /计数器的计数器的4 4种工作方式种工作方式⒈ ⒈ 工作方式工作方式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、、TL0TL0TL0TL0可以为定时可以为定时/ /计数器;计数器;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.3 6.3 计数器模式对输入信号的要求计数器模式对输入信号的要求 外部计数脉冲的最高频率为系统振荡器频率的外部计数脉冲的最高频率为系统振荡器频率的1/241/24,,例如例如选选用用6 6MHzMHz频率的晶体,则可输入频率的晶体,则可输入250250KHzKHz的外部脉冲选用的外部脉冲选用1212MHzMHz频率的晶体,则可输入频率的晶体,则可输入500500KHzKHz的外部脉冲的外部脉冲输入信号的高、低电平至少要保持一个机器周期输入信号的高、低电平至少要保持一个机器周期如如图图6-16-12 2所示,图中所示,图中TcyTcy为机器周期为机器周期图图6-126-126.4 6.4 定时器定时器/ /计数器的编程和应用计数器的编程和应用 4 4种工作方式中,种工作方式中,方式方式0 0与方式与方式1 1基本相同,由于方式基本相同,由于方式0 0是为是为兼容兼容MCS-48MCS-48而设,而设,初值计算复杂初值计算复杂,在实际应用中,,在实际应用中,一般不一般不用方式用方式0 0,而采用方式,而采用方式1 1其中其中: : N N与工作方式有关与工作方式有关: : 方式方式0 0时时, ,N=N=1313;; 方式方式1 1时时, ,N=N=1616;; 方式方式2 2、、3 3时时, ,N=N=8 8。
机周时间与主振频率有关机周时间与主振频率有关: :机周时间机周时间=12/=12/foscfosc fosc= fosc=12MHZ12MHZ时时,,1 1机周机周= =1 1 S S;; fosc= fosc=6MHZ6MHZ 时时,,1 1机周机周= =2 2 S S ⒈ ⒈ 计算定时计算定时/ /计数初值计数初值8 89C519C51定时定时/ /计数初值计算公式:计数初值计算公式:解:解:⑴⑴工作方式工作方式0 0:: 2 21313–500–500 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 6MHzMHz,,msms,,试分别试分别求出求出T0T0工作于方式工作于方式0 0、方式、方式1 1、方式、方式2 2、方式、方式3 3时的定时时的定时初值⑵ ⑵ 工作方式工作方式1 1:: T0T0初值初值 =2 =21616-500-500 s s/2/2 s s=65536–250=65286=FF06H=65536–250=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相比,无任何优点相比,无任何优点⒉ ⒉ 定时定时/ /计数器应用步骤计数器应用步骤⑴ ⑴ 合理选择定时合理选择定时/ /计数器计数器工作方式工作方式⑵ ⑵ 计算定时计算定时/ /计数器定时计数器定时初值初值( (按上述公式计算按上述公式计算) )⑶ ⑶ 编制应用程序编制应用程序 ① ①定时定时/ /计数器的初始化计数器的初始化 包括定义包括定义TMODTMOD、、写入定时初值、设置中断系统、启写入定时初值、设置中断系统、启动定时动定时/ /计数器运行等计数器运行等 ② ②正确编制定时正确编制定时/ /计数器中断服务程序计数器中断服务程序 注意注意是否需要重装是否需要重装定时初值,若需要连续反复使用定时初值,若需要连续反复使用原定时时间,且未工作在方式原定时时间,且未工作在方式2 2,则应在中断服务程序,则应在中断服务程序中重装定时初值。
中重装定时初值6.4.1 6.4.1 方式方式1 1应用应用 例例6-16-1 假设系统时钟频率采用假设系统时钟频率采用6 6MHzMHz,,要在上输出一个周期为要在上输出一个周期为2 2msms的方波,如的方波,如图图6-136-13所示方波的周期用方波的周期用T0T0来确定,让来确定,让T0T0每隔每隔1 1msms计数溢出计数溢出1 1次次( (每每1 1msms产生一次中断产生一次中断) ),,CPUCPU响应中断后,在中断服务程序中对取响应中断后,在中断服务程序中对取反 (1)(1)计算初值计算初值X X 设初值为设初值为X X,,则有则有: :(2(21616- -X)×2×10X)×2×10-6-6=1×10=1×10-3-3 2 21616-X=500 X=65036-X=500 X=65036 X X化为化为1616进制,即进制,即 所以,所以,T0T0的初值为的初值为:: TH0=0TH0=0FEHFEH TL0= TL0=0CH0CH (2) (2)初始化程序设计初始化程序设计 对寄存器对寄存器IPIP、、IEIE、、TCONTCON、、TMODTMOD的相应位进行正确设置,的相应位进行正确设置,将计数初值送入定时器中。
将计数初值送入定时器中 (3) (3)程序设计程序设计 中断服务程序除产生方波外,还要注意将计数初值重新装入中断服务程序除产生方波外,还要注意将计数初值重新装入定时器中,为下一次中断作准备参考程序:定时器中,为下一次中断作准备参考程序: ORG 0000HORG 0000HRESET: AJMP MAIN RESET: AJMP MAIN ;;转主程序转主程序 ORG 000BHORG 000BH ;;T0T0的中断入口的中断入口 AJMP IT0P AJMP IT0P;;转转T0T0中断处理程序中断处理程序IT0PIT0P ORG 0100HORG 0100HMAIN: MOV SP,#60H MAIN: MOV SP,#60H ;;设堆栈指针设堆栈指针 MOV TMOD,#01HMOV TMOD,#01H;;设置设置T0T0为方式为方式1 1 ACALL PT0M0ACALL PT0M0 ;;调用子程序调用子程序PT0M0PT0M0HERE: AJMP HEREHERE: AJMP HERE ;;自身跳转自身跳转PT0M0: MOV TL0,#0CHPT0M0: MOV TL0,#0CH;;T0T0中断服务程序,中断服务程序,T0T0重新置初值重新置初值 MOV TH0,#0FEH MOV TH0,#0FEH SETB TR0 SETB TR0 ;;启动启动T0T0 SETB ET0 SETB ET0 ;;允许允许T0T0中断中断 SETB EA SETB EA ;;CPUCPU开中断开中断 RETRETITOP: MOV TL0,#0CH ITOP: MOV TL0,#0CH ;;T0T0中断服务子程序,中断服务子程序,T0T0置初值置初值 MOV TH0,#0FEHMOV TH0,#0FEH的状态取反的状态取反 RETIRETI查询方式查询方式的参考程序的参考程序: : MOV TMOD,#01H MOV TMOD,#01H ;;设置设置T0T0为方式为方式1 1LOOP: LOOP: SETB TR0SETB TR0 ;;接通接通T0T0 MOV TH0,#0FEH MOV TH0,#0FEH ;;T0T0置初值置初值 MOV TL0,# 0CH MOV TL0,# 0CHLOOP1LOOP1::JNB JNB TF0TF0,LOOP1 ,LOOP1 ;;查询查询TF0TF0标志标志 CLR TR0 CLR TR0 ;;T0T0溢出,关闭溢出,关闭T0T0的状态求反的状态求反 SJMP LOOP SJMP LOOP TCONTCONT1T1中断中断标志标志T1T1运行运行标志标志T0T0中断中断标志标志T0T0运行运行标志标志INT1INT1中断中断标志标志INT1INT1触发触发方式方式INT0INT0中断中断标志标志INT0INT0触发触发方式方式位名称位名称TF1TF1TR1TR1TF0TF0TR0TR0IE1IE1IT1IT1IE0IE0IT0IT0位地址位地址8 8FHFH8 8EHEH8 8DHDH8 8CHCH8 8BHBH8 8AHAH8989H H8888H H例例6-26-2 假设假设系统时钟为系统时钟为6 6MHzMHz,,编写定时器编写定时器T0T0产生产生1 1秒定时秒定时的程序。
的程序1 1))T0T0工作方式的确定工作方式的确定定时时间较长,采用哪一种工作方式?定时时间较长,采用哪一种工作方式? 由各种工作方式的特性,可计算出:由各种工作方式的特性,可计算出: 方式方式0 0最长可定时最长可定时msms; ; 方式方式1 1最长可定时最长可定时msms; ; 方式方式2 2最长可定时最长可定时512512 s s选方式选方式1 1,每隔,每隔100100msms中断一次,中断中断一次,中断1010次为次为1 1s s ((2 2)计算计数初值)计算计数初值 因为:因为:(2(21616- -X)×2×10X)×2×10-6 -6 = 10= 10-1-1 所以:所以:X=15536=3CB0HX=15536=3CB0H 因此:因此:TH0=3CHTH0=3CH,,TL0=B0H TL0=B0H ((3 3))1010次计数的实现次计数的实现 采用循环程序法采用循环程序法4 4)程序设计)程序设计 参考程序参考程序 : : ORG 0000HORG 0000HRESETRESET:: LJMP MAIN LJMP MAIN ;;上电,转主程序入口上电,转主程序入口MAINMAIN ORG 000BHORG 000BH ;;T0T0的中断入口的中断入口 LJMP IT0PLJMP IT0P ;;转转T0T0中断处理程序中断处理程序IT0PIT0P ORG 1000HORG 1000H MAIN MAIN:: MOV SP,#60H MOV SP,#60H ;;设堆栈指针设堆栈指针 MOV B,#0AH MOV B,#0AH ;;设循环次数设循环次数1010次次 MOV TMOD,#01H MOV TMOD,#01H ;;设设T0T0工作在方式工作在方式1 1 MOV TL0,#0B0H MOV TL0,#0B0H ;;给给T0T0设初值设初值 MOV TH0,#3CHMOV TH0,#3CH SETB TR0 SETB TR0 ;;启动启动T0T0 SETB ET0 SETB ET0 ;;允许允许T0T0中断中断 SETB EA SETB EA ;;CPUCPU开放中断开放中断 HERE HERE:: SJMP HERE SJMP HERE ;;等待中断等待中断 ITOPITOP:: MOV TL0,#0B0H MOV TL0,#0B0H ;;T0T0中断子程序,重装初值中断子程序,重装初值 MOV TH0,#3CH MOV TH0,#3CH ;; DJNZ B DJNZ B,,LOOPLOOP CLR TR0 CLR TR0 ;;1s1s定时时间到,停止定时时间到,停止T0T0工作工作 LOOP LOOP:: RETI RETI 6.4.2 6.4.2 方式方式2 2的应用的应用 方方式式2 2是是一一个个可可以以自自动动重重新新装装载载初初值值的的8 8位位计计数数器器/ /定定时时器器。
这这种种工工作作方方式式可可省省去去程程序序中中重重装装初初值值的的指指令令,,并并可可产产生生相相当精确的定时时间当精确的定时时间 例例6-36-3 当当T0T0((P3.4P3.4))引引脚脚上上发发生生负负跳跳变变时时,,从从引引脚脚上上输输出出一一个周期为个周期为1 1msms的方波的方波, ,如如图图6-136-13所示系统时钟为所示系统时钟为6 6MHzMHz))((1 1)工作方式选择)工作方式选择 T0 T0为方式为方式1 1计数计数,,初值初值 0 0FFFFHFFFFH,,即外部计数输入端即外部计数输入端T0T0((P3.4P3.4))发生发生一次负跳变一次负跳变时,时,T0T0加加1 1且溢出,溢出标志且溢出,溢出标志TF0TF0置置“1”“1”,发中断请求发中断请求在进入在进入T0T0中断程序后,把中断程序后,把TF0TF0标志置标志置“1”“1”,,说明说明T0T0脚已接收了负跳变信号脚已接收了负跳变信号 T1 T1定义为方式定义为方式2 2定时定时在T0T0脚发生一次负跳变后,启动脚发生一次负跳变后,启动T1T1每每500500 s s产生一次中断产生一次中断,在中断服务程序中对求反,使产生周,在中断服务程序中对求反,使产生周期期1 1msms的方波。
的方波2 2)计算)计算T1T1初值初值设设T1T1的初值为的初值为X X:: 则则 (2(28 8- -X)×2×10X)×2×10-6-6=5×10=5×10-4-4 X=2 X=28 8-250=6=06H-250=6=06H((3 3))程序设计程序设计 ORG 0000HORG 0000H RESET: RESET: LJMP MAIN LJMP MAIN ;;复位入口转主程序复位入口转主程序 ORG 000BHORG 000BH JMP IT0P JMP IT0P ;;转转T0T0中断服务程序中断服务程序 ORG 001BHORG 001BH LJMP IT1P LJMP IT1P ;;转转T1T1中断服务程序中断服务程序 ORG 0100HORG 0100HMAIN: MAIN: MOV SP,#60HMOV SP,#60H ACALL PT0M2 ACALL PT0M2 ;调用对;调用对T0T0,,T1T1初始化子程序初始化子程序LOOP: LOOP: MOV C,TF0 MOV C,TF0 ;;T0T0产生过中断了吗,产生过产生过中断了吗,产生过 ;中断,则;中断,则TF0=1TF0=1 JNC LOOPJNC LOOP;;T0T0没有产生过中断,则跳到没有产生过中断,则跳到 ;;LOOPLOOP,,等待等待T0T0中断中断 SETB TR1 SETB TR1 ;;启动启动T1T1 SETB ET1 SETB ET1 ;;允许允许T1T1中断中断HERE: HERE: AJMP HEREAJMP HERE PT0M2: MOV TMOD,#26H PT0M2: MOV TMOD,#26H ;;初始化,初始化,T1T1为方式为方式2 2定定 ;时,;时,T0T0为方式为方式1 1计数计数 MOV TL0,#0FFH MOV TL0,#0FFH ;;T0T0置初值置初值 MOV TH0,#0FFHMOV TH0,#0FFH SETB TR0 SETB TR0 ;;启动启动T0T0 SETB ET0 SETB ET0 ;;允许允许T0T0中断中断 MOV TL1,#06H MOV TL1,#06H ;;T1T1置初值置初值 MOV TH1,#06HMOV TH1,#06H CLR TF0 CLR TF0;;把把T0T0已发生中断标志已发生中断标志TF0TF0清清0 0 SETB EASETB EA RETRET IT0P: CLR TR0 IT0P: CLR TR0 ;;T0T0中断服务程序,停止中断服务程序,停止T0T0计数计数 SETB TF0 SETB TF0 ;;建立产生中断标志建立产生中断标志 RETIRETIIT1P: CPL P1.0IT1P: CPL P1.0;;T1T1中断服务,位取反中断服务,位取反 RETI RETI在在T1T1定时中断服务程序定时中断服务程序IT1PIT1P中,省去了中,省去了T1T1中断服务程序中重新中断服务程序中重新装入初值装入初值0606H H的指令。
的指令 例例6-46-4 利利用用T1T1的的方方式式2 2对对外外部部信信号号计计数数,,要要求求每每计计满满100100个个数数,,将取反 本例是本例是方式方式2 2计数模式计数模式的应用1 1)选择工作方式)选择工作方式 外部信号外部信号由由T1(P3.5)T1(P3.5) 脚输入脚输入, ,每发生一次负跳变计数器每发生一次负跳变计数器加加1 1,每输入,每输入100100个脉冲,计数器产生溢出中断,在中断服务个脉冲,计数器产生溢出中断,在中断服务程序中将取反一次程序中将取反一次 T1 T1 方式方式2 2的控制字的控制字为为TMOD=60HTMOD=60H不使用不使用T0T0时,时,TMODTMOD的低的低4 4位可任取,但不能使位可任取,但不能使T0T0进入方式进入方式3 3,这里取全,这里取全0 02 2)计算)计算T1T1的初值的初值X=2X=28 8-100=156=9CH-100=156=9CH 因此,因此,TL1TL1的初值为的初值为9 9CHCH,,重装初值寄存器重装初值寄存器TH1=9CHTH1=9CH ((3 3))程序设计程序设计 ORG 0000HORG 0000HLJMP MAINLJMP MAINORG 001BHORG 001BH;;T1T1中断服务程序入口中断服务程序入口 位取反位取反 RETIRETI ORG 0100HORG 0100H MAIN: MAIN:MOV TMOD,#60H MOV TMOD,#60H ;;设设T1T1为方式为方式2 2计数计数 MOV TL0,#9CH MOV TL0,#9CH ;;T0T0置初值置初值 MOV TH0,#9CH MOV TH0,#9CH SETB TR1SETB TR1 ;;启动启动T1T1 HERE: HERE: AJMP HEREAJMP HERE 6.4.3 6.4.3 方式方式3 3的应用的应用 T0 T0 方式方式3 3时,时,TL0TL0和和TH0TH0被分成两个独立的被分成两个独立的8 8位定时器位定时器/ /计数器。
计数器其中,其中, TL0TL0::8 8位定时器位定时器/ /计数器;计数器; TH0 TH0::8 8位定时器位定时器 当当T1T1作串行口波特率发生器时,作串行口波特率发生器时,T0T0才设置为才设置为方式方式3 3 例例6-56-5 假设某假设某89C5189C51应用系统的应用系统的两个外中断源已被占用两个外中断源已被占用,设,设置置T1T1工作在方式工作在方式2 2,作波特率发生器,作波特率发生器用现要求增加一个外现要求增加一个外部中断源,并控制引脚输出一个部中断源,并控制引脚输出一个5 5kHzkHz的方波设系统时钟为设系统时钟为6 6MHzMHz((1 1)选择工作方式)选择工作方式 TL0TL0为为方方式式3 3计计数数,,把把T0T0引引脚脚((P3.4P3.4))作作附附加加的的外外中中断断输输入入端端,,TL0TL0初初值值设设为为0 0FFHFFH,,当当检检测测到到T0T0引引脚脚电电平平出出现现负负跳跳变变时时,,TL0TL0溢溢出出,,申申请请中中断断,,这这相相当当于于跳跳沿沿触触发发的的外外部部中中断源。
断源 TH0TH0为为8 8位位方方式式3 3定定时时,,控控制制输输出出5 5kHzkHz的的方方波波信信号号如如图图6-6-1515所示2 2)初值计算)初值计算 TL0 TL0的的初值初值设为设为0 0FFHFFH 5kHz 5kHz的方波的的方波的周期为周期为200200 s s,,TH0TH0的定时时间为的定时时间为100100 s sTH0TH0初值初值X X计算如下:计算如下: (2(28 8- -X)×2×10X)×2×10-6-6=1×10=1×10-4-4 X=2 X=28 8-100=156=9CH-100=156=9CH((3 3)程序设计)程序设计 ORG 0000HORG 0000H LJMP MAIN LJMP MAIN ORG 000BH ORG 000BH ;;T0T0中断入口中断入口 LJMP TL0INTLJMP TL0INT;;跳跳T0(TL0)T0(TL0)中断服务程序中断服务程序 ORG 001BHORG 001BH ;;在在T0T0方式方式3 3时,时,TH0TH0占用占用T1T1的中断的中断 LJMP TH0INT LJMP TH0INT;;跳跳TH0TH0中断服务程序中断服务程序 ORG 0100HORG 0100HMAINMAIN:: MOV TMOD,#27H MOV TMOD,#27H ;;TL0TL0方式方式3 3计数计数,TH0,TH0定时,定时,T1T1方式方式2 2;;定时(波特率发生器)定时(波特率发生器) MOV TL0,#0FFH MOV TL0,#0FFH ;;置置TL0TL0初值初值 MOV TH0,#9CH MOV TH0,#9CH;置;置TH0TH0初值初值 MOV TL1,#dataL MOV TL1,#dataL ;;datadata为波特率常数为波特率常数 MOV TH1,#dataH MOV TH1,#dataH MOV TCON,#55H MOV TCON,#55H;;允许允许T0T0中断中断 MOV IE,#9FHMOV IE,#9FH;;启动启动T1T1 ┆ ┆ 中断处理中断处理TL0INTTL0INT::MOV TL0,#0FFH MOV TL0,#0FFH ;;TL0TL0中断服务程序;中断服务程序;TL0TL0重新装入初值重新装入初值 中断处理中断处理 TH0INTTH0INT::MOV TH0,#9CHMOV TH0,#9CH ;;TH0TH0中断服务程序,中断服务程序,TH0TH0重新装入初值重新装入初值 位取反输出位取反输出 RETI RETI 6.4.6.4.4 4 实时时钟的设计实时时钟的设计 1 1.实时时钟实现的基本思想.实时时钟实现的基本思想如如何何获获得得1 1秒秒的的定定时时,,可可把把定定时时时时间间定定为为100100msms,,采采用用中中断方式进行溢出次数的累计,断方式进行溢出次数的累计,计满计满1010次次,即得到秒计时。
即得到秒计时片内片内RAMRAM中规定中规定3 3个单元个单元作作为秒、分、时单元为秒、分、时单元,具体安排,具体安排如下:如下:4242H H::““秒秒””单元单元 ;;4141H H::““分分””单元;单元;4040H H::““时时””单元单元从秒到分,从分到时从秒到分,从分到时是通过是通过软件累加并进行比较软件累加并进行比较的方法的方法来实现的来实现的 2 2.程序设计.程序设计 ((1 1)主程序的设计)主程序的设计流程如流程如图图6-176-17所示 ((2 2)中断服务程序的设计)中断服务程序的设计中断服务程序主要功能是实现秒、中断服务程序主要功能是实现秒、分、时的计时处理参考程序略分、时的计时处理参考程序略图图6-176-17图图6-186-186.4.5 6.4.5 定时器定时器/ /计数器作为外部中断源的使用方法计数器作为外部中断源的使用方法 定时器定时器/ /计数器选择为计数器选择为计数器模式计数器模式时,定时器时,定时器/ /计数器计数器T0T0(或(或T1T1)设置为方式)设置为方式2 2(自动恢复常数方式)计数工作模式,(自动恢复常数方式)计数工作模式,计数器计数器TH0TH0、、TL0TL0初值均为初值均为0FFH0FFH,并允许,并允许T0T0中断,总中断开放。
中断,总中断开放当当T0T0引脚上发生负跳变引脚上发生负跳变时,时,T0T0(或(或T1T1)计数器溢出,)计数器溢出,TF0TF0(或(或TF1TF1)置)置““1”1”,发出中断请求发出中断请求利用这一特性,可以把利用这一特性,可以把T0T0(或(或T1T1)引脚作为外部中断请求输入引脚)引脚作为外部中断请求输入引脚,而溢出标志,而溢出标志TF0TF0(或(或TF1TF1)可作为外部中断请求标志可作为外部中断请求标志初始化程序初始化程序:: ORGORG0000H0000HAJMPAJMPIINIIINI; ;跳到初始化程序跳到初始化程序……IINI:IINI: MOV MOV TMOD,#06HTMOD,#06H; ;设置设置T0T0为方式为方式2 2MOV TL0,#0FFHMOV TL0,#0FFH; ;给计数器设置初值给计数器设置初值MOV TH0,#0FFHMOV TH0,#0FFH SETB ET0SETB ET0; ;允许允许T0T0中断中断 SETB EASETB EA; ;开中断开中断 SETBSETBTR0TR0; ;启动启动T0,T0,开始计数开始计数 当连在(当连在(T0T0引脚)的外部中断请求引脚)的外部中断请求输入线上的电平发生输入线上的电平发生负跳变时负跳变时,,TL0TL0加加1 1,产生溢出,,产生溢出,TF0TF0置置““1”1”,向,向CPUCPU发出中断发出中断请求,同时请求,同时TH0TH0的内容的内容0FFH0FFH送送TL0TL0,即,即TL0TL0恢复初值恢复初值0FFH0FFH,这样,,这样,脚相当于一个跳沿触发的外部中断请求源输入端脚相当于一个跳沿触发的外部中断请求源输入端。
对也可做对也可做类似的处理类似的处理 6.4. 6.4.6 6 运行中读定时器运行中读定时器/ /计数器计数器在在读读取取运运行行中中的的定定时时器器/ /计计数数器器时时,,需需注注意意::若若恰恰好好出出现现TLxTLx溢溢出出向向THxTHx进进位位的的情情况况,,则则读读得得的的((TLxTLx))值值就就完完全全不不对对同样,先读(同样,先读(THXTHX))再读(再读(TLXTLX))也可能出错也可能出错方法:先读(方法:先读(THxTHx),),后读(后读(TLxTLx),),再读(再读(THxTHx)若两若两次读得(次读得(THxTHx))相同,则读的内容正确相同,则读的内容正确若前后两次读的(若前后两次读的(THxTHx))有变化,则再重复上述过程,有变化,则再重复上述过程,若若重复读得的内容相同,就应是正确的下面是有关的程序,重复读得的内容相同,就应是正确的下面是有关的程序,读得的(读得的(TH0TH0))和(和(TL0TL0))放置在放置在R1R1和和R0R0内RDTIME:RDTIME:MOV A,TH0MOV A,TH0;;读(读(TH0TH0)) MOV R0,TL0MOV R0,TL0;;读(读(TL0TL0)) CJNE CJNE A,TH0,RDTIMEA,TH0,RDTIME;;比较比较2 2次读得的(次读得的(TH0TH0));不相等则重复读;不相等则重复读 MOV R1,AMOV R1,A;(;(TH0TH0))送入送入R1R1中中 RETRET 定时定时/计数器的初始化编程及应用计数器的初始化编程及应用(C51)一.定时一.定时/计数器的编程计数器的编程MCS-51单片机定时单片机定时/计数器初始化过程如下:计数器初始化过程如下:1.根据要求选择方式,确定方式控制字,写入方式.根据要求选择方式,确定方式控制字,写入方式控制寄存器控制寄存器TMOD。
2.根据要求计算定时.根据要求计算定时/计数器的计数值,再由计数计数器的计数值,再由计数值求得初值,写入初值寄存器值求得初值,写入初值寄存器3.根据需要开放定时.根据需要开放定时/计数器中断(后面须编写中计数器中断(后面须编写中断服务程序)断服务程序)4.设置定时.设置定时/计数器控制寄存器计数器控制寄存器TCON的值,启动的值,启动定时定时/计数器开始工作计数器开始工作5.等待定时.等待定时/计数时间到,到则执行中断服务程序;计数时间到,到则执行中断服务程序;如用查询处理则编写查询程序判断溢出标志,溢出标如用查询处理则编写查询程序判断溢出标志,溢出标志等于志等于1,则进行相应处理则进行相应处理二.定时二.定时/计数器的应用计数器的应用 通常利用定时通常利用定时/计数器来产生周期性的波形利用计数器来产生周期性的波形利用定时定时/计数器产生周期性波形的基本思想是:利用定时计数器产生周期性波形的基本思想是:利用定时/计数器产生周期性的定时,定时时间到则对输出端进计数器产生周期性的定时,定时时间到则对输出端进行相应的处理如产生周期性的方波只须定时时间到行相应的处理如产生周期性的方波只须定时时间到对输出端取反一次即可。
对输出端取反一次即可【【例例 】】 设系统时钟频率为设系统时钟频率为12MHZ,用定时,用定时/计数器计数器T0编程实现从输出周期为编程实现从输出周期为500μs的方波分析:分析:从输出周期为从输出周期为500μs的方波,只须每的方波,只须每250μs取反一次则可当系统时钟为取反一次则可当系统时钟为12MHZ,定时,定时/计数器计数器T0工作于工作于方式方式2时,最大的定时时间为时,最大的定时时间为256μs,满足,满足250μs的定时要求,方式控制字应设定为的定时要求,方式控制字应设定为00000010B((02H)系统时钟为)系统时钟为12MHZ,定时,定时250μs,计数值,计数值N为为250,初值,初值X=256-250=6,则,则TH0=TL0=06H汇编程序:汇编程序:ORG 0000HLJMP MAINORG 000BH;中断处理程序;中断处理程序 RETIORG 0100H ;主程序;主程序MAIN::MOV TMOD,,#02HMOV TH0,,#06HMOV TL0,,#06HSETB EASETB ET0SETB TR0SJMP $ENDC语言程序:语言程序:# include //包包含特殊功能寄存器库含特殊功能寄存器库sbit P1_0=P1^0;void main(){TMOD=0x02;TH0=0x06;TL0=0x06;EA=1;ET0=1;TR0=1;while(1);}void time0_int(void) interrupt 1 //中断服务程序中断服务程序{ P1_0=!P1_0;}(1)采用中断处理方式的程序:采用中断处理方式的程序:((2)采用查询方式处理的程序)采用查询方式处理的程序汇编程序:汇编程序:ORG 0000HLJMP MAINORG 0100H ;主程序;主程序MAIN:MOV TMOD,#02HMOV TH0,#06HMOV TL0,#06HSETB TR0LOOP:JBC TF0,NEXT ;查询计数溢出;查询计数溢出SJMP LOOPSJMP LOOPSJMP $ENDC语言程序:语言程序:# include //包含特殊功能寄存器库包含特殊功能寄存器库sbit P1_0=P1^0;void main(){char i;TMOD=0x02;TH0=0x06;TL0=0x06;TR0=1;for(;;) {if (TF0) { TF0=0; P1_0=! P1_0; } //查询计数溢出查询计数溢出 }} 如果定时时间大于如果定时时间大于65536μs,这时用一个定时,这时用一个定时/计数器计数器直接处理不能实现,这时可用两个定时直接处理不能实现,这时可用两个定时/计数器共同处理或计数器共同处理或一个定时一个定时/计数器计数器配合配合软件计数软件计数方式处理方式处理。
【【例例】】设系统时钟频率为设系统时钟频率为12MHZ,编程实现从输出周期为,编程实现从输出周期为1s的方波 根据上例的处理过程,这时应产生根据上例的处理过程,这时应产生500ms的周期性的定的周期性的定时,定时到则对取反就可实现由于定时时间较长,一个定时,定时到则对取反就可实现由于定时时间较长,一个定时时/计数器不能直接实现,可用定时计数器不能直接实现,可用定时/计数器计数器T0产生周期性为产生周期性为10ms的定时,然后用一个寄存器的定时,然后用一个寄存器R2对对10ms计数计数50次或用次或用定时定时/计数器计数器T1对对10ms计数计数50次实现系统时钟为次实现系统时钟为12MHZ,,定时定时/计数器计数器T0定时定时10ms,计数值,计数值N为为10000,只能选方式,只能选方式1,方式控制字为,方式控制字为00000001B((01H),初值),初值X::则则TH0=11011000B=D8H,,TL0=11110000B=F0H((1)用寄存器)用寄存器R2作计数器软作计数器软件计数,中断处理方式件计数,中断处理方式汇编程序:汇编程序:ORG 0000HLJMP MAINORG 000BHLJMP INTT0ORG 0100HMAIN::MOV TMOD,,#01HMOV TH0,,#0D8HMOV TL0,,#0F0HMOV R2,,#00HSETB EASETB ET0SETB TR0SJMP $INTT0::MOV TH0,,#0D8HMOV TL0,,#0F0HINC R2CJNE R2,,#32H,,NEXTMOV R2,,#00HNEXT::RETIENDC语言程序:语言程序:# include //包含特殊功能寄存器库包含特殊功能寄存器库sbit P1_1=P1^1;char i ;void main(){TMOD=0x01;TH0=0xD8; TL0=0xf0;EA=1; ET0=1;i=0;TR0=1;while(1);}void time0_int(void) interrupt 1 //中断服务程序中断服务程序{TH0=0xD8; TL0=0xf0;i++;if ( i = =50) { P1_1=! P1_1; i=0; }}OVER!。