⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 定时器.asm

📁 基于单片机89S51的定时器的设计,用过验证和实际实践
💻 ASM
字号:
;伪指令
   SL    EQU 30H         ;SL存放秒的个位数
   SH    EQU 31H         ;SH存放秒的十位数
   ML    EQU 32H         ;ML存放分的个位数
   MH    EQU 33H         ;MHL存放分的十位数
   HL    EQU 34H         ;HL存放小时的个位数
   HH    EQU 35H         ;HH存放小时的十位数
   ;
   L0    EQU 36H         ;L0--L3:显示数据存器
   L1    EQU 37H
   L2    EQU 38H
   L3    EQU 39H
   DSPLYP EQU 3AH        ;显示数据指针(DISPLAY-POINT)
   PLYTS EQU  3BH        ;显示次数计数器(PISPLAY-TIMES)
;
   LPLMOD BIT 39H        ;低两位显示方式(LOW-PLAY-MOD)
   HPLMOD BIT 3AH        ;高两位显示方式(HIGH-PLAY-MOD)
   BRIGHT BIT 3BH        ;DISPIAY子程序参数:亮/灭指示位
   ;
   TCOUNT EQU 3CH        ;时间计数器(TIME-COUNT)
   ;
   ADDRES EQU 3DH        ;加1子程序参数
   MAX EQU 3EH           ;加1子程序参数
   IFDEC BIT 20H         ;BCD加法子程序参数
   ;
   R_MOD     EQU 3FH      ;响铃方式参数
   ;
   LED4 BIT 30H             ;发光管状态位
   BELL BIT P1.7
   SWITCH BIT P3.7          ;继电器
   FKEY   BIT P3.0          ;功能器(S1)
   MKEY BIT P3.1            ;修改器(S2)
   ;
   WORKIN BIT 38H
   ;


   ;中断入口
       ORG   000H
STAR:  LJMP  MAIN       ;0000H引向主程序
       LJMP ERR          ;0003H
       NOP
       NOP
       LJMP ERR           ;引向出错处理程序
       LJMP PGT0           ;000BH引向中断处理程序PGT0
       NOP
       NOP
       LJMP ERR          ;引向出错处理程序
       LJMP ERR           ;0013 INT1
       NOP
       NOP
       LJMP ERR
       LJMP ERR          ;001BH T1
       NOP
       NOP
       LJMP ERR
       LJMP ERR           ;0023H
       NOP
       NOP
       LJMP ERR
       LJMP ERR
       NOP
       NOP
       ;

;主程序
MAIN:MOV IE,#00H                    ;关中断
      MOV SP,#57H                   ;设置堆栈指针
      MOV PSW,#00H                  ; 选用寄存器组0
      MOV TMOD,#11H                 ; 设定中断工作方式为T1和T0
      ;
      MOV A,56H
      CJNE A,#0AAH,CSTART           ; 判断上电复位标志,无标志转冷启动
      MOV A,57H
      CJNE A,#55H,CSTART            ; 无标志转冷启动
      AJMP HSTART                    ; 有上电复位标志转热启动
      NOP
      NOP
      LJMP ERR                       ;软件陷阱,引向出错处理程序
CSTART:MOV P1,#0FFH                  ; 冷启动,全面初始化
       MOV P3,#0FFH
       MOV TCON,#00H                 ;计时停止
       MOV TL0,#0B0H                 ;赋中断T0初值
       MOV TH0,#3CH
       MOV TCOUNT,#0AH               ;赋定时器初值
       MOV R5,#00H                   ;R5为一空单元(备用)
       MOV R4,#00H                    ;R4为工作模式选择积存器
       MOV SL,#00H                   ;定时单元清0
       MOV SH,#00H                   ;秒
       MOV ML,#00H                   ;
       MOV MH,#00H                   ;分
       MOV HL,#00H                    ;
       MOV HH,#00H                    ;时
       MOV PLYTS,#64H                 ;赋显示次数初值为100次
       MOV DSPLYP,#L0                  ;显示指针指向显存单元
       MOV L0,#0AH                     ;送显示数据“----”
       MOV L1,#0AH
       MOV L2,#0AH
       MOV L3,#04H
       SETB LED4                      ;LED4为数码管之间的发光2极管
       SETB LPLMOD                    ;设定显示方式为闪烁
       SETB HPLMOD
       SETB BRIGHT                    ;
       CLR WORKIN                     ;
       AJMP SETUP                     ;
       NOP
       NOP
       LJMP ERR                       ;
