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

📄 suidao light.asm

📁 本程序使用STC单片机控制隧道灯具
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;--------------------------------------------------------------------------
;
;                      隧道指示灯控制器程序
;                           V1.0
;软件说明:
;此软件是V1.0版本2006-11-01
;使用12887储存时段表和显示方案
;
;
;--------------------------------------------------------------------------
;联网地址(0--FF)
;地址=0FFH 为广播地址,地址=0 ~ 0FEH 为单机地址
LW_ADDR   EQU   1
;--------------------------------------------------------------------------
;变量定义表
;------------------------寄存器定义----------------------------------------
RHOUR      DATA  28H                ;当前小时寄存器,以BCD形式
RMINUTE    DATA  29H                ;当前分钟寄存器,以BCD形式
TMSG       DATA  2AH                ;当前时段寄存器,以BCD形式
TEST_H     DATA  2BH                ;小时缓冲
TEST_M	   DATA  2CH                ;分钟缓冲

;--------------------------------------------------------------------------

;------------------------标志位定义----------------------------------------
;ONOFF_FLG  EQU   00H
;---------------------------------------------------------------------------
;------------------------地址常量定义---------------------------------------
SD_ADDR    EQU   0010H                ;时段表存储开始地址,外部RAM
MAXTEG     EQU   000FH                ;最大时段值存储地址,外部RAM
XS_ADDR    EQU   0030H                ;显示方案表存储开始地址,外部RAM
;---------------------------------------------------------------------------
;------------------------常量定义-------------------------------------------
;本机使用9600波特率,SMOD=0
BD_RATE    EQU  0FDH                ;9600 BOAD_RATE VALUE 11.0592M
SDXZ       EQU   09H                    ;时段限制(BCD)SDXZ=SDXZ1+1
;SDXZ1      EQU   08H                    ;时段限制(BCD)
SDXZ3      EQU   08H
SD_NUM     EQU   20H                    ;时段表长度=8 * 4
SD_LONG    EQU   04H                    ;时段表中单个时段结构的长度
XS_NUM     EQU   09H                    ;显示方案表长度
SEND_NUM   EQU   34H                ;模拟口1发送数代换数
JISHU_NUM  EQU   35H                ;模拟口1发送计数器代换数
R0_NUM     EQU   36H;
;
;信号引脚定义
DOG       EQU   P3.5                   ;
TIME      EQU   P3.4                   ;=0 DS12887片选有效
XDAT      EQU   P1.0
XTXD      EQU   P1.1
XLAT      EQU   P1.2

STACK     EQU   50H
;
;---------------------------------------------------------------------------
;------------------------以下为程序清单-------------------------------------
ORG 0000H
         AJMP START                      ;主程序
         ORG     0023H
	 LJMP    S_PORT                  ;INTERRUPT OF SERIES PORT
;首先对89C51初始化
ORG 0030H
START:   NOP
         MOV  8EH,#02H            ;应用STC89C53RC时,禁止内部扩屏RAM
         MOV  SP,#STACK            ;设堆栈首地址
         MOV     PCON,#00000000B ;SMOD=0
	 MOV     SCON,#01010000B ;1101 0000 (MODE 1 ;RECEIVE ENABLE)
         MOV     TMOD,#00100000B ;0010 0000 (T1 MODE 2_TIME)
         MOV     TCON,#01000000B ;0100 0000 (TR1=1 )
         MOV     TL1,#BD_RATE    ;T1 IS TIMER ,MAKE BARD_RATE
	 MOV     TH1,#BD_RATE
	 MOV     IP,#00010000B   ;0001 0000 (S-PORT HIGH interrupt)
	 MOV     IE,#10010000B   ;1001 0000 (S_PORT ENABLE INT)
         CPL DOG
          ;初始化各变量寄存器
           MOV 20H,#00H             ;  清位寻址区
           MOV 21H,#00H              ;
           MOV 22H,#00H              ;
           MOV 23H,#00H              ;
           CLR TIME
           MOV TMSG,#01H             ;当前时段
            MOV DPTR,#007EH           ;判断是否初次运行
            MOVX A,@DPTR
            CJNE A,#2CH,CLKSET
            INC DPTR
            MOVX A,@DPTR
            CJNE A,#2CH,CLKSET
            NOP
            NOP
            LJMP SFLOG    ;应该直到RDTIME

