1、AT89s51单片机的定时器 计数器 S第6章目录6.1 定时器/计数器的结构6.1.1 工作方式控制寄存器TMOD6.1.2 定时器/计数器控制寄存器TCON62定时器/计数器的4种工作方式6.2.1 方式06.2.2 方式16.2.3 方式26.2.4 方式36.3 对外部输入的计数信号的要求6.4 定时器/计数器的编程和应用641方式1的应用642方式2的应用6.43方式3的应用644门控制位GATEx的应用一测量脉冲宽度6.45实时时钟的设计3内容概要工业检测与控制,许多场合都要用到计数或定时功能。例如,对外部脉冲进行计数,产生精确的定时时间等。AT89s51片内有两个可编程的定时器/
2、计数器T1、TO,可 满足需要。本章介绍定时器/计数器的结构与功能,2种工作模式和 4种工作方式,以及相关的2个特殊功能寄存器TMOD和 TCON各位的定义及其编程,最后介绍定时器/计数器的编 程及应用实例。46J定时器/计数器的结构定时器/计数器结构如图6/所示,定时器/计数器TO由 特殊功能寄存器THO、TLO构成,定时器/计数器T1由特殊 功能寄存器TH1、TL1构成。T1脚(P3.5)外部脉冲TO脚(P3.4)外部脉冲图6-1 AT89s51单片机的定时器/计数器结构框图5具有定时器和计数器2种工作模式,4种工作方式(方 式0、方式1、方式2和方式3)。属于增计数器。TMOD用于选择定
3、时器/计数器TO、T1的工作模式和工 作方式。TCON用于控制TO、T1的启动和停止计数,同时包含 了TO、T1的状态。TO、T1不论是工作在定时器模式还是计数器模式,都 是对脉冲信号进行计数,只是计数信号的来源不同。计数器模式是对加在TO(P3.4)和T1(P3.5)两个引 脚上的外部脉冲进行计数(见图6-1)o定时器工作模式是对单片机的时钟振荡器信号经片内612分频后的内部脉冲信号计数。由于时钟频率是定值,所以 可根据计数值可计算出定时时间。计数器的起始计数都是从计数器初值开始的。单片机复位时 计数器的初值为0,也可用指令给计数器装入一个新的初 值。AT89s51的定时器/计数器属于增1计
4、数器。6.1.1 工作方式控制寄存器TMOD用于选择定时器/计数器的工作模式和工作方式,字节地址为 89H,不能位寻址,格式如图62所示。7图62 TMOD格式D7 D6 D5 D4 D3 D2 DI DOTMODGATEC/TMlMOGATEC/TMlMO89H卜-T1方式字段-y-TO方式字段-,8位分为两组,高4位控制T1,低4位控制TO。TMOD各位的功能。(1)GATE-门控位。0:仅由运行控制位TRx(x=0,1)来控制定时器/计数口口、-z-命运仃。1:用外中断引脚(或)上的电平与运行控制位TRx共同来控制定时器/计数器运行O8(2)M1 MO工作方式选择位M1、M0共有4种编码
5、,对应于4种工作方式的选择,如 表6-1所小o表6-1 Ml M0工作方式选择MlM0工作方式00方式。,为13位定时器/计数器0一方式1,为;6包定芯器二衣器1 10方式2,8位的常数自动重新装载的定时器/计数器一一方式3,仅适用于TO,此时TO分成两个8位计数器,T1停止计数(3)C/T 一计数器模式和定时器模式选择位90:为定时器工作模式,对单片机的晶体振荡器12分频 后的脉冲进行计数。1:为计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。6J.2定时器/计数器控制寄存器TCON字节地址为88H,可位寻址,位地址为88H8FH。格式 如图6
6、-3所示。D7 D6 D5 D4 D3 D2 DI D0TCON88HTF1TR1TF0TR0IE1IT1IE0rro图63 TCON格式10在第5章已介绍与外部中断有关的低4位。这里仅介绍与 定时器/计数器相关的高4位功能。(1)TF1、TFO计数溢出标志位。当计数器计数溢出时,该位置“1”。使用查询方式时,此位作为状态位供CPU查询,但应注意查询有效后,应使 用软件及时将该位清“0”。使用中断方式时,此位作为中 断请求标志位,进入中断服务程序后由硬件自动清“0”。(2)TR1、TR0计数运行寸空制位。TR1位(或TR0位)=1,启动定时器/计数器工作的必要条件。11TR1位(或TRO位)=
7、0,停止定时器/计数器工作。该位可由软件置“1”或清“0”。6.2定时器/计数器的4种工作方式4种工作方式分别介绍如下。6.2.1 方式0M1、M0=00时,被设置为工作方式0,等效逻辑结构框图 如图64所示(以定时器/计数器T1为例,TMOD.5、TMOD.4=00 o12中断图6-4定时器/计数器方式0逻辑结构框图13位计数器,由TLx(x=0,1)低5位和THx高8位构成。TL对氐5位溢出则向THjrfJ位,TH 十数溢出则把TCON中 的溢出标志位TF覆“1”oBi 13图住2的C/T位控制的电子开关决定了定时器/计数器的 两种工作模式。(1)C/T=O,电子开关打在上面位置,T1(或
8、TO)为 定时器工作模式,把时钟振荡器12分频后的脉冲作为计数 信号。(2)C/T=1,电子开关打在下面位置,T1(或TO)为 计数器工作模式,计数脉冲为P3.4(或P3.5)引脚上的外 部输入脉冲,当引脚上发生负跳变时,计数器加1。GATE位状态决定定时器/计数器的运行控制取决TRx一个条件还是TR可口 INTr(x=0,1)引脚状态两个条件。14 1 GATE=0,A点(见图6-4 电位恒为1,B点电位仅 取决于TRx状态。TRx=1,B点为高电平,控制端控制电 子开关闭合,允许T1(或T0 对脉冲计数。TRx=0,B 点为低电平,电子开关断开,禁止T1(或T0 计数。2 GATE=1,B
9、点电位由而式x=0,1 的输入电平和 TRx的状态这两个条件来确定。当TRx=1,且不瓦=1时,B点才为1,控制端控制电子开关闭合,允许T1(或T0 计数。故这种情况下计数器是否计数是由TR/口 两个条件来共同控制的。156.2.2方式1当M1、M0=01时,定时器/计数器工作于方式1,这时定时器/计数器的等效电路逻辑结构如图65所示。方式1和方式0的差别仅仅在于计数器的位数不同,方式1为16 位计数器,由THx高8位和TLx低8位构成(x=0,1,方式 0则为13位计数器,有关控制状态位的含义(GATE、C/、TFE TRx 与方式0相同。16中断图65定时器/计数器方式1逻辑结构框图176
10、23方式2方式0和方式1的最大特点是计数溢出后,计数器为全0。因 此在循环定时或循环计数应用时就存在用指令反复装入计 数初值的问题。这不仅影响定时精度,也给程序设计带来 麻烦。方式2就是针对此问题而设置的。当M1、M0为10时,定时器/计数器处于工作方式2,这时定 时器/计数器的等效逻辑结构如图66所示(以定时器T1为 例,x=1)o18定时器/计数器的方式2为自动恢复初值(初值自动装入)的 8位定时器/计数器。TLx(x=0,1)作为常数缓冲器,当TLx计数溢出时,在溢出 标志TFx置“1”的同时,还自动将THx中的初值送至TLx,使TLx从初值开始重新计数。定时器/计数器的方式2工作 过程
11、如图6-7所示。19中断图6-6定时器/计数器方式2逻辑结构框图20图67方式2工作过程该方式可省去用户软件中重装初值的指令执行时间,简 化定时初值的计算方法,可以相当精确地确定定时时间。216.2.4方式3是为增加一个8位定时器/计数器而设,使AT89s51单片 机具有3个定时器/计数器。方式3只适用于TO,T1不能工作在方式3。T1处于方式 3时相当于TR1=0,停止计数(此时T1可用来作为串行口 波特率产生器)。1.工作方式3下的TOTMOD的低2位为11时,TO的工作方式被选为方式3,各引脚与TO的逻辑关系如图68所示。定时器/计数器TO分为两个独立呼位计数器TLO和THO,TLO使用
12、TO的状态控制位C/、GATE、TRO、22TFO,而THO被固定为一个8位定时器(不能作为外部计数 模式),并使用定时器T1的状态控制位TR1和TF1,同时 占用定时器T1的中断请求源TF1。2.TO工作在方式3时T1的各种工作方式一般情况下,当T1用作串行口的波特率发生器时,TO才工 作在方式3。TO处于工作方式3时,T1可定为方式0、方式 1和方式2,用来作为串行口的波特率发生器,或不需要中 断的场合。23(a)TLO作为8位定时器/计数器中断07中断(b)THO作为8位定时器图68定时器/计数器TO方式3的逻辑结构框图24(1)T1工作在方式0T1的控制字中M1、MO=00时,T1工作
13、在方式0,工作 于惹图如图69所不。振荡器+12c/T=yC/T=lTL1(5位)TH1(8位)人串行口Tl P3.5引脚)图6-9 TO工作在方式3时T1为方式0的工作示意图 OS25(2 T1工作在方式1当T1的控制字中M1、M0=01时,工作在方式1,工 作示意图如图6-10所示。串行口图610 TO工作在方式3时T1为方式1的工作示意图 OS26(3)T1工作在方式2当T1的控制字中M1、M0=10时,T1的工作方式为方 式2,工作示意图如图6-11所示。图611 TO工作在方式3时T1为方式2的工作示意图27(4)T1设置在方式3当TO设置在方式3,再把T1也设成方式3,此时T1停止
14、计数。6.3 对外部输入的计数信号的要求当定时器/计数器工作在计数器模式时,计数脉冲来自外部输 入引脚TO或T1。当输入信号产生负跳变时,计数器的值增1。每个机器周期的S5P2期间,都对外部输入引脚TO或T1进行采 样。如在第一个机器周期中采得的值为1,而在下一个机器 周期中采得的值为0,则在紧跟着的再下一个机器周期S3Pl28期间,计数器加1。由于确认一次负跳变要花2个机器周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的 1/24 o例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为 250kHzo如果选用12MHz频率的晶体,则可输入最高频 率为500kHz的外部脉冲。对于外部
15、输入信号的占空比并没有什么限制,但为了确保某 一给定电平在变化之前能被采样一次,则这一电平至少要 保持一个机器周期。29故对外部输入信号的要求如图6/2所示,图中,为 机器周期。图6-12 对外部计数输入信号的要求 OS306.4 定时器/计数器的编程和应用4种方式,方式0与方式1基本相同,只是计数位数不同。方 式0初值计算复杂,一般不用方式0,而用方式1。6.4.1 方式1的应用【例67】假设系统时钟频率采用6MHz,在P1,0引脚上输出 一个周期为2ms的方波,如图6T3所示。1 ms PL0引脚|1 1 ms图6/3 P1.0引脚上输出周期为2ms的方波31基本思想:方波周期TO确定,T
16、O每隔1ms计数溢出1次,即TO每隔1ms产生一次中断,CPU响应中断后,在中断服务子程序中对P1.0取反,如图金近所示。为此要做如下几步工作。(1)计算计数初值1机器周期=211s=2 x 10-6s设需要装入TO的初值为名则有(216-乃x2xl0-6=ix 10-3,216-后500,斤65036。此为十六进制数,即:65036=FEOCH。T0的初值为THO=FEH,TLO=OCHo32(2)初始化程序设计采用定时器中断方式工作。包括定时器初始化和中断系 统初始化,主要是对寄存器IP、IE、TCON、TMOD的相 应位进行正确的设置,并将计数初值送入定时器中。(3)程序设计中断服务子程
17、序除了完成所要求的产生方波的工作之外,还要注意将计数初值重新装入定时器,为下一次产生中断 做准备。本例,主程序用一条转至自身的短跳转指令来代替。33参考程序如下:RESET:MAIN:ORG 0000HAJMP MAINORG 000BHAJMP ITOPORG 01 OOHMOV SP,#60HMOV TMOD,#01HACALL PT0M0HERE:AJMP HERE;程序入口;转主程序;TO中断入口;转TO中断处理程序ITOP;主程序入口;设堆栈指针;设置T0为方式1定时;调用初始化子程序PT0M0;原地循环,等待中断34PTOMO:MOV TLO,#0CHMOV THO,#OFEHSE
18、TB ETOSETB EASETB TRORETITOP:MOV TLO,#0CHMOV THO,#OFEHCPL P1.0;TO初始化,装初值的低8位;装初值的高8位;允许TO中断;总中断允许;启动TO;中断子程序,TO重装初值;P1.0的状态取反RETI程序说明:当单片机复位时,从程序入口0000H跳向主 程序MAIN处执行。其中调用了TO初始化子程序PT0M0。35子程序返回后,程序执行“AJMP HERE”指令,则 循环等待。当响应TO定时中断时,则跳向TO中断入口,再从TO中断入口跳向ITOP标号处执行TO中断服务子程序。当执行完中断返回的指令“RETI”后,又返回断点处 继续执行循
19、环指令AJMP HERE”。在实际的程序中,“AJMP HERE”实际上是一段主程序。当下一次定时 器TO的1ms定时中断发生时,再跳向TO中断入口,从而重 复执行上述过程。如CPU不做其他工作,也可用查询方式进行控制,程 序要简单得多。36查询方式参考程序:MOV TMOD,#01H;设置TO为方式 1LOOP:MOVTHO,#OFEHMOVTLO,#0CHSETBTROL00P1:JNBTFO,L00P1CLRTROCPLP1.0;TO置初值;接通TO;fiTFO,TFO=0,TO未溢出;;TF0=1,TO溢出,;TO溢出,关断TO;P1.0的状态求反SJMP LOOP查询程序虽简单,但C
20、PU必须要不断查询TFO标志,工作效率低。37【例62】系统时钟为6MHz,编写定时器TO产生1s定 时的程序。基本思想:采用定时器模式。因定时时间较长,首先确 定采用哪一种工作方式。时钟为6MHz的条件下,定时器 各种工作方式最长可定时时间:方式0最长可定时16.384ms;方式1最长可定时131.072ms;方式2最长可定时512降。由上可见,可选方式1,每隔100ms中断一次,中断10次为1s。口口口38(1)计算计数初值x因为(216-X)x2x 10-6=101 所以 X=15536=3CB0H。因此TH0=3CH,TLO=BOH o(2)10次计数的实现对于中断10次的计数,采用B
21、寄存器作为中断次数计数器o(3)程序设计参考程序如下:ORG 0000HRESET:LJMP MAINORG 000BHLJMP ITOPORG 1000H;程序运行入口;跳向主程序入口MAIN;TO的中断入口;转TO中断处理子程序ITOP;主程序入口39MAIN:HERE:MOV SP,#60HMOV B,#0AHMOV TMOD,#01HMOV TLO,#0B0HMOV THO,#3CHSETB ETOSETB EASETB TROSJMP HERE;设堆栈指针;设循环次数10次;设置TO工作在方式1定时;给T0设初值;允许T0中断;总中断允许;启动T0;原地循环,等待中断40ITOP:M
22、OV TLO,#0B0H;TO中断子程序,TO重装初值MOV THO,#3CHDJNZ B,RTURN;B中断次数计数,减1非0则SETB;中断返回;1s定时时间到,停止TO工作;1s定时时间到标志F0置1RTURN:RETI程序说明:不论1S定时时间是否已到,都返回到“SJMP HERE”指令处。SJMP HERE”指令实际是 一段主程序。在这段主程序中再通过对F0标志的判定,可 知1s定时是否到,再进行具体处理。416.4.2 方式2的应用方式2是一个可以自动重新装载初值的8位计数器/定时 器。可省去重装初值指令。当某个定时器/计数器不使用时,可扩展一个负跳沿触 发的外中断源。【例6-3】
23、扩展一个负跳沿触发的外部中断源,把定时 器/计数器TO脚作为外部中断请求输入端,溢出标志TFO作 为外中断请求标志。基本思想:设为方式2(自动装入常数方式)计数模式,THO、TLO初值均为OFFH。当TO脚发生负跳变时,TO计 数溢出,TFO置“1”,单片机发出中断请求。Bi 42初始化程序:ORG AJMP ORG AJMPIINI:MOVMOVMOV SETB SETBSETB0000HIINI000BHITOPTMOD,#06HTLO,#OFFHTHO,#OFFHETOEATRO;跳到初始化程序;跳到外中断处理程序;设置TO为方式2;设TO初值;允许TO中断;总中断允许;启动TOITOP
24、:外中断处理程序段43程序说明:当连接在P3.4 TO脚)的外部中断请求输入脚电平发生负跳变时,TLO加1,产生溢出,TFO置“1”,向单片机发出中断请求,同时THO的内容OFFH送TLO,即TLO恢复初值OFFH。P3.4脚相当于一个负跳沿触发的外中断请求源输入。对P3.5也可做类似的处理。【例64】当TO P3.4 引脚上发生负跳变时,作为P1.0引脚产生方波的启动信号。开始从P10脚上输出一个周期为1ms的方波,如图6/4所示(系统时钟6MHz。44基本思想:TO设为方式1计数,初值为FFFFH。当外部 计数输入端TO(P3.4)发生一次负跳变时,TO加1且溢出,溢出标志TFO置“1”,
25、向CPU发出中断请求,此时TO相 当于一个负跳沿触发的外部中断源。进入TO中断程序后,F0标志置“1”,说明TO引脚上已 接收过负跳变信号。T1定义为方式2定时。在TO弓I脚产生 一次负跳变后,启动T1每500度产生一次中断,在中断服 务子程序中对P1.0求反,使P1.0产生周期1ms的方波。由 于省去重新装初值指令,所以可产生精确的定时时间。45负跳变T0(P3.4)引脚TO为方式1计数PLO引脚T1为方式2定时1.5。辟I 7M ms*图6-14 负跳变触发输出一个周期为1ms的方波 OS46(2)计算T1的初值设T1的初值为x,则(28-x)x2x 10-6=5x 10-4x=28-25
26、0=6=06H(3)程序设计参考程序:ORG 0000H;程序入口RESET:LJMP MAIN;跳向主程序MAIN ORG 000BH;TO的中断入口LJMP ITOP;转TO中断服务程序ORG 001BH;T1的中断入口 OS47MAIN:LOOP:LJMP IT1PORG 01 OOHMOV SP,#60HACALL PT0M2MOV C,F0JNC LOOPSETB ET1SETB TR1;转T1中断服务程序;主程序入口;设堆栈指针;调用对TO,T1初始化子程序;T0是否产生过中断,若产生;过,F0置1;T0未产生中断,C=0,则跳;到LOOP,等待TO中断;允许T1产生定时中断;启动
27、T1HERE:AJMP HERE48PT0M2:MOV TMOD,#26HMOV TLO,#OFFHMOV THO,#0FFH;对TO,T1初始化,TO方式1;计数,T1方式2定时;TO置初值SETB ETOMOV TL1,#06HMOV TH1,#06HCLR FOSETB EASETB TRO;允许TO中断;T1置初值;把TO已发生中断标志F0清0;总中断允许;启动TORET49ITOP:CLR TRO;TO中断服务程序,停止TO计数 SETB FO;把TO弓I脚接收过负脉冲标志FO置1,;即接收过负跳变 RETIIT1P:CPL P1.0;T1中断服务程序,P1.0位取反RETI程序说明
28、:当单片机复位时,从0000H跳向主程序 MAIN处执行程序。其中调用了对TO,T1初始化子程序 PT0M2o子程序返回后执行标号LOOP处指令,循环等待 TO引脚上负脉冲的到来。由于负脉冲到来的标志位F0的 复位初始值为0,所以程序就在标号LOOP处循环等待。50当TO(P3.4)脚发生负跳变时,由于TO计数溢出,则 跳向TO中断服务子程序。此时停止TO计数,并把TO弓I脚 接收过负脉冲的标志F0置1。当中断返回时,由于F0已被置1,则程序跳出LOOP处 的循环等待。此时执行指令来允许T1中断,并启动T1定 时,然后执行“AJMP HERE”指令,循环等待,等待T1 的5002定时中断到来。
29、当T1的5002定时中断产生时,则进入T1的中断服务子 程序IT1P,把P1.0脚电平取反。由于是自动装初值,省去 对T1重装初值指令。中断返回后,到“AJMP HERE”处等待T1的500所定时中断。如此重复,即得到图6-14波 形。51【例65】利用定时器T1的方式2计数,每计满100个 数,将P1.0取反。本例是方式2计数模式的应用举例。(1)选择工作方式外部信号由T1(P3.5)引脚输入,每发生一次负跳变 计数器便加1,每输入100个脉冲,计数器将产生溢出中断,在中断服务程序中将P1.0取反一次。T1工作在方式2的控制字TMOD=60H。不使用TO时,TMOD低4位任取,但不能使T0为
30、方式3,这里取全0。(2)计算T1的初值X=28-100=156=9CHTL1的初值为9cH,重装初值寄存器TH1=9CH。52(3)参考程序:ORGLJMPORGCPLRETIORGMAIN:MOVMOVMOVSETBHERE:AJMPEND0000HMAIN001 BHP1.001 OOHTMOD,#60HTLO,#9CHTHO,#9CHTR1HERE;程序运行入口;跳向主程序MAIN;T1中断服务程序入口;P1.0位取反;主程序入口;设置T1为方式2计数;T0置初值;启动T153程序说明:由于T1的中断服务子程序只有两条指令,不超过8个字节,所以进入T1中断服务程序入口后,没有 选择再跳
31、转。6.4.3 方式3的应用方式3下的TO和T1大不相同。TO工作在方式3,TLO和 THO被分成两个独立的8位定时器/计数器。其中,TLO可 作为8位的定时器/计数器,而THO只能作为8位的定时器。此时T1只能工作在方式0、1或2。一般情况下,当T1用作串行口波特率发生器时,T0才 设置为方式3。此时,常把定时器T1设置为方式2,用作 波特率发生器。Bi 54【例66】假设某AT89s51单片机应用系统的两个外部 中断源已被占用,设置T1工作在方式2,用作波特率发生 器。现要求增加一个外部中断源,并控制P1.0引脚输出一 个5kHz(周期为200(is)的方波。设时钟为12MHz。基本思想:
32、设置TLO工作在方式3计数模式,TLO的初值 设为OFFH,当检测到TO脚信号出现负跳变时,TLO溢出,同时向CPU申请中断,这里TO脚作为一个负跳沿触发的 外部中断请求输入端。在中断处理子程序中,启动TH0,THO事先被设置为方式3的100g定时,从而控制P1.0输 出周期为200a的方波信号,如图6/5所示。55T0(P3.4)引脚PLO引脚外部中断源的 负跳变TLO为方式3计数THO为方式3定时100 ps.100 即 Jr=2oo即 舞图6-15定时器P1.0输出的方波信号56(1)初值闷算TLO的初值设为OFFH。5kHz方波的周期为200a,因itbTHO的定时时间为1002。初值
33、X计算:(28-X)x 1 x 10-6=1 x 10-4%=28-100=156=9CH(2)程序设计ORG 0000HLJMP MAINORG 000BH;TLO中断入口,TLO使用TO的中断LJMP TLOINT;跳向TLO中断服务程序,TLO占用TO中断57ORG 001BH;THO中断入口,T1为方式3时,THO;使用了T1的中断LJMP THOINT;跳向THO中断服务程序ORG 01 OOH;主程序入口MAIN:MOV TMOD,#27H;TO方式3,T1 方式2定时作串;行口波特率发生器MOV TLO,#OFFH;置TLO初值MOV THO,#9CH;置THO初值MOV TL1
34、,#datal;TL1装入串口波特率常数MOV TH1,#datah;TH1装入串口波特率常数MOVTCON,#55H;允许TO中断58MOV IE,#9FHHERE:TLOINT:THOINT:AJMP HEREMOV TLO,#OFFHSETB TR1RETIMOV THO,#9CHCPL P1.0;设置中断允许,总中断允许,;THO、TLO中断允许;循环等待;TLO中断服务处理子程序,TLO;重新装入初值;开始启动TH0定时;TH0中断服务程序,TH0重新;装入初值;P1.0位取反输出RETI596.4.4 门控制位GATEx的应用一测量脉冲宽度介绍门控制位GATE的具体应用,测量而1(
35、P3.3)引 脚上正脉冲的宽度。【例67 门控位GATE1可使T1的启动计数受南I的 控制,当GATE1=1,TR1=1时,只有INT1*引脚输入高 电平时,T1才被允许计数。可测量弓I脚而i(P3.3)上 正脉冲的宽度。其方法如图6/6所示。P3.3 1对T1初始化 90H-TMOD GATE=1T1从。开始计数 测量脉冲宽度读出T1的值 O*TR1,停止T1计数图6T6利用GATE位测量正脉冲的宽度60参考程序RESET:MAIN:LOOPO:ORG 0000HAJMP MAINORG 01 OOHMOV SP,#60HMOV TMOD,#90HMOV TL1,#00HMOV TH1,#0
36、0HJB P3.3,LOOPO;复位入口转主程序;主程序入口;向TMOD写控制字,T1为方;式 1 定时,GATE1=1;等待INT1低SETB TR1;如Nfi为低,启动T161L00P1:JNB P3.3,L00P1;等待 INTI 升高L00P2:JB P3.3,L00P2;m而为高,此时计数器计数,;等待INT1降低CLR TR1;停止T1计数MOV A,TL1;T1计数值送A将A中的T1计数值送将计数值送显示器至显ZF器显于END执行以上程序,使而引脚上出现的正脉冲宽度以机 器周期数的形式显示在显示器上。626.4.5 实时时钟的设计介绍使用定时器/计数器实现时钟。1.实现实时时钟的
37、基本思想最小计时单位是秒,如何获得1s的定时时间呢?从前面 介绍知,定时器方式1,最大定时时间也只能131ms。可 将定时器的定时时间定为100ms,中断方式进行溢出次数 的累计,计满10次,即得秒计时。而计数10次可用循环程 序的方法实现。初值的计算如例62。片内RAM规定3个单元为秒、分、时单元:42H:“秒”单元;41H:“分”单元;40H:“时”单元 O S O 63从秒到分,从分到时是通过软件累加并比较来实现。要 求每满1秒,贝IJ“秒”单元42H中的内容加1;“秒”单元 满60,则“分”单元41H中的内容加1;“分”单元满60,则“时”单元40H中的内容加1;“时”单元满24,则将
38、 42H、41H、40H的内容全部清“0”。2.程序设计(1)主程序设计进行定时器T0初始化,并启动T0,然后反复调用显示 子程序,等待100ms中断到来。流程如图6-17所示。(2)中断服务程序的设计实现秒、分、时的计时处理。流程如图6-18所示。64图617时钟主程序流程65图618 中断服务程序流程66参考程序:MAIN:ORG 0000HAJMP MAINORG 000BHAJMP ITOPORG 1000HMOV TMOD,#01HMOV 20H,#0AHCLR AMOV 40H,AMOV 41H,AMOV 42H,A;上电,跳向主程序;TO的中断入口;设TO为方式1;装入中断次数“
39、时”单元清“0”“分”单元清“0”“秒”单元清“0”67SETB ETOSETB EAMOV THO,#3CHMOV TLO,#0B0HSETB TROHERE:SJMP HEREITOP:PUSH PSWPUSH AccMOV THO,#3CHMOV TLO,#0B0HDJNZ 20H,RETURNMOV 20H,#0AHMOV A,#01H;允许TO申请中断;总中断允许;给TO装入计数初值;启动TO;等中断(也可调用显示子程序);TO中断子程序入口,保护现场;重新装入初值;1秒时间未到,返回;重置中断次数;“秒”单元增168ADD A,42HDA A“秒”单元十进制调整单元“0”MOV 4
40、2H,A;“秒”的BCD码存回“秒”CJNE A,#60H,RETURN;是否到60秒,未到则返回MOV 42H,#00H;计满60秒,“秒”单元清MOV A,#01H;“分”单元增 1ADD A,41HDA AMOV 41H,A“分”单元十进制调整“分”的BCD码存回“分”单元CJNE A,#60H,RETURN;是否到60分,未到则返回69MOV 41H,#00H;计满60分,“分”单元清“0”MOV A,#01H;“时”单元增 1ADD A,40HDA A;“时”单元十进制调整MOV 40H,ACJNE A,#24H,RETURN;是否到24小时,未;到则返回MOV 40H,#00H;到24小时,“时”单元清“0”RETURN:POP AccPOP PSWRETI;恢复现场;中断返回ENDa70