HSTART:MOV SCON,#00H
       MOV IP,#00H
       SETB FKEY
       SETB EA
       AJMP BEGIN
       NOP
       NOP
       LJMP ERR
SETUP: SETB EA
;
MAIN1: ACALL DISPLY
       JB    FKEY,JUDGE
       ACALL KEYDLY
       JB    FKEY,JUDGE
       CLR ET0
       CLR TR0
       ACALL MENU
BEGIN:SETB WORKIN
      SETB ET0
      SETB TR0
      MOV A,R4
      RL A
      MOV DPTR,#M_TAB
      JMP @A+DPTR
M_TAB:AJMP WORK1
      AJMP WORK2
      AJMP WORK3
      AJMP WORK4
      NOP
      NOP
      LJMP ERR
WORK1: ;
WORK2:CLR SWITCH
      AJMP MAIN2
      NOP
      NOP
      LJMP ERR
WORK3: ;
WORK4:SETB SWITCH
MAIN2:CLR BELL
       ACALL DL05S
      SETB BELL
JUDGE:JNB WORKIN,MAIN1
      MOV A,SL
      JNZ MAIN1
      MOV A,SH
      JNZ MAIN1
      MOV A,ML
      JNZ MAIN1
      MOV A,MH
      JNZ MAIN1
      MOV A,HL
      JNZ MAIN1
      MOV A,HH
      JNZ MAIN1
      CLR ET0
      CLR ET0
      ACALL ACTION
      AJMP MAIN
      NOP
      NOP
      LJMP ERR

;倒计时程序
PGT0:CLR EA
     PUSH ACC
     PUSH PSW
     PUSH DPL
     PUSH DPH
     MOV PSW,#08H
     CLR TR0
     MOV A,#087H
     ADD A,TL0
     MOV TL0,A
     MOV A,#3CH
     ADD A,TH0
     MOV TH0,A
     SETB TR0
     DEC TCOUNT
     MOV A,TCOUNT
     JNZ OUTT0
     MOV TCOUNT,#0AH
     CPL LED4
     JNB LED4,OUTT0
     MOV R0,#SH
     SETB IFDEC
     ACALL ADDBCD
     CJNE R3,#99H,OUTT0
     MOV SH,#05H
     MOV SL,#09H
     MOV R0,#MH
     ACALL ADDBCD
     CJNE R3,#99H,OUTT0
     MOV MH,#05H
     MOV ML,#09H
     MOV R0,#HH
     ACALL ADDBCD

OUTT0:POP DPH
      POP DPL
      POP PSW
      POP ACC
      SETB EA
      RETI
      NOP
      NOP
      LJMP ERR

;BCD子程序(加1或减1)
ADDBCD:MOV A,@R0
       DEC R0
       SWAP A
       ORL A,@R0
       MOV B,#01H
       MOV C,IFDEC
       MOV B.3,C
       MOV B.4,C
       MOV B.7,C
       ADD  A,B
       DA A
       MOV R3,A
       ANL A,#0FH
       MOV @R0,A
       MOV A,R3
       INC R0
       SWAP A
       ANL A,#0FH
       MOV @R0,A
       RET
       NOP
       NOP
       LJMP ERR

;加2程序
ADDONE:MOV R0,ADDRES
       CLR IFDEC
       ACALL ADDBCD
       CLR C
       MOV A,R3
       CJNE A,MAX,JGOVER
JGOVER:JC ENDADO
       CLR A
       MOV @R0,A
       DEC R0
       MOV @R0,A
ENDADO:RET
       NOP
       NOP
       LJMP ERR

;调时快进程序
QUICK:CLR LPLMOD
      CLR HPLMOD
      ACALL ADDONE
      MOV L0,R4
      INC L0
      ACALL KEYDLY
      ACALL DL100
      JNB MKEY,QUICK
      SETB LPLMOD
      CJNE R6,#02H,ENDQUK
      SETB HPLMOD
      CLR LPLMOD
ENDQUK:RET
       NOP
       NOP
       LJMP ERR

;功能菜单程序
MENU:MOV R6,#00H
     MOV ADDRES,#05H
     MOV MAX,#04H
     MOV DSPLYP,#L0
     SETB LPLMOD
     CLR HPLMOD
     MOV L0,R4
     INC L0
     MOV L1,00H
     MOV L2,#0BH
     MOV L3,#00H
     SETB LED4