CLKSET:   CPL DOG
;对DS12887初始化,写操作
            MOV DPTR,#000BH           ;B寄存器SET位置1,禁止12887运行,
            MOV A,#0A2H                ;设24小时制
            MOVX @DPTR,A
            MOV  DPTR,#0000H         ;清秒
            CLR A
            MOVX @DPTR,A
            INC DPTR
            MOVX @DPTR,A
            INC DPTR                  ;清分
            MOVX @DPTR,A
            INC DPTR                   ;分闹钟用03
            MOV A,#03H
            MOVX @DPTR,A
            INC DPTR                   ;清时
            MOV A,#07H
            MOVX @DPTR,A               ;7时
            INC DPTR
            MOV A,#00H
            MOVX @DPTR,A               ;时闹钟00
            INC DPTR                   ;清周
            MOV A,#01H                  ;周一
            MOVX @DPTR,A
            INC DPTR                   ;日1
            MOVX @DPTR,A
            INC DPTR
            MOV A,#11H                  ;月11
            MOVX @DPTR,A
            INC  DPTR
            MOV  A,#06H                 ;年06
            MOVX @DPTR,A
            MOV DPTR,#000AH           ;以BCD码计时,允许报警中断
            MOV A,#0A0H                ;设为010允许保留时间 ,uip位不应该置位
            MOVX @DPTR,A
            MOV DPTR,#000CH            ;C寄存器没有作用
            MOVX A,@DPTR
            INC DPTR
            MOVX A,@DPTR               ;D寄存器没有作用
            MOV DPTR,#000BH
            MOV A,#22H                  ;B寄存器SET位置0,12887正常运行,
            MOVX @DPTR,A
            CPL DOG
;
;将时段方案表装入存储器(12887)
LDTB:           MOV     DPTR,#SD_ADDR ;时段表存储开始地址,外部RAM
                MOV     R0,DPL
                MOV     R1,DPH
                MOV     DPTR,#TABL2              ;时段表首地址
                MOV     R5,#SD_NUM                  ;时段表长度
LOADNUM:        CLR     A
                MOVC    A,@A+DPTR               ;查表输入
	        MOV     P2,R1
                MOVX    @R0,A                   ;
        	INC     DPTR
	        LCALL   INCR0R1
                DJNZ        R5,LOADNUM
                CPL         DOG
                MOV     DPTR,#XS_ADDR ;显示方案表存储开始地址,外部RAM
                MOV     R0,DPL
                MOV     R1,DPH
                MOV     DPTR,#TABL1              ;显示方案表首地址
                MOV     R5,#XS_NUM                  ;显示方案表长度
LOADNUMM:       CLR         A
                MOVC        A,@A+DPTR               ;查表输入
	        MOV         P2,R1
                MOVX        @R0,A                   ;
        	INC     DPTR
	        LCALL   INCR0R1
                DJNZ        R5,LOADNUMM
                CPL         DOG
                MOV         DPTR,#MAXTEG               ;最大时段值存储地址
                MOV         A,#SDXZ3                   ;当前最大时段设为"8"
                MOVX        @DPTR,A                   ;
              ;
     SFLOG:   CPL       DOG                   ;不是初次运行
              MOV       DPTR,#007EH            ;置运行标志
              MOV       A,#2CH
              MOVX      @DPTR,A
              INC       DPTR
              MOVX      @DPTR,A

;************************************************************************
   RDTIME:     MOV      DPTR,#000AH          ;访问DS12887
               MOVX     A, @DPTR             ;读取当前时刻
               CPL      DOG
               JBC      ACC.7,RDTIME          ;当UIP为1,更新数据.  只读,不用清0
               MOV      DPTR,#0002H          ;当UIP为0,244us更新一次,
               MOVX     A,@DPTR             ;时间,日历等在此时可以访问
               MOV      RMINUTE,A            ;UIP READ ONLY,
               INC      DPTR                  ;置寄存器B中SET位1,清UIP位
               INC      DPTR
               MOVX     A,@DPTR
               MOV      RHOUR,A
               CPL      DOG                  ;
;------------------------------------------------------------

;判断当前最大时段是多少,存入12887
               MOV      R3,#00H
    LLP1:      INC      R3               ;
               CJNE     R3,#SDXZ3,PLC1     ;
               NOP
               LJMP     OUTP1
    PLC1:      MOV      A,R3
               MOV      R4,A
               LCALL    JSSD
;               MOV      DPTR,#SD_ADDR                ;读取时段表数据
               INC      DPTR
               INC      DPTR
               MOVX     A,@DPTR                  ;
               MOV      TEST_H,A                  ;
               INC      DPTR                     ;
               MOVX     A,@DPTR
               MOV      TEST_M,A
               LCALL    DECDPTR         ;DPTR=DPTR-1


               MOV      A,#SD_LONG
               CLR      C
               ADD      A,DPL
               MOV      DPL,A
               CLR      A
               ADDC     A,DPH
               MOV      DPH,A
               MOVX     A,@DPTR
               CJNE     A,TEST_H,LLP1
               INC      DPTR
               MOVX     A,@DPTR
               CJNE     A,TEST_M,LLP1
