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

📄 timing.asm

📁 本程序使用STC单片机控制
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;--------------------------------------------------------------------------
;
;               TIMING--定时开关控制器程序
;                           V1.0
;软件说明:
;此软件是V1.0版本2006-07-12
;
;  
;
;--------------------------------------------------------------------------
;联网地址(0--FF)
;地址=0FFH 为广播地址,地址=0 ~ 0FEH 为单机地址
LW_ADDR   EQU   1
;--------------------------------------------------------------------------
;变量定义表
;------------------------寄存器定义----------------------------------------
RHOUR     DATA  28H                ;当前小时寄存器,以BCD形式
RMINUTE   DATA  29H                ;当前分钟寄存器,以BCD形式
TMSG      DATA  2AH                ;当前时段寄存器,以BCD形式
TEST_H    DATA  30H                ;小时缓冲
TEST_M		DATA  31H                ;分钟缓冲
;--------------------------------------------------------------------------

;------------------------标志位定义----------------------------------------
ONOFF_FLG  EQU   00H 
;---------------------------------------------------------------------------
;------------------------地址常量定义---------------------------------------
SD_ADDR     EQU   0010H                ;时段表存储开始地址,外部RAM
MAXTEG      EQU   000FH                ;最大时段值存储地址,外部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                    ;时段表中单个时段结构的长度
;
;
;信号引脚定义
DOG       EQU   P3.5                   ;
ONOFF     EQU   P1.0                   ;=1 关  =0  开
TIME      EQU   P3.4                   ;=0 DS12887片选有效
;
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

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
            MOV A,#03H
            MOVX @DPTR,A
            INC DPTR                   ;清时
            MOV A,#07H
            MOVX @DPTR,A
            INC DPTR
            MOV A,#00H
            MOVX @DPTR,A
            INC DPTR                   ;清周
            MOV A,#01H
            MOVX @DPTR,A
            INC DPTR                   ;清日
            MOVX @DPTR,A
            INC DPTR                   ;清月
            MOVX @DPTR,A
            MOV DPTR,#000AH           ;以BCD码计时,允许报警中断
            MOV A,#0A0H                ;设为010允许保留时间
            MOVX @DPTR,A
            MOV DPTR,#000CH
            MOVX A,@DPTR
            INC DPTR
            MOVX A,@DPTR
            MOV DPTR,#000BH
            MOV A,#22H                  ;B寄存器SET位置0,12887正常运行,
            MOVX @DPTR,A
            CPL DOG
;
;将时段方案表装入存储器(62256)
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,#MAXTEG               ;最大时段值存储地址
            MOV         A,#SDXZ3                   ;当前最大时段设为"10"
            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,更新数据.
               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                  ;
;------------------------------------------------------------
				
;判断当前最大时段是多少,存入62256        
               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

⌨️ 快捷键说明

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