学生联盟网为您提供优质参考范文! 体会工作报告法律咨询精彩演讲各类材料
当前位置: 学生联盟网 > 试题综合 > 小学语文 > AT89S51汇编语言程序设计课件.ppt

AT89S51汇编语言程序设计课件.ppt

时间:2021-10-22 00:32:52 来源:学生联盟网

AT89S51汇编语言程序设计,1,第6章 AT89S51单片机定时器/,AT89S51汇编语言程序设计,2,6.1 定时器/计数器的结构 定时器/计数器T0由特殊功能寄存器TH0、TL0构成,定时器/计数器T1由特殊功能寄存器TH1、TL1构成。

  图6-1 AT89S51单片机的定时器/计数器结构,AT89S51汇编语言程序设计,3,2种工作模式,4种工作方式(方式0、方式1、方式2和方式3)。属于增计数器。

  TMOD选择定时器/计数器T0、T1的工作模式和工作方式。

  TCON控制T0、T1的启动和停止计数,包含了T0、T1的状态。

  计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数。

  定时器工作模式是对单片机的时钟振荡器信号经片内12分频后的内部脉冲信号计数。由于时钟频率是定值,所以可根据计数值可计算出定时时间。

  计数器的起始计数都是从计数器初值开始的。单片机复位时计数器的初值为0,也可用指令给计数器装入一个新的初值。,AT89S51汇编语言程序设计,4,6.1.1 工作方式控制寄存器TMOD 字节地址89H,不能位寻址。

  (1)GATE门控位。

  0仅由运行控制位TRx(x0,1)来控制定时器/计数器运行。

  1外中断引脚上电平与运行控制位TRx共同来控制定时器/计数器运行。

  (2)M1、M0工作方式选择位 M1、M0共有4种编码,如表6-1所示。,AT89S51汇编语言程序设计,5,(3)C/ 计数器模式和定时器模式选择位 0为定时器工作模式,对单片机的晶体振荡器12分频后脉冲进行计数。

  1为计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)外部脉冲(负跳变)计数。

  6.1.2 定时器/计数器控制寄存器TCON 字节地址为88H,可位寻址,位地址为88H8FH。

  (1)TF1、TF0计数溢出标志位。

  当计数器计数溢出时,该位置“1”。使用查询方式时,此位作为状态位供CPU查询,查询后应使用软件及时将该位清“0”。使用中断方式时,为中断请求标志位,进入中断服务程序后由硬件自动清“0”。,图6-3 TCON格式,AT89S51汇编语言程序设计,6,(2)TR1、TR0计数运行控制位。

  TR1位(或TR0位)1,启动定时器/计数器工作。

  TR1位(或TR0位)0,停止定时器/计数器工作。

  该位可由软件置“1”或清“0”。

  6.2 定时器/计数器4种工作方式 6.2.1 方式0 M1、M000时,被设置为工作方式0,等效逻辑结构框图(以定时器/计数器T1为例,TMOD.5、TMOD.400)。

  13位计数器,由TLx(x0,1)低5位和THx高8位构成。TLx低5位溢出则向THx进位,THx计数溢出则把TCON中溢出标志位TFx置“1”。,AT89S51汇编语言程序设计,7,图6-4 定时器/计数器方式0逻辑结构框图 (1)C/ 0,电子开关打在上面位置,T1(或T0)为定时器工作模式,时钟振荡器12分频后脉冲作为计数信号。

  (2)C/ 1,电子开关打在下面位置,T1(或T0)为计数器工作模式,计数脉冲为P3.4(或P3.5)引脚上外部输入脉冲,当引脚上发生负跳变时,计数器加1。,AT89S51汇编语言程序设计,8,GATE位状态决定定时器/计数器运行控制取决TRx一个条件还是TRx和 (x0,1)引脚状态两个条件。

  (1)GATE0,A点电位恒为1,B点电位仅取决于TRx状态。TRx1,B点为高电平,控制端控制电子开关闭合,允许T1(或T0)对脉冲计数。TRx0,B点为低电平,电子开关断开,禁止T1(或T0)计数。

  (2)GATE1,B点电位由 (x0,1)的输入电平和TRx的状态这两个条件来确定。当TRx1,且 1时,B点才为1,控制端控制电子开关闭合,允许T1(或T0)计数。,AT89S51汇编语言程序设计,9,6.2.2 方式1 当M1、M001时,定时器/计数器工作于方式1。

  方式1和方式0的差别仅仅在于计数器的位数不同,方式1为16位计数器,由THx高8位和TLx低8位构成(x0,1),方式0则为13位计数器,有关控制状态位含义(GATE、C/ 、TFx、TRx)与方式0相同。,图6-5 定时器/计数器方式1逻辑结构框图,AT89S51汇编语言程序设计,10,6.2.3 方式2 方式0和方式1最大特点是计数溢出后,计数器为全0。因此在循环定时或循环计数应用时就存在用指令反复装入计数初值问题。当M1、M0为10时,定时器/计数器处于工作方式2,这时定时器/计数器的等效逻辑结构如图6-6所示(以定时器T1为例,x1)。,图6-6 定时器/计数器方式2逻辑结构框图,AT89S51汇编语言程序设计,11,定时器/计数器方式2为自动恢复初值8位定时器/计数器。

  TLx(x0,1)作为常数缓冲器,当TLx计数溢出时,在溢出标志TFx置“1”同时,还自动将THx中的初值送至TLx,使TLx从初值开始重新计数。

  图6-7 方式2工作过程,AT89S51汇编语言程序设计,12,6.2.4 方式3 为增加一个8位定时器/计数器,使AT89S51单片机具有3个定时器/计数器。

  方式3只适用于T0,T1不能工作在方式3。T1处于方式3时相当于TR10,停止计数(此时T1可用来作为串行口波特率产生器)。

  1工作方式3下的T0 TMOD的低2位为11时,T0工作方式选为方式3,各引脚与T0逻辑关系如图6-8所示。

  定时器/计数器T0分为两个独立的8位计数器TL0和TH0,TL0使用T0的状态控制位C/ 、GATE、TR0、TF0 ,而TH0被固定为一个8位定时器(不能作为外部计数模式),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。,AT89S51汇编语言程序设计,13,2T0工作在方式3时T1的各种工作方式 一般当T1用作串行口的波特率发生器时,T0才工作在方式3。T0处于工作方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。,图6-8 定时器/计数器T0方式3的逻辑结构框图,AT89S51汇编语言程序设计,14,(1)T1工作在方式0 T1控制字中M1、M000时,T1工作在方式0。

  (2)T1工作在方式1 当T1的控制字中M1、M001时,T1工作在方式1。,图6-9 T0工作在方式3时T1为方式0的工作示意图,图6-10 T0工作在方式3时T1为方式1的工作示意图,AT89S51汇编语言程序设计,15,(3)T1工作在方式2 当T1的控制字中M1、M010时,T1的工作方式为方式2。,图6-11 T0工作在方式3时T1为方式2的工作示意图,AT89S51汇编语言程序设计,16,(4)T1设置在方式3 当T0设置在方式3,再把T1也设成方式3,此时T1停止计数。

  6.3 对外部输入的计数信号要求 当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数器的值增1。

  每个机器周期的S5P2期间,都对外部输入引脚T0或T1进行采样。如在第一个机器周期中采得的值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于确认一次负跳变要花2个机器周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24。,AT89S51汇编语言程序设计,17,例如,选用6MHz频率的晶体,允许输入脉冲频率最高为250kHz。

  如果选用12MHz频率的晶体,则可输入最高频率为500kHz的外部脉冲。

  对于外部输入信号的占空比并没有什么限制,但为了确保某一给定电平在变化之前能被采样一次,则这一电平至少要保持一个机器周期。故对外部输入信号的要求如图6-12所示,图中,Tcy为机器周期。,图6-12 对外部计数输入信号的要求,AT89S51汇编语言程序设计,18,6.4 定时器/计数器的编程和应用 6.4.1 方式1应用 【例6-1】假设系统时钟频率采用6MHz,在P1.0引脚上输出一个周期为2ms的方波,如图6-13所示。

  基本思想方波周期T0确定,T0每隔1ms计数溢出1次,即T0每隔1ms产生一次中断,CPU响应中断后,在中断服务子程序中对P1.0取反。,图6-13 P1.0引脚上输出周期为2ms的方波,AT89S51汇编语言程序设计,19,(1)计算计数初值X 机器周期2s2106s 设需要装入T0的初值为X,则有216X21061103,216X500,X65036。X化为十六进制数,即65036FE0CH。

  T0的初值为TH0 FEH,TL0 0CH。

  (2)初始化程序设计 采用定时器中断方式工作。包括定时器初始化和中断系统初始化,主要是对寄存器IP、IE、TCON、TMOD的相应位进行正确的设置,并将计数初值送入定时器中。

  (3)程序设计 中断服务子程序除了完成所要求的产生方波的工作之外,还要注意将计数初值重新装入定时器,为下一次产生中断做准备。,AT89S51汇编语言程序设计,20,ORG0000H;程序入口 RESETAJMP MAIN ;转主程序 ORG 000BH ;T0中断入口 AJMP IT0P;转T0中断处理程序IT0P ORG 0100H;主程序入口 MAIN MOV SP,60H ;设堆栈指针 MOV TMOD,01H;设置T0为方式1定时 ACALL PT0M0;调用初始化子程序PT0M0 HERE AJMP HERE ;原地循环,等待中断 PT0M0 MOV TL0,0CH ;T0初始化,装初值的低8位 MOV TH0,0FEH;装初值的高8位 SETB ET0;允许T0中断 SETB EA ;总中断允许 SETB TR0 ;启动T0 RET,AT89S51汇编语言程序设计,21,IT0P MOV TL0,0CH;中断子程序,T0重装初值 MOV TH0,0FEH CPL P1.0 ;P1.0的状态取反 RETI 程序说明当执行完中断返回的指令“RETI”后,又返回断点处继续执行循环指令“AJMP HERE”。在实际程序中,“AJMP HERE” 实际上是一段主程序。如CPU不做其他工作,可用查询方式进行控制,程序要简单得多。

  MOVTMOD,01H ;设置T0为方式1 LOOPMOVTH0,0FEH ;T0置初值 MOVTL0,0CH SETBTR0 ;接通T0 LOOP1 JNB TF0,LOOP1 ;查TF0,TF0 0,T0未溢出; ;TF0 1,T0溢出,CLRTR0 ;T0溢出,关断T0 CPLP1.0 ;P1.0的状态求反 SJMPLOOP,AT89S51汇编语言程序设计,22,【例6-2】系统时钟为6MHz,编写定时器T0产生1s定时的程序。

  基本思想采用定时器模式。因定时时间较长,首先确定采用哪一种工作方式。时钟为6MHz的条件下,定时器各种工作方式最长可定时时间 方式0最长可定时16.384ms; 方式1最长可定时131.072ms; 方式2最长可定时512s。

  由上可见,可选方式1,每隔100ms中断一次,中断10次为1s。

  (1)计算计数初值X 因为216X2106101,所以X155363CB0H。因此TH03CH,TL0B0H。

  (2)10次计数的实现 对于中断10次的计数,采用B寄存器作为中断次数计数器。,AT89S51汇编语言程序设计,23,(3)程序设计 参考程序如下 ORG0000H;程序运行入口 RESET LJMP MAIN ;跳向主程序入口MAIN ORG000BH ;T0的中断入口 LJMPIT0P;转T0中断处理子程序IT0P ORG1000H;主程序入口 MAINMOVSP,60H;设堆栈指针 MOVB,0AH;设循环次数10次 MOVTMOD,01H;设置T0工作在方式1定时 MOV TL0,0B0H;给T0设初值 MOV TH0,3CH SETBET0;允许T0中断 SETBEA ;总中断允许 SETBTR0;启动T0 HERE SJMPHERE;原地循环,等待中断,AT89S51汇编语言程序设计,24,IT0P MOVTL0,0B0H ;T0中断子程序,T0重装初值 MOVTH0,3CH DJNZB,RTURN;B中断次数计数,减1非0则 ;中断返回 CLRTR0 ;1s定时时间到,停止T0工作 SETBF0;1s定时时间到标志F0置1 RTURNRETI 程序说明不论1s定时时间是否已到,都返回到“SJMP HERE”指令处。“SJMP HERE”指令实际是一段主程序。在这段主程序中再通过对F0标志的判定,可知1s定时是否到,再进行具体处理。,AT89S51汇编语言程序设计,25,6.4.2 方式2应用 方式2是一个可以自动重新装载初值8位计数器/定时器。

  当某个定时器/计数器不使用时,可扩展一个负跳沿触发外中断源。

  【例6-3】扩展一个负跳沿触发的外部中断源,把定时器/计数器T0脚作为外部中断请求输入端,溢出标志TF0作为外中断请求标志。

  基本思想设为方式2(自动装入常数方式)计数模式,TH0、TL0初值均为0FFH。当T0脚发生负跳变时,T0计数溢出,TF0置“1”,单片机发出中断请求。

  程序说明当连接在P3.4(T0脚)的外部中断请求输入脚电平发生负跳变时,TL0加1,产生溢出,TF0置“1”,向单片机发出中断请求,同时TH0的内容0FFH送TL0,即TL0恢复初值0FFH。

  P3.4脚相当于一个负跳沿触发的外中断请求源输入。对P3.5也可做类似的处理。,AT89S51汇编语言程序设计,26,初始化程序 ORG0000H AJMPIINI;跳到初始化程序 ORG000BH AJMPIT0P;跳到外中断处理程序 IINIMOV TMOD,06H;设置T0为方式2 MOV TL0,0FFH;设T0初值 MOV TH0,0FFH SETB ET0;允许T0中断 SETB EA ;总中断允许 SETB TR0;启动T0 IT0P 外中断处理程序段 ,AT89S51汇编语言程序设计,27,【例6-4】当T0(P3.4)引脚上发生负跳变时,作为P1.0引脚产生方波的启动信号。开始从P1.0脚上输出一个周期为1ms的方波,(系统时钟6MHz)。

  基本思想T0设为方式1计数,初值FFFFH。当外部计数输入端T0(P3.4)发生一次负跳变T0加1且溢出,溢出标志TF0置“1”,向CPU发出中断请求,此时T0相当于一个负跳沿触发外部中断源。

  进入T0中断程序后,F0标志置“1”,说明T0引脚上已接收过负跳变信号。T1定义为方式2定时。在T0引脚产生一次负跳变后,启动T1每500s产生一次中断,在中断服务子程序中对P1.0求反,使P1.0产生周期1ms的方波。由于省去重新装初值指令,所以可产生精确的定时时间。,AT89S51汇编语言程序设计,28,(2)计算T1的初值 设T1初值为x,则 28x21065104 x28250606H (3)程序设计 ORG 0000H;程序入口 RESETLJMP MAIN ;跳向主程序MAIN,图6-14 负跳变触发输出一个周期为1ms的方波,AT89S51汇编语言程序设计,29,ORG 000BH ;T0的中断入口 LJMP IT0P ;转T0中断服务程序 ORG 001BH ;T1的中断入口 LJMP IT1P ;转T1中断服务程序 ORG 0100H;主程序入口 MAIN MOV SP,60H ;设堆栈指针 ACALL PT0M2;调用对T0,T1初始化子程序 LOOP MOV C,F0 ;T0是否产生过中断,若产生 ;过,F0置1 JNC LOOP;T0未产生中断,C0,则跳 ;到LOOP,等待T0中断 SETB ET1 ;允许T1产生定时中断 SETB TR1 ;启动T1 HEREAJMP HERE,AT89S51汇编语言程序设计,30,PT0M2 MOV TMOD,26H ;对T0,T1初始化,T0方式1计数,T1方式2定时 MOV TL0,0FFH ;T0置初值 MOV TH0,0FFH SETB ET0 ;允许T0中断 MOV TL1,06H ;T1置初值 MOV TH1,06H CLR F0 ;把T0已发生中断标志F0清0 SETB EA ;总中断允许 SETB TR0 ;启动T0 RET IT0P CLRTR0 ;T0中断服务程序,停止T0计数 SETBF0 ;把T0引脚接负脉冲标志F0置1,即接收过负跳变 RETI,AT89S51汇编语言程序设计,31,IT1P CPL P1.0;T1中断服务程序,P1.0位取反 RETI 程序说明由于负脉冲到来的标志位F0的复位初始值为0,所以程序就在标号LOOP处循环等待。当T0(P3.4)脚发生负跳变时,由于T0计数溢出,则跳向T0中断服务子程序。此时停止T0计数,并把T0引脚接收过负脉冲的标志F0置1。当中断返回时,由于F0已被置1,则程序跳出LOOP处的循环等待。此时执行指令来允许T1中断,并启动T1定时,然后执行“AJMP HERE”指令,循环等待,等待T1的500s定时中断到来。当T1的500s定时中断产生时,则进入T1的中断服务子程序IT1P,把P1.0脚电平取反。由于是自动装初值,省去对T1重装初值指令。中断返回后,到“AJMP HERE” 处等待T1的500s定时中断。,AT89S51汇编语言程序设计,32,【例6-5】利用定时器T1的方式2计数,每计满100个数,将P1.0取反。本例是方式2计数模式的应用举例。

  (1)选择工作方式 外部信号由T1(P3.5)引脚输入,每发生一次负跳变计数器便加1,每输入100个脉冲,计数器将产生溢出中断,在中断服务程序中将P1.0取反一次。

  T1工作在方式2的控制字TMOD60H。不使用T0时,TMOD低4位任取,但不能使T0为方式3,这里取全0。

  (2)计算T1的初值 X281001569CH TL1的初值为9CH,重装初值寄存器TH19CH。,AT89S51汇编语言程序设计,33,(3)ORG0000H;程序运行入口 LJMPMAIN;跳向主程序MAIN ORG001BH;T1中断服务程序入口 CPLP1.0;P1.0位取反 RETI ORG0100H;主程序入口 MAIN MOV TMOD,60H;设置T1为方式2计数 MOVTL0,9CH ;T0置初值 MOVTH0,9CH SETBTR1 ;启动T1 HEREAJMPHERE END 程序说明由于T1的中断服务子程序只有两条指令,不超过8个字节,所以进入T1中断服务程序入口后,没有选择再跳转。,AT89S51汇编语言程序设计,34,6.4.3 方式3的应用 方式3下的T0和T1大不相同。T0工作在方式3,TL0和TH0被分成两个独立的8位定时器/计数器。其中,TL0可作为8位的定时器/计数器,而TH0只能作为8位的定时器。此时T1只能工作在方式0、1或2。

  一般情况下,当T1用作串行口波特率发生器时,T0才设置为方式3。此时,常把定时器T1设置为方式2,用作波特率发生器。

  【例6-6】假设某AT89S51单片机应用系统的两个外部中断源已被占用,设置T1工作在方式2,用作波特率发生器。现要求增加一个外部中断源,并控制P1.0引脚输出一个5kHz(周期为200s)的方波。设时钟为12MHz。

  基本思想设置TL0工作在方式3计数模式,TL0初值设为0FFH,当检测到T0脚信号出现负跳变时,TL0溢出,同时向CPU申请中断,这里T0脚作为一个负跳沿触发的外部中断请求输入端。在中断处理子程序中,启动TH0,TH0事先被设置为方式3的100s定时,从而控制P1.0输出周期为200s的方波信号。,AT89S51汇编语言程序设计,35,(1)初值X计算 TL0的初值设为0FFH。

  5kHz方波的周期为200s,因此TH0的定时时间为100s。

  初值X计算28X11061104 X281001569CH,图6-15 定时器P1.0输出的方波信号,AT89S51汇编语言程序设计,36,(2)程序设计 ORG 0000H LJMP MAIN ORG 000BH;TL0中断入口,TL0使用T0的中断 LJMP TL0INT;跳向TL0中断服务程序,TL0占用T0中断 ORG 001BH ;TH0中断入口,T1方式3,TH0使用了T1的中断 LJMP TH0INT ;跳向TH0中断服务程序 ORG 0100H;主程序入口 MAINMOV TMOD,27H ;T0方式3,T1方式2定时作串行口波特率发生器 MOV TL0,0FFH ;置TL0初值 MOV TH0,9CH;置TH0初值 MOV TL1,datal ;TL1装入串口波特率常数 MOV TH1,datah;TH1装入串口波特率常数 MOV TCON,55H;允许T0中断,AT89S51汇编语言程序设计,37,MOVIE,9FH;设置中断允许,总中断允许,;TH0、TL0中断允许 HERE AJMP HERE;循环等待 TL0INT MOV TL0,0FFH;TL0中断服务处理子程序,TL0 ;重新装入初值 SETB TR1;开始启动TH0定时 RETI TH0INTMOV TH0,9CH ;TH0中断服务程序,TH0重新 ;装入初值 CPLP1.0;P1.0位取反输出 RETI,AT89S51汇编语言程序设计,38,6.4.4 门控制位GATEx的应用测量脉冲宽度 测量 (P3.3)引脚上正脉冲宽度。

  【例6-7】门控位GATE1可使T1的启动计数受 的控制,当GATE11,TR11时,只有 INT1*引脚输入高电平时,T1才被允许计数。可测量 引脚 (P3.3)上脉冲的宽度。

  ORG 0000H RESET AJMP MAIN ;复位入口转主程序 ORG 0100H ;主程序入口 MAINMOV SP,60H MOV TMOD,90H ;TMOD写控制字,T1方式1定时,GATE11 MOV TL1,00H MOV TH1,00H,图6-16 利用GATE位测量正脉冲的宽度,AT89S51汇编语言程序设计,39,LOOP0JB P3.3,LOOP0 ;等待 低 SETB TR1 ;如 为低,启动T1 LOOP1JNB P3.3,LOOP1 ;等待 升高 LOOP2JB P3.3,LOOP2 ; 为高,此时计数器计数,;等待 降低 CLR TR1 ;停止T1计数 MOV A,TL1 ;T1计数值送A ;将T1计数值送显示器 END 执行以上程序,使 引脚上出现的正脉冲宽度以机器周期数的形式显示在显示器上。,将A中的T1计数值送到显示器显示,AT89S51汇编语言程序设计,40,6.4.5 实时时钟的设计 1实现实时时钟的基本思想 最小计时单位是秒,如何获得1s的定时时间呢方式1,最大定时时间只能131ms。可将定时器的定时时间定为100ms,中断方式进行溢出次数的累计,计满10次,即得秒计时。

  42H“秒”单元;41H“分”单元;40H“时”单元 从秒到分,从分到时是通过软件累加并比较来实现。要求每满1秒,则“秒”单元42H中的内容加1;“秒”单元满60,则“分”单元41H中的内容加1;“分”单元满60,则“时”单元40H中的内容加1;“时”单元满24,则将42H、41H、40H的内容全部清“0”。

  2程序设计 (1)主程序设计 进行定时器T0初始化,并启动T0,然后反复调用显示子程序,等待100ms中断到来。流程如图6-17所示。

  (2)中断服务程序的设计 实现秒、分、时的计时处理。流程如图6-18所示。,AT89S51汇编语言程序设计,41,图6-18 中断服务程序流程,图6-17 时钟主程序流程,AT89S51汇编语言程序设计,42,参考程序 ORG0000H AJMPMAIN;上电,跳向主程序 ORG 000BH;T0的中断入口 AJMP IT0P ORG1000H MAINMOV TMOD,01H;设T0为方式1 MOV 20H,0AH ;装入中断次数 CLR A MOV 40H,A ;“时”单元清“0” MOV 41H,A ;“分”单元清“0” MOV 42H,A ;“秒”单元清“0” SETB ET0 ;允许T0申请中断 SETB EA ;总中断允许,AT89S51汇编语言程序设计,43,MOV TH0,3CH;给T0装入计数初值 MOV TL0,0B0H SETB TR0;启动T0 HERE SJMP HERE;等中断(也可调用显示子程序)IT0PPUSH PSW;T0中断子程序入口,保护现场 PUSH Acc MOV TH0,3CH;重新装入初值 MOV TL0,0B0H DJNZ 20H,RETURN;1秒时间未到,返回 MOV 20H,0AH ;重置中断次数 MOV A,01H;“秒”单元增1 ADD A,42H DA A;“秒”单元十进制调整 MOV 42H,A;“秒”的BCD码存回“秒”单元 CJNE A,60H,RETURN;是否到60秒,未到则返回,AT89S51汇编语言程序设计,44,MOV 42H,00H ;计满60秒,“秒”单元清“0” MOV A,01H ;“分”单元增1 ADD A,41H DA A ;“分”单元十进制调整 MOV 41H,A ;“分”的BCD码存回“分”单元 CJNE A,60H,RETURN ;是否到60分,未到则返回 MOV 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” RETURNPOP Acc ;恢复现场 POP PSW RETI ;中断返回 END,