;
WAITFK:ACALL DISPLY
       JNB FKEY,WAITFK
MENU1:ACALL DISPLY
      JB MKEY,JGFKEY
      ACALL KEYDLY
      JB MKEY,JGFKEY
      CJNE R6,#00H,NEXT1
      MOV SL,#00H
      MOV SH,#00H
      MOV ML,#00H
      MOV MH,#00H
      MOV HL,#00H
      MOV HH,#00H
NEXT1:MOV R2,#00H
NEXT2:ACALL ADDONE
      MOV L0,R4
      INC L0
      ;
WAITMK:ACALL DISPLY
      INC R2
      CLR C
      CJNE R2,#0C8H,JGQUIC
JGQUIC:JC WATMK1
       ACALL QUICK
WATMK1:JNB MKEY,WAITMK
       ;
JGFKEY:JB FKEY,MENU1
       ACALL KEYDLY
       JB FKEY,MENU1
       INC R6
       MOV A,R6
       RL A
       MOV DPTR,#FUNTAB
       JMP @A+DPTR
FUNTAB:AJMP WAITFK
       AJMP SETLOW
       AJMP SETHI
       AJMP ENDMEN
       NOP
       NOP
       AJMP ENDMEN

;STWKMD:
;
SETLOW:MOV MAX,#60H
       MOV A,R4
       RL A
       MOV DPTR,#FTAB1
       JMP @A+DPTR
FTAB1:AJMP SETSS
      AJMP SETM60
      AJMP SETSS
      AJMP SETM60
      NOP
      NOP
      AJMP WAITFK
SETSS:MOV DSPLYP,#SL
      MOV ADDRES,#SH
      AJMP WAITFK
SETM60:MOV DSPLYP,#ML
       MOV ADDRES,#MH
       AJMP WAITFK
;
SETHI:CLR LPLMOD
      SETB HPLMOD
      MOV MAX,#31H
      MOV A,R4
      RL A
      MOV DPTR,#FTAB2
      JMP @A+DPTR
FTAB2:AJMP SETM30
      AJMP SETHH
      AJMP SETM30
      AJMP SETHH
      NOP
      NOP
      AJMP WAITFK
SETM30:MOV ADDRES,#MH
       AJMP WAITFK
SETHH:MOV ADDRES,#HH
      AJMP WAITFK
      ;
ENDMEN:CLR HPLMOD
       RET
       NOP
       NOP
       LJMP ERR

;到点工作程序
ACTION:MOV L0,R4
       INC L0
       MOV L1,#00H
       MOV L2,#0BH
       MOV L3,#00H
       SETB LED4
       MOV DSPLYP,#L0
       SETB LPLMOD
       SETB HPLMOD
       MOV A,R4
       RL A
        MOV      DPTR,#A_TAB
       JMP      @A+DPTR
A_TAB: AJMP     ACTF1
       AJMP     ACTF1
       AJMP     ACTF3
       AJMP     ACTF3
       NOP
       NOP
       LJMP     ERR
ACTF1: SETB     SWITCH
       MOV      R_MOD,#82H
       MOV      R2,#96H
ACTF11:ACALL    RING
       JNB      MKEY,ENDACT
       JNB      FKEY,ENDACT
       DJNZ     R2,ACTF11
       MOV      R_MOD,#0FFH
       AJMP     ACTF11
       NOP
       NOP
       LJMP     ERR
ACTF3: CLR      SWITCH
       CLR      BELL
       ACALL    DL1S
       SETB     BELL
       MOV      R_MOD,#0FFH
       MOV      R2,#96H
ACTF31:ACALL    RING
       JNB      MKEY,ENDACT
       JNB      FKEY,ENDACT
       DJNZ     R2,ACTF31
       MOV      R2,#96H
       CLR      BELL
       ACALL    DL100
       SETB     BELL
       NOP
       NOP
       LJMP     ERR
ENDACT:SETB     SWITCH
AWAITF:ACALL    DISPLY
       JNB      FKEY,AWAITF
AWAITM:ACALL    DISPLY
       JNB      MKEY,AWAITM
       RET
       NOP
       NOP
       LJMP     ERR
;
;*********************
;响铃程序;
;*********************
RING:  MOV      R5,#18H
RING1: JNB      MKEY,R_EXIT
       JNB      FKEY,R_EXIT
       MOV      A,R_MOD
       MOV      C,ACC.7
       MOV      BELL,C
       RL       A
       MOV      R_MOD,A
       ACALL    DL100
       DJNZ     R5,RING1
