1、1第第6 6章章 AT89C51AT89C51单片机的单片机的 定时器定时器/计数器计数器2内容概要内容概要工业检测与控制,许多场合都要用到计数计数或定时定时功能。例如,对外部脉冲进行计数,产生精确的定时时间等。AT89C51片内有两个可编程的定时器/计数器T1、T0,可满足需要。本章介绍定时器/计数器的结构结构与功能功能,2种工作模式工作模式和4种工作方式工作方式,以及相关的2个特殊功能寄存器个特殊功能寄存器TMOD和TCON各位的定义及其编程,最后介绍定时器/计数器的编程及应用实例。定时/实现方式:1.软件定时;2.不可编程硬件定时;3.可编程定时。定时/计数器的定时和计数功能 在TMOD
2、中,各有一个控制位(CT),分别用于控制定时/计数器T0和T1是工作在定时器方式还是计数器方式。1.1.定时功能定时功能-计数输入信号是内部时钟脉冲,每个机器周期使寄存器的值加1。所以,计数频率是振荡频率的1/12。2.2.计数功能计数功能-计数脉冲来自相应的外部输入引脚,T0为P3.4,T1为P3.5。定时/计数器的核心部件是二进制加1计数器(TH0、TL0或TH1、TL1)。2 2个个1616位位定时器定时器/计数器计数器 (52(52系列有系列有3 3个个1616位位Timer)Timer)定时器定时器:对片内机器时钟对片内机器时钟(周期方波周期方波)进行计数进行计数计数器计数器:对对T
3、xTx引脚引脚输入的负脉冲进行计数输入的负脉冲进行计数与与TimerTimer工作有关的特殊功能寄存器:工作有关的特殊功能寄存器:TCON TCON 和和 TMODTMOD66.1 定时器定时器/计数器的结构计数器的结构定时器/计数器结构结构如图图6-1所示所示,定时器/计数器T0由特殊功能寄存器TH0、TL0构成,定时器/计数器T1由特殊功能寄存器TH1、TL1构成。图6-1 AT89C51单片机的定时器/计数器结构框图7具有定时器和计数器2种工作模式种工作模式,4种工作方式(种工作方式(方式0、方式1、方式2和方式3)。属于增计数器增计数器。TMOD用于选择定时器/计数器T0、T1的工作模
4、式和工作方式。TCON用于控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。T0、T1不论是工作在定时器模式还是计数器模式,都是对脉冲信号进行计数,只是计数信号的来源不同。计数器模式计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数(见图6-1)。定时器工作模式定时器工作模式是对单片机的时钟振荡器信号经片内812分频后的内部脉冲信号计数。由于时钟频率是定值,所以可根据计数值根据计数值可计算出定计算出定时时间时时间。计数器的起始计数都是从计数器初值开始从计数器初值开始的的。单片机复位时计数器的初值为0,也可用指令给计数器装入一个新的初值。AT89C51的定
5、时器/计数器属于增1计数器。9Timer的2个特殊功能寄存器(TCON,TMOD)TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0定时器控制寄存器定时器控制寄存器TCONTCON(88H)(88H)TFx:TFx:Timer0/1 Timer0/1计数溢出标志位。计数溢出标志位。=1=1 计数溢出计数溢出;=0=0 计数未满计数未满 TFxTFx标志位标志位可用于可用于申请中断申请中断或或供供CPUCPU查询查询。在进入中断服务程序时会自动清零;但在在进入中断服务程序时会自动清零;但在 查询方式时必须软件清零。查询方式时必须软件清零。TRx:TRx:Timer0/1 Timer0
6、/1运行控制位。运行控制位。=1=1 启动计数;启动计数;=0=0 停止计数停止计数10TR0/TR1TR0/TR1:Timer0/1Timer0/1运行控制位:运行控制位:TR0/TR1=0 TR0/TR1=0 时,时,Timer0/1Timer0/1停止计数停止计数 TR0/TR1=1 TR0/TR1=1 时,时,Timer0/1Timer0/1启动计数启动计数定时器T0/T1 中断申请过程 在已经在已经开放开放T0/T1T0/T1中断中断允许且已被启动的前提下:允许且已被启动的前提下:T0/T1T0/T1加满溢出加满溢出时时 TF0/TF1TF0/TF1标志位自动置标志位自动置“1”1”
7、检测到检测到TCONTCON中中TF0/TF1TF0/TF1变变“1”1”后后,将产生指令:将产生指令:LCALL 000BH/LCALL 001BH LCALL 000BH/LCALL 001BH 执行中断服务程序执行中断服务程序,TF0/TF1TF0/TF1标志位会标志位会自动清自动清“0”,0”,以备下次中断申请。以备下次中断申请。定时定时/计数器可按计数器可按片内机器周期片内机器周期定时,也可对由定时,也可对由T0/T1T0/T1引脚引脚输入一个输入一个负脉冲负脉冲进行加法计数进行加法计数TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TF1 TR1 TF0 TR0 IE
8、1 IT1 IE0 IT0TCON TCON(88H)(88H)11GATE C/T M1 M0 GATE C/T M1 M0定时器方式寄存器定时器方式寄存器TMOD(89H)TMOD(89H)T1T1T0T0M1,M0M1,M0:工作方式定义位:工作方式定义位 (定义定义4 4 种方式种方式 ):):C/T C/T:计数器计数器/定时器选择位定时器选择位 =1=1 外部事件计数器。对外部事件计数器。对TxTx引脚的负脉冲计数;引脚的负脉冲计数;=0=0 片内时钟定时器。对机器周期脉冲计数定时片内时钟定时器。对机器周期脉冲计数定时0 00 0:1313位位 TimerTimer用它无益用它无益
9、,不要记它!不要记它!0 10 1:1616位位 TimerTimer经常用到经常用到1 01 0:可自动重装的可自动重装的 8 8位位 TimerTimer经常用到经常用到1 11 1:T0 T0 分为分为2 2个个8 8位位 TimerTimer;T1 T1 此时不工作此时不工作 因为没有带来甚麽好处,几乎因为没有带来甚麽好处,几乎无无用用12GATE C/T M1 M0 GATE C/T M1 M0T1T0GATEGATE门控位门控位:Timer Timer可由软件与硬件两者控制可由软件与硬件两者控制 GATE=0 GATE=0 普通用法普通用法 TimerTimer的启的启/停由软件对
10、停由软件对TRxTRx位写位写“1”/“0”1”/“0”控制控制定时器方式寄存器定时器方式寄存器TMODTMOD(续)(续)(89H)(89H)GATE=1 GATE=1 门控用法门控用法 TimerTimer的启的启/停由软件对停由软件对TRxTRx位写位写“1”/“0”1”/“0”和在和在INTxINTx引脚上出现的信号的高引脚上出现的信号的高/低共同控制低共同控制计数脉冲输入定时器计数器的工作方式 定时器计数器共有四种工作方式 1.方式013位方式 TF0T0TR0GATEINT011&C/T=1振荡器1/12C/T=0TL0 TH08位低5位13位计数器定时器计数器2.方式116位方式
11、 振荡器1/12TL0 TH0TF011&T0TR0GATEINT0C/T=0C/T=18位8位16位计数器3.方式28位自动装入时间常数方式 TF0振荡器1/1211&T0TR0GATEINT0C/T=0C/T=1TL0 TH04.方式32个8位方式 仅T0可以工作在方式3此时T0分成2个独立的计数器TL0和TH0,前者用原来T0的控制信号(TR0、TF0),后者用原来T1的控制信号(TR1、TF1)。176.3 对外部输入的计数信号的要求对外部输入的计数信号的要求当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数器的值增1。每个机器周期每个
12、机器周期的S5P2期间,都对外部输入引脚对外部输入引脚T0或或T1进行采样。如在第一个机器周期中采得的值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P118期间,计数器加1。由于确认一次确认一次负跳变负跳变要花要花2个个机器周期机器周期,因此外部输入的计数脉冲的外部输入的计数脉冲的最高频率最高频率为系统振荡器频率的为系统振荡器频率的1/24。例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为250kHz。如果选用12MHz频率的晶体,则可输入最高频率为500kHz的外部脉冲。对于外部输入信号的占空比占空比并没有什么限制并没有什么限制,但为了确保某一给定电平在变化
13、之前能被采样一次,则这一电平至少要至少要保持一个机器周期保持一个机器周期。19故对外部输入信号的要求如图图6-12所示,图中,Tcy为机器周期。图6-12 对外部计数输入信号的要求 THx/TLxTHx/TLx赋初值:赋初值:THxTHx赋高赋高8 8位,位,TLxTLx赋低赋低8 8位位工作方式工作方式1 1 的编程要点:的编程要点:TMODTMOD选方式:选方式:写写“M1,M0”=01 b M1,M0”=01 b 选方式选方式1 1 若不用门控位若不用门控位,直接用软件写直接用软件写TRxTRx控制启控制启/停停 若使用门控位,先置位若使用门控位,先置位TRxTRx,然后由,然后由INT
14、xINTx端端 的高的高/低电平来控制其启低电平来控制其启/停停 若要允许中断,还须先置位若要允许中断,还须先置位ETxETx、EAEA等中断等中断 允许控制位,并编写中断服务程序允许控制位,并编写中断服务程序 若不用中断,可查询若不用中断,可查询“计数溢出标志计数溢出标志TFx”TFx”的方式工作,但溢出标志的方式工作,但溢出标志TFxTFx须软件清须软件清0 0 THx/TLxTHx/TLx赋相同初值赋相同初值 在在TLxTLx计数达到计数达到0FFH 0FFH 再加再加“1”1”时,时,TL0TL0 将溢出将溢出,进位位直接进入进位位直接进入“TFx”TFx”去申请去申请 中断中断,同时
15、打开三态门,使同时打开三态门,使THxTHx中的值中的值 自动重装自动重装(Copy)(Copy)进进TLxTLx工作方式工作方式 2 2 的编程:的编程:TMODTMOD寄存器选方式:寄存器选方式:写写“M1M1,M0”=10 b M0”=10 b 选中方式选中方式2 2 其他用法与各种方式其他用法与各种方式1 1完全相同完全相同定时器小结:定时器小结:(2 2个个1616位加法计数器)位加法计数器)运行运行/停止由停止由TRxTRx位控制,位控制,(当当GATE=1GATE=1时:时:由由TRxTRx位和位和TxTx引脚上的信号共同控制引脚上的信号共同控制)工作方式由工作方式由TMODTM
16、OD决定决定;计数计数/定时由定时由C/TC/T位决定位决定 工作方式工作方式0 0(1313位)位)永远不用永远不用 工作方式工作方式3 3(T0T0拆为双拆为双8 8位)位)几乎几乎无无用用 工作方式工作方式1 1(1616位)位)经常用到经常用到 工作方式工作方式2 2(8 8位自动重装)位自动重装)经常用到经常用到从初值按机器周期或外部脉冲递加,溢出位从初值按机器周期或外部脉冲递加,溢出位 TFxTFx申请中断;中断允许由申请中断;中断允许由ETxETx位和位和EAEA位控制,位控制,定时器初始化定时器初始化程序应完成如下工作:程序应完成如下工作:对对TMOD赋值,以确定赋值,以确定T
17、0和和T1的工作方式。的工作方式。计算初值计算初值,并将其写入并将其写入TH0、TL0或或TH1、TL1。中断方式时,则对中断方式时,则对IE赋值,开放中断。赋值,开放中断。使使TR0或或TR1置位,启动定时置位,启动定时/计数器定时或计数。计数器定时或计数。246.4 6.4 定时器定时器/计数器的编程和应用计数器的编程和应用4 4种方式,方式种方式,方式0 0与方式与方式1 1基本相同,只是计数位数不同。方基本相同,只是计数位数不同。方式式0 0初值计算复杂,初值计算复杂,一般不用方式一般不用方式0 0,而,而用方式用方式1 1。6.4.1 6.4.1 方式方式1 1的应用的应用【例例6-
18、16-1】假设系统时钟频率采用假设系统时钟频率采用6MHz6MHz,在在P1.0P1.0引脚上输出引脚上输出一个一个周期为周期为2ms2ms的的方波方波,如,如图图6-136-13所示。所示。图图6-13 P1.0引脚上输出周期为引脚上输出周期为2ms的方波的方波25基本思想基本思想:方波周期:方波周期T0T0确定,确定,T0T0每隔每隔1ms1ms计数溢出计数溢出1 1次,次,即即T0T0每隔每隔1ms1ms产生一次中断,产生一次中断,CPUCPU响应中断后,在中断服务响应中断后,在中断服务子程序中对子程序中对P1.0P1.0取反取反,如如图图6-136-13所示。为此要做如下几步所示。为此
19、要做如下几步工作。工作。(1 1)计算计数初值)计算计数初值X X机器周期机器周期=2=2 s=2s=2 10 106 6s s设需要设需要装入装入T0T0的的初值为初值为X X,则有,则有(2(21616X X)2 2 10106 6=1=1 10 103 3,2 21616X X=500=500,X X=65036=65036。X X化为十六进制数,即:化为十六进制数,即:65036=FE0CH 65036=FE0CH。T0T0的的初值初值为为TH0=FEHTH0=FEH,TL0=0CHTL0=0CH。26(2)初始化程序设计)初始化程序设计采用定时器中断方式中断方式工作。包括定时器初始化
20、和中断系统初始化,主要是对寄存器寄存器IP、IE、TCON、TMOD的相应位进行正确的设置,并将计数初值送入定时器中。(3)程序设计)程序设计中断服务子程序除了完成所要求的产生方波产生方波的工作之外,还要注意将计数初值重新装入定时器初值重新装入定时器,为下一次产生中断做准备。本例,主程序主程序用一条转至自身的短跳转指令来代替。27参考程序如下:参考程序如下:ORG0000H;程序入口RESET:AJMP MAIN ;转主程序 ORG 000BH ;T0中断入口 AJMP IT0P;转T0中断处理程序IT0P ORG 0100H;主程序入口MAIN:MOV SP,#60H;设堆栈指针 MOV T
21、MOD,#01H;设置T0为方式1定时 ACALL PT0M0;调用初始化子程序PT0M0HERE:AJMP HERE ;原地循环,等待中断28PT0M0:MOV TL0,#0CH;T0初始化,装初值的低8位 MOV TH0,#0FEH;装初值的高8位 SETB ET0;允许T0中断 SETB EA ;总中断允许 SETB TR0;启动T0 RETIT0P:MOV TL0,#0CH;中断子程序,T0重装初值 MOV TH0,#0FEH CPL P1.0 ;P1.0的状态取反 RETI程序说明:程序说明:当单片机复位时,从程序入口0000H跳向主程序MAIN处执行。其中调用了T0初始化子程序PT
22、0M0。29子程序返回后,程序执行程序执行“AJMP HERE”指令,则循指令,则循环等待。环等待。当响应响应T0定时中断定时中断时,则跳向T0中断入口,再从T0中断入口跳向IT0P标号处执行T0中断服务子程序。当执行完中断返回的指令执行完中断返回的指令“RETI”后,又返回断点处继续执行循环指令“AJMP HERE”。在实际的程序中,“AJMP HERE”实际上是一段主程序。当下一次定时器T0的1ms定时中断发生时,再跳向T0中断入口,从而重复执行上述过程。如CPU不做其他工作,也可用查询方式也可用查询方式进行控制,程序要简单得多。30查询方式参考程序:查询方式参考程序:MOVTMOD,#0
23、1H;设置T0为方式1LOOP:MOVTH0,#0FEH;T0置初值 MOVTL0,#0CH SETBTR0 ;接通T0LOOP1:JNB TF0,LOOP1 ;查TF0,TF0=0,T0未溢出;TF0=1,T0溢出,CLRTR0 ;T0溢出,关断T0 CPLP1.0 ;P1.0的状态求反 SJMPLOOP查询程序虽简单程序虽简单,但CPU必须要不断查询TF0标志,工作效率低效率低。31【例例6-2】系统时钟为6MHz,编写定时器T0产生1s定时的程序。基本思想:基本思想:采用定时器模式。因定时时间较长,首先确定采用哪一种工作方式采用哪一种工作方式。时钟为6MHz的条件下,定时器各种工作方式最
24、长可定时时间:方式方式0最长可定时16.384ms;方式方式1最长可定时131.072ms;方式方式2最长可定时512 s。由上可见,可选选方式方式1,每隔,每隔100ms中断一次中断一次,中断中断10次次为1s。32(1)计算计数初值)计算计数初值X因为(216 X)2 106=101,所以X=15536=3CB0H。因此TH0=3CH,TL0=B0H。(2)10次计数的实现次计数的实现对于中断10次的计数,采用B寄存器寄存器作为中断次数计数器中断次数计数器。(3)程序设计)程序设计参考程序如下:ORG0000H;程序运行入口RESET:LJMP MAIN ;跳向主程序入口MAIN ORG0
25、00BH ;T0的中断入口 LJMPIT0P;转T0中断处理子程序IT0P ORG1000H;主程序入口33MAIN:MOVSP,#60H;设堆栈指针 MOVB,#0AH;设循环次数10次 MOVTMOD,#01H;设置T0工作在方式1定时 MOV TL0,#0B0H;给T0设初值 MOV TH0,#3CH SETBET0;允许T0中断 SETBEA ;总中断允许 SETBTR0;启动T0HERE:SJMPHERE;原地循环,等待中断34IT0P:MOVTL0,#0B0H ;T0中断子程序,T0重装初值 MOVTH0,#3CH DJNZB,RTURN;B中断次数计数,减1非0则;中断返回 CL
26、RTR0 ;1s定时时间到,停止T0工作SETBF0;1s定时时间到标志F0置1RTURN:RETI程序说明:程序说明:不论1s定时时间是否已到,都返回到“SJMP HERE”指令处。“SJMP HERE”指令实际是一段主程序。在这段主程序中再通过对再通过对F0标志标志的的判定判定,可知1s定时是否到,再进行具体处理。例例 利用定时利用定时/计数器计数器T0的方式的方式1,产生,产生10ms的定时,的定时,并使并使P1.0引脚上输出周期为引脚上输出周期为20ms的方波,采用中的方波,采用中断方式,设系统时钟频率为断方式,设系统时钟频率为12 MHz。解:解:1、计算计数初值、计算计数初值X:由
27、于晶振为由于晶振为12 MHz,所以机器周期,所以机器周期Tcy为为1 s。所以:所以:Nt/Tcy 10103/110610000X655361000055536D8F0H即应将即应将D8H送入送入TH0中,中,F0H送入送入TL0中中 2、求、求T0的方式控制字的方式控制字TMOD:M1M0=01,GATE=0,C/T=0,可取方式控制,可取方式控制字为字为01H;采用查询方式采用查询方式ORG 0000HLJMP MAIN ;跳转到主程序;跳转到主程序ORG 0100HMAIN:MOV TMOD,#01H ;置;置T0工作于方式工作于方式1LOOP:MOV TH0,#0D8H ;装入计数
28、初值;装入计数初值MOV TL0,#0F0H SETB TR0 ;启动;启动T0JNBTF0,$;查询查询TF0=0,等待;等待;T0在工作,未计满在工作,未计满CLR TF0 ;清;清TF0;此时,此时,TF0=1,10ms定时到定时到CPL P1.0 ;P1.0取反,取反,产生方波的半个周期产生方波的半个周期SJMP LOOP ;循环产生方波循环产生方波END ORG 0000H LJMP MAIN ;跳转到主程序;跳转到主程序 ORG 000BH ;T0的中断入口地址的中断入口地址 LJMP DVT0 ;转向中断服务程序;转向中断服务程序 ORG 0100H MAIN:MOV TMOD,
29、#01H ;置;置T0工作于方式工作于方式1 MOV TH0,#0D8H ;装入计数初值;装入计数初值 MOV TL0,#0F0H SETB ET0 ;T0开中断开中断 SETB EA ;CPU开中断开中断 SETB TR0 ;启动;启动T0 SJMP$;等待中断;等待中断 DVT0:CPL P1.0 ;P1.0取反输出取反输出 MOV TH0,#0D8H ;重新装入计数值;重新装入计数值 MOV TL0,#0F0H RETI ;中断返回;中断返回 END采用中断方式采用中断方式386.4.2 方式方式2的应用的应用方式2是一个可以自动重新装载初值自动重新装载初值的8位计数器/定时器。可省去省
30、去重装初值指令。当某个定时器/计数器不使用时,可扩展一个扩展一个负跳沿触负跳沿触发发的的外中断源外中断源。【例例6-36-3】扩展一个负跳沿触发的外部中断源负跳沿触发的外部中断源,把定时器/计数器T0脚脚作为外部中断请求输入端外部中断请求输入端,溢出标志TF0作为外中断请求标志。基本思想:基本思想:设为方式2(自动装入常数方式)计数模式,TH0、TL0初值初值均为0FFH。当T0脚发生负跳变时,T0计数溢出,TF0置“1”,单片机发出中断请求。39初始化程序:ORG0000H AJMPIINI;跳到初始化程序 ORG000BH AJMPIT0P;跳到外中断处理程序IINI:MOV TMOD,#
31、06H;设置T0为方式2 MOV TL0,#0FFH;设T0初值 MOV TH0,#0FFH SETB ET0;允许T0中断 SETB EA;总中断允许 SETBTR0;启动T0 IT0P:外中断处理程序段外中断处理程序段 40程序说明:程序说明:当连接在P3.4(T0脚)的外部中断请求输入脚电平发生负跳变时,TL0加1,产生溢出,TF0置“1”,向单片机发出中断请求,同时TH0的内容的内容0FFH送TL0,即TL0恢复初值0FFH。P3.4脚相当于一个脚相当于一个负跳沿负跳沿触发的触发的外中断请求源外中断请求源输入输入。对P3.5也可做类似的处理。【例例6-4】当T0(P3.4)引脚上发生负
32、跳变时,作为P1.0引脚产生方波的启动信号。开始从P1.0脚脚上输出一个周期为周期为1ms的方波方波,如图图6-14所示所示(系统时钟6MHz)。41基本思想:基本思想:T0设为方式方式1计数计数,初值初值为FFFFH。当外部计数输入端T0(P3.4)发生一次负跳变发生一次负跳变时,T0加1且溢出溢出,溢出标志TF0置“1”,向CPU发出中断请求,此时T0相当于一个负跳沿触发的外部中断源。进入T0中断程序后,F0标志置“1”,说明T0引脚上已接收过负跳变信号。T1定义为方式方式2定时定时。在T0引脚产生一次负跳变后,启动T1每每500 s产生一次中断产生一次中断,在中断服中断服务子程序务子程序
33、中对P1.0求反求反,使P1.0产生周期周期1ms的方波。由于省去重新装初值指令,所以可产生精确精确的定时时间。42 图图6-14 6-14 负跳变触发输出一个周期为负跳变触发输出一个周期为1ms1ms的方波的方波43(2)计算)计算T1的初值的初值设T1的初值为x,则(28 x)2 106=5 104x=28 250=6=06H(3)程序设计)程序设计参考程序参考程序:ORG 0000H;程序入口RESET:LJMP MAIN ;跳向主程序MAIN ORG 000BH;T0的中断入口 LJMP IT0P ;转T0中断服务程序 ORG 001BH;T1的中断入口 44LJMP IT1P ;转T
34、1中断服务程序 ORG 0100H;主程序入口MAIN:MOV SP,#60H;设堆栈指针 ACALL PT0M2;调用对T0,T1初始化子程序LOOP:MOV C,F0;T0是否产是否产生过中断,若产生;过,F0置1 JNC LOOP;T0未产生中断,C=0,则跳;到LOOP,等待T0中断 SETB ET1 ;允许T1产生定时中断SETB TR1 ;启动T1HERE:AJMP HERE45PT0M2:MOV TMOD,#26H;对T0,T1初始化,T0方式1;计数,T1方式2定时 MOV TL0,#0FFH;T0置初值 MOV TH0,#0FFH SETB ET0;允许T0中断 MOV TL
35、1,#06H;T1置初值 MOV TH1,#06H CLR F0;把T0已发生中断标志F0清0 SETB EA;总中断允许 SETB TR0;启动T0 RET46IT0P:CLRTR0 ;T0中断服务程序中断服务程序,停止T0计数 SETBF0 ;把T0引脚接收过负脉冲标志F0置1,;即接收过负跳变 RETIIT1P:CPL P1.0;T1中断服务程序中断服务程序,P1.0位取反 RETI程序说明:程序说明:当单片机复位时,从0000H跳向主程序MAIN处执行程序。其中调用了对T0,T1初始化子程序PT0M2。子程序返回后执行标号LOOP处指令,循环等待T0引脚上负脉冲的到来。由于负脉冲到来的
36、标志位F0的复位初始值为0,所以程序就在标号LOOP处循环等待。47当T0(P3.4)脚)脚发生负跳变发生负跳变时,由于T0计数溢出,则跳向T0中断服务子程序。此时停止T0计数,并把T0引脚接收过负脉冲的标志F0置1。当中断返回中断返回时,由于F0已被置已被置1,则程序跳出LOOP处的循环等待。此时执行指令来允许T1中断,并启动T1定时,然后执行“AJMP HERE”指令,循环等待,等待等待T1的的500 s定时中断定时中断到来。当T1的500s定时中断产生时,则进入则进入T1的中断服务子的中断服务子程序程序IT1P,把P1.0脚电平取反。由于是自动装初值,省去对T1重装初值指令。中断返回后,
37、到“AJMP HERE”处等待T1的500s定时中断。如此重复,即得到图6-14波形。48【例例6-5】利用定时器T1的方式方式2计数计数,每计满计满100个个数,将P1.0取反。本例是方式方式2计数模式计数模式的应用举例。(1)选择工作方式)选择工作方式外部信号由T1(P3.5)引脚输入,每发生一次负跳变计数器便加1,每输入100个脉冲,计数器将产生溢出中断,在中断服务程序中将P1.0取反一次。T1工作在方式方式2的控制字TMOD=60H。不使用T0时,TMOD低4位任取,但不能使T0为方式3,这里取全0。(2)计算)计算T1的初值的初值X=28 100=156=9CHTL1的初值为9CH,
38、重装初值寄存器TH1=9CH。49(3)参考程序:)参考程序:ORG0000H;程序运行入口 LJMP MAIN;跳向主程序MAIN ORG001BH;T1中断服务程序入口 CPLP1.0;P1.0位取反 RETI ORG0100H;主程序入口MAIN:MOV TMOD,#60H;设置T1为方式2计数 MOVTL0,#9CH ;T0置初值 MOVTH0,#9CH SETBTR1;启动T1HERE:AJMPHEREEND 506.4.4 门控制位门控制位GATEx的应用的应用测量脉冲宽度测量脉冲宽度介绍门控制位GATE的具体应用,测量 (P3.3)引脚上正脉冲的宽度。【例例6-7】门控位GATE
39、1可使T1的启动计数受 的控制,当GATE1=1,TR1=1时,时,只有只有 INT1*引脚输入高引脚输入高电平时电平时,T1才被允许计数才被允许计数。可测量 引脚 (P3.3)上正脉冲的宽度。其方法如图图6-16所示所示。INT1INT1INT1图图6-16 利用利用GATE位测量正脉冲的宽度位测量正脉冲的宽度51参考程序:ORG0000HRESET:AJMP MAIN ;复位入口转主程序 ORG 0100H;主程序入口MAIN:MOV SP,#60H MOVTMOD,#90H;向TMOD写控制字,T1为方;式1定时,GATE1=1 MOV TL1,#00H MOV TH1,#00HLOOP
40、0:JB P3.3,LOOP0;等待 低 SETB TR1;如 为低,启动T1INT1INT152LOOP1:JNB P3.3,LOOP1;等待 升高LOOP2:JB P3.3,LOOP2;为高,此时计数器计数,;等待 降低 CLR TR1 ;停止T1计数 MOV A,TL1 ;T1计数值送A ;将T1计数值送显示器 END执行以上程序,使 引脚上出现的正脉冲宽度正脉冲宽度以机机器周期数器周期数的形式显示在显示器上。将A中的T1计数值送到显示器显示INT1INT1INT1INT1536.4.5 实时时钟的设计实时时钟的设计介绍使用定时器/计数器实现时钟。1实现实时时钟的基本思想实现实时时钟的基
41、本思想最小计时单位是秒秒,如何获得1s的定时时间的定时时间呢?从前面介绍知,定时器方式方式1,最大定时时间也只能131ms。可将定时器的定时时间定为100ms,中断方式进行溢出次数的累计,计满计满10次次,即得秒计时。而计数10次可用循环程序的方法实现。初值的计算如例6-2。片内RAM规定3个单元个单元为秒、分、时秒、分、时单元:42H:“秒秒”单元;41H:“分分”单元;40H:“时时”单元54从秒到分,从分到时从秒到分,从分到时是通过软件累加通过软件累加并比较来实现。要求每满1秒,则“秒”单元42H中的内容加1;“秒”单元满60,则“分”单元41H中的内容加1;“分”单元满60,则“时”单
42、元40H中的内容加1;“时”单元满24,则将42H、41H、40H的内容全部清“0”。2程序设计程序设计(1)主程序设计)主程序设计进行定时器T0初始化,并启动T0,然后反复调用显示子程序,等待100ms中断到来。流程如图6-17所示。(2)中断服务程序的设计)中断服务程序的设计实现秒、分、时秒、分、时的计时处理。流程如图6-18所示。55图图6-17 时钟主程序流程时钟主程序流程56图图6-18 中断服务程序流程中断服务程序流程57参考程序:参考程序:ORG0000H AJMPMAIN;上电,跳向主程序 ORG 000BH;T0的中断入口 AJMP IT0PORG1000HMAIN:MOV
43、TMOD,#01H;设T0为方式1 MOV 20H,#0AH;装入中断次数 CLR A MOV 40H,A;“时”单元清“0”MOV 41H,A;“分”单元清“0”MOV 42H,A;“秒”单元清“0”58SETB ET0;允许T0申请中断 SETB EA;总中断允许 MOV TH0,#3CH;给T0装入计数初值 MOV TL0,#0B0H SETB TR0;启动T0HERE:SJMP HERE;等中断(也可调用显示子程序)IT0P:PUSH PSW;T0中断子程序入口,保护现场 PUSH Acc MOV TH0,#3CH;重新装入初值 MOV TL0,#0B0H DJNZ 20H,RETUR
44、N;1秒时秒时间未到,返回 MOV 20H,#0AH;重置中断次数 MOV A,#01H;“秒”单元增159ADD A,42H DA A;“秒”单元十进制调整 MOV 42H,A;“秒”的BCD码存回“秒”单元 CJNE A,#60H,RETURN;是否到60秒,未到则返回 MOV 42H,#00H;计满60秒,“秒”单元清“0”MOV A,#01H;“分”单元增1 ADD A,41H DA A;“分”单元十进制调整 MOV 41H,A;“分”的BCD码存回“分”单元 CJNE A,#60H,RETURN;是否到60分,未到则返回60MOV 41H,#00H;计满60分,“分”单元清“0”MOV A,#01H;“时”单元增1 ADD A,40H DA A;“时”单元十进制调整 MOV 40H,A CJNE A,#24H,RETURN;是否到24小时,未;到则返回 MOV 40H,#00H;到24小时,“时”单元清“0”RETURN:POP Acc;恢复现场 POP PSW RETI;中断返回 END