;小时,分钟相同则认为后面没有新时段
    OUTP1:     MOV      DPTR,#MAXTEG              ;最大时段值存储地址
               MOV      A,R3
               LCALL    BINBCD               ; 其实可以不转都行的
               MOVX     @DPTR,A
   ;根据当前时刻,判断应该运行第几时段
    CKTAB:     MOV      A,TMSG
               LCALL    BCDBIN
               MOV      R4,A
               NOP
               JZ       NORGT
               NOP
               CJNE     A,#SDXZ,THIS3
     THIS3:    NOP
               JC       NWR
      NORGT:   MOV      A,#01H        ;大于10,则重赋值
               MOV      TMSG,A
               MOV      R4,#01H
    NWR:       LCALL    JSSD    ;计算时段条地址,R4为时段值

               INC      DPTR          ;DPTR存储时段条地址
               INC      DPTR
               MOVX     A,@DPTR
               MOV      R4,A            ;THE TABLE HOUR IN R4
               INC      DPTR
                MOVX    A,@DPTR
                LCALL   DECDPTR
                MOV     R5,A            ;THE TABLE MINUTE IN R5
                MOV     A,R4
                CJNE    A,RHOUR,LL1
                MOV     A,R5
                CJNE    A,RMINUTE,LL1
                NOP
                NOP
                LJMP    FOUND
       LL1:     NOP
                JC      BIG
                MOV     A,TMSG          ;如果比现时时间大,则将时段减一
                CJNE    A,#01H,DECR
                PUSH    DPL
                PUSH    DPH
                MOV     DPTR,#MAXTEG
                MOVX    A,@DPTR
                POP     DPH
                POP     DPL
                MOV     TMSG,A
                 NOP
                 LJMP   FOUND
      DECR:      MOV    A,TMSG
                 LCALL  BCDBIN
                 DEC    A
                 MOV    TMSG,A
                 NOP
                 LJMP   CKTAB
       BIG:      PUSH   DPL
                 PUSH   DPH
                 MOV    DPTR,#MAXTEG                 ;THE PRESENT TIME-STAGE IS MAX?
                 MOVX   A,@DPTR
                 POP    DPH
                 POP    DPL
                 CJNE   A,TMSG,LL2
                 NOP
                 LJMP  FOUND
       LL2:      MOV    A,DPL                     ;GET THE NEXT HOUR ADDRESS
                 ADD    A,#SD_LONG
                 MOV    DPL,A
                 CLR    A
                 ADDC   A,DPH
                 MOV    DPH,A
                 MOVX   A,@DPTR                   ;THE NEXT HOUR IS IN R4
                 MOV    R4,A
                 INC    DPTR
                 MOVX   A,@DPTR                   ;THE  NEXT MINUTE IS IN R5
                 MOV    R5,A
                 MOV    A,R4
                 CJNE   A,RHOUR,LL3
                 MOV    A,R5
                 CJNE   A,RMINUTE,LL3
                 MOV    A,TMSG
                 INC    A
                 CLR    C
                 CLR    AC
                 MOV    TMSG,A
                 NOP
                 LJMP   CKTAB
      LL3:       NOP
                 JC     BIGGER
                 NOP
                 LJMP   FOUND
   BIGGER:       MOV    A,TMSG
                 INC    A
                 CLR    C
                 CLR    AC
                 DA     A
                 MOV    TMSG,A
                 NOP
                 LJMP   CKTAB
    FOUND:

                 CPL    DOG
                 MOV    A,TMSG              ;获得当前时段
                 LCALL  BCDBIN
                 MOV      R4,A
                 LCALL    JSSD    ;计算时段条地址,R4为时段值
                 CLR     XDAT       ;595上升沿有效
	         CLR     XTXD
	         CLR     XLAT
                 INC    DPTR
                 MOVX   A,@DPTR;根据时段,查得当前方案
                 CPL    DOG
                 CJNE   A,#55H,CHEKA
                 LCALL   ZHENGC
    CHEKA:       CJNE   A,#0AAH,CHEKB
                 LCALL   DIAOG
    CHEKB:       NOP
                 LJMP   RDTIME
DIAOG:           PUSH   DPL
                 PUSH   DPH
                 MOV    A,#0FFH
                 LCALL   SENDNUM
                 MOV   DPTR,#XS_ADDR
                 MOV   A,R0
                 MOV   R0_NUM,A
                 MOV   R0,#9
             ZZ: MOVX  A,@DPTR
                 LCALL   SENDNUM
                 INC DPTR
                 CPL    DOG
                 DJNZ R0,ZZ
                 MOV  A,R0_NUM
                 MOV  R0,A
                 LCALL   FLAT
                 POP    DPH
                 POP    DPL
                 RET
ZHENGC:          PUSH   DPL
                 PUSH   DPH
                 MOV    A,#00H
                 LCALL   SENDNUM
                 MOV   DPTR,#XS_ADDR
                 MOV   A,R0
                 MOV   R0_NUM,A
                 MOV   R0,#9
                 ZZZ: MOVX  A,@DPTR
                 LCALL   SENDNUM

⌨️ 快捷键说明

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