R_EXIT:SETB     BELL
       RET
       NOP
       NOP
       LJMP     ERR
;
;*************
;显示程序;
;*************
DISPLY:PUSH     ACC
       PUSH     PSW
       MOV      PSW,#10H
       MOV      R0,DSPLYP
       MOV     R2,#0FDH
       MOV     A,PLYTS
       JNZ     PLAY
       MOV     PLYTS,#64H
       CPL     BRIGHT
PLAY:  DEC     PLYTS
       JNB     LPLMOD,PLAYL
       JB      BRIGHT,PLAYL
       ACALL   NOPLAY
       AJMP    PLAY1
       NOP
       NOP
       LJMP    ERR
;用来显示低位
PLAYL: ORL     P1,#7FH
       ORL     P3,#3CH
       MOV     A,R2
       RL      A
       ANL     P3,A
       MOV     R2,A
       MOV     A,@R0
       MOV     DPTR,#TABLE1
       MOVC    A,@A+DPTR
       ANL     P1,A
       ACALL   DL1MS
       INC     R0
       JB      P3.3,PLAYL
;
PLAY1: JNB     HPLMOD,PLAYH
       JB      BRIGHT,PLAYH
       ACALL   NOPLAY
       AJMP    OUTPLY
       NOP
       NOP
       LJMP    ERR
;
;用来显示高位
PLAYH: ORL     P1,#7FH
       ORL     P3,#3CH
       ANL     P3,#0EFH
       MOV     A,@R0
       MOV     DPTR,#TABLE1
       MOVC    A,@A+DPTR
       ANL     P1,A
       ACALL   DL1MS
       INC     R0
       ;
       ORL     P1,#7FH
       ORL     P3,#3CH
       ANL     P3,#0DFH
       MOV     A,@R0
       MOV     C,LED4
       RLC     A
       MOV     DPTR,#TABLE2
       MOVC    A,@A+DPTR
       ANL     P1,A
       ACALL   DL1MS
       ;
OUTPLY:POP     PSW
       POP     ACC
       RET
       NOP
       NOP
       LJMP    ERR
       ;
TABLE1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH,8EH,0FFH
       ;  "0","1","2","3","4","5","6","7","8","9","-","F"," "
       ;
TABLE2:DB 0FFH,0DFH,0F9H,0D9H,0A4H,84H,0B0H,90H,0BFH,09FH
       ;  " ",":","1","1","2","2","3","3","-","-:"
       ;
       ;
       ;
;*******************
;无显示(灭灯)程序;
;*******************
NOPLAY:ORL     P1,#7FH
       ORL     P3,#3CH
       INC     R0
       INC     R0
       ACALL   DL1MS
       RET
       NOP
       NOP
       LJMP    ERR
;
;*******************
;  延时程序    ;
;****************
DL1MS: MOV     R3,#0F9H
DL1MS1:NOP
       NOP
       NOP
       DJNZ    R3,DL1MS1
       RET
       NOP
       NOP
       LJMP    ERR
;
KEYDLY:CLR     BELL
       ACALL   DISPLY
       SETB    BELL
       RET
       NOP
       NOP
       LJMP    ERR
;
DL50MS:MOV     R7,#0AH
DL50M1:ACALL   DISPLY
       DJNZ    R7,DL50M1
       RET
       NOP
       NOP
       LJMP    ERR
;
DL100: ACALL   DL50MS
       ACALL   DL50MS
       RET
       NOP
       NOP
       LJMP    ERR
;
DL05S: ACALL   DL100
       ACALL   DL100
       ACALL   DL100
       ACALL   DL100
       ACALL   DL100
       RET
       NOP
       NOP
       LJMP    ERR
;
DL1S:  ACALL   DL05S
       ACALL   DL05S
       RET
       NOP
       NOP
       LJMP    ERR
;
;********************
;ERR(出错处理)程序;
;********************
ERR:   CLR     EA
       MOV     DPTR,#ERR1
       PUSH    DPL
       PUSH    DPH
       RETI
ERR1:  MOV     56H,#0AAH
       MOV     57H,#55H
       MOV     A,#00H
       PUSH    A
       PUSH    A
       RETI
       NOP
       NOP
       LJMP    ERR
;
       ORG     07FAH
       NOP
       NOP
       NOP
       LJMP    ERR
;
       END
















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -