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

📄 hldmsapp.asm

📁 645规约集中抄表源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
HWENDB2:       LJMP   HWEND
HW9:           MOV    A,SBUF
               MOV    B,A                ; 读取标示符看是否为68H
               JNB    P,PNP2
               JNB    RB8,HWENDB1
               LJMP   HW9A
PNP2:          JB     RB8,HWENDB1
HW9A:           ADD   A,R2
               MOV   R2,A
               MOV   A,B
 HW5A:        MOV  @R0,A
              INC   R0
               MOV   R7,#5                ;; 接收 5 位地址
HW_LOOPB1:      MOV    R3,#02H
HWB2:           MOV    R5,#0C3H           ; 字节之间最大延时500ms
HWB3:           MOV    R6,#0FFH
HWB4:           JBC    RI,HWB5            ; 等待读取一字节地址
               DJNZ   R6,HWB4
               DJNZ   R5,HWB3
               DJNZ   R3,HWB2
HWENDBB:       LJMP   HWEND
HWB5:           MOV    A,SBUF             ; 读取一个地址,与对应的地址进行比较
                MOV    B,A
                JNB    P,PNPB1
                JNB    RB8,HWENDBB
                LJMP   HWB
PNPB1:          JB     RB8,HWENDB2
HWB:            ADD   A,R2
                MOV   R2,A
                MOV   A,B
                MOV   @R0,A
                INC   R0
                DJNZ  R7,HW_LOOPB1
                MOV   A,B
                CJNE   A,#68H,HWENDB2
                MOV   R7,#2
HW_LOOPC1:      MOV    R3,#02H
HWC2:           MOV    R5,#0C3H           ; 字节之间最大延时500ms
HWC3:           MOV    R6,#0FFH
HWC4:           JBC    RI,HWC5            ; 等待读取一字节地址
               DJNZ   R6,HWC4
               DJNZ   R5,HWC3
               DJNZ   R3,HWC2
               LJMP   HWEND
HWC5:           MOV    A,SBUF             ; 读取一个地址,与对应的地址进行比较
                MOV   B,A
                JNB    P,PNPC1
                JNB    RB8,HWENDB2
               AJMP   HWC
PNPC1:          JB     RB8,HWENDB
HWC:           MOV    @R0,A
               INC    R0
               ADD    A,R2
               MOV   R2,A
               DJNZ  R7,HW_LOOPC1
               MOV   R7,B
               CLR    C
               CJNE   R7, #40, WPPP
               AJMP   WPPP1
WPPP:          JNC   HWENDB
WPPP1:         SETB  HWBR_FRAM_ALL
HW_LOOP2B:     CLR    EX0
               MOV    R3,#02H
HW12:          MOV    R5,#0C3H             ; 字节之间最大延时500ms
HW13:          MOV    R6,#0FFH
HW14:          JBC    RI,HW15              ; 等待读取一字节地址
               DJNZ   R6,HW14
               DJNZ   R5,HW13
               DJNZ   R3,HW12
HWENDB:        LJMP   HWEND
HW15:          MOV    A,SBUF
               JNB    P,PNP3
               JNB    RB8,HWENDB
               LJMP   HW15A
PNP3:          JB     RB8,HWENDB
HW15A:         MOV    @R0,A
               ADD    A,R2
               MOV    R2,A
               INC    R0
               DJNZ   R7,HW_LOOP2B

HW_LOOP4:      MOV    R3,#02H
HW42:          MOV    R5,#0C3H                ;字节之间最大延时500ms
HW43:          MOV    R6,#0FFH
HW44:          JBC    RI,HW45
               DJNZ   R6,HW44
               DJNZ   R5,HW43
               DJNZ   R3,HW42
HWENDC:        LJMP   HWEND
HW45:          MOV    A,SBUF             ;
               JNB    P,PNP5
               JNB    RB8,HWENDC
               SJMP   HW45A
PNP5:          JB     RB8,HWENDC
HW45A:         CJNE   A,1AH,HWENDC           ;校验和是否正确
HW_LOOP5:      MOV    R3,#02H                ;接收结束符号16H
HW52:          MOV    R5,#0C0H               ;字节之间最大延时500ms
HW53:          MOV    R6,#0FFH
HW54:          JBC    RI,HW55
               DJNZ   R6,HW54
               DJNZ   R5,HW53
               DJNZ   R3,HW52
               AJMP   HWEND
HW55:          MOV    A,SBUF             ;
               JNB    P,PNP6
               JNB    RB8,HWEND
               AJMP   HW55A
PNP6:          JB     RB8,HWEND
HW55A:         CJNE   A,#16H,HWEND2 ;;HWEND
HWEND2:        SETB   HWR_FRAM_ALL
               CLR  P1.0
               MOV    TH0,#0
               MOV    TL0,#0
HWEND:         POP    B
               POP    PSW
               POP    ACC
               CLR    RI
               SETB   ES             ;开串口中断
               NOP
               NOP
               RETI

;***************************************************************************
;	收发控制程序,由中断1完成,使用寄存器2区
;****************************************************************************
                 NOP
                 NOP
                 NOP
                 SETB   WDI
                 clr  ea
                 ajmp $
TRANCIEVE:      PUSH    PSW
                PUSH    ACC
                PUSH    B

                SETB    PSW.4
                CLR     PSW.3
              	JNB	R_T,trans	;判断是接收还是发射状态,做出相应处理
		ACALL	recieve_data
return_tr_rc:	POP     B
                POP     ACC
                POP     PSW
                NOP
                NOP
                NOP
		RETI
trans:		Acall	trans_begin	;当R_T=0时,转发射
		AJMP	return_tr_rc
;*******************************************************************************
;定时器T0中断,判断转发是否超时
;*******************************************************************************
 ret6:           NOP
                 NOP
                 NOP
                 SETB   WDI
                 clr  ea
                ajmp $
 T_DEAL:        PUSH    PSW
                cpl    wdi
                DJNZ  WAIT_TIME,UNDO1
                CLR    UP_BIT           ;下行转发后一定时间内没收到上行转发帧,不再上行转发
                CLR    DOWN_BIT         ;同时允许处理下行转发
                MOV    WAIT_TIME,#0FFH
   UNDO1:       JB    ZBT_FRAM_ALL,UNDO2 ;载波发送3秒后仍没发完,等待硬复位
                CLR   R_T
                DJNZ   ZB_SEND_TIME,UNDO
                AJMP    ret6
   UNDO2:       setb    r_t
                JB    R_T,UNDO
                AJMP  RET6

    UNDO:       MOV    TH0,#0
                MOV    TL0,#0
                setb   p1.0
                setb   p1.1
                NOP
                NOP
                POP     PSW
                NOP
                NOP
                NOP
		RETI

;*******************************************************************
;485发送子程序
;功能:根据R0指定的数据首址和r2指定的数据个数通过串行口
;     发送数据,最后发送字节为累加校验和
;影响资源:acc,r2,r3,R0
;*******************************************************************
                 NOP
                 NOP
                 NOP
                 SETB   WDI
                 clr  ea
                ajmp $
SENDBYTE:    MOV  C,PSW.0           ;发送1字节子程序
             MOV  TB8,C

             mov  sbuf,a
 senda2:     jbc  ti,senda3           ;等待该字节发送完成
             Ajmp senda2
SENDA3:      NOP
             NOP
             RET

sendDATA:    CLR  ES                 ;禁止串口中断
             CLR    PSW.4
             CLR     PSW.3
             setb    r_t_485
             MOV   R2,#0

Senda1:     mov  a,#0fEH
           ACALL SENDBYTE
           mov  a,#0fEH
           ACALL SENDBYTE
            mov  a,#0fEH
           ACALL SENDBYTE
           mov  a,#068H             ;;  发送帧头 0X68
           MOV   R3, A
           ACALL SENDBYTE
           MOV   A, Addr_DataRE     ;;  发送 A0
           ADD   A, R3              ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE
           ACALL SENDBYTE
           MOV   A, Addr_DataRE+1   ;;  发送 A1
           ADD   A, R3              ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE+1
           ACALL SENDBYTE
           MOV   A, Addr_DataRE+2   ;;  发送 A2
           ADD   A, R3              ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE+2
           ACALL SENDBYTE
           mov   A, Addr_DataRE+3    ;;  发送 A3
           ADD   A, R3               ;; 计算累加和
           MOV   R3, A
           MOV   A,  Addr_DataRE+3
           ACALL SENDBYTE
           mov  a,  Addr_DataRE+4     ;;  发送 A4
           ADD   A, R3                ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE+4
           ACALL SENDBYTE
           mov   A,  Addr_DataRE+5    ;;  发送 A5
           ADD   A,  R3               ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE+5
           ACALL SENDBYTE
           mov  a,#068H               ;;  发送 帧头 0X68
           ADD   A, R3                ;; 计算累加和
           MOV   R3, A
           MOV   A,  #068H
           ACALL SENDBYTE
           mov  a,  Addr_DataRE+7     ;;  发送 命令码 C
           ADD   A, R3                ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE+7
           ACALL SENDBYTE
           mov   A,  Addr_DataRE+8    ;;  发送 长度 L
           ADD   A,  R3               ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE+8
           ACALL SENDBYTE
           MOV   A, Addr_DataRE+8
           MOV   R7,A
           MOV   R0,#Addr_DataRE+9
SENDLOOP:  MOV   A, @R0               ;; 发送 DI0 、DI1
           ADD   A, R3                ;; 计算累加和
           MOV   R3, A
           MOV   A,  @R0
           ACALL SENDBYTE
           INC   R0
           DJNZ  R7, SENDLOOP
           MOV   A, R3                ;; 发送累加和
           ACALL SENDBYTE
           MOV   A,#16H
           ACALL SENDBYTE             ;; 发送完成
           MOV   ADDR_DATARE,  #0
           MOV   ADDR_DATARE+1,#0
           MOV   ADDR_DATARE+2,#0
sendEnd:    CLR  R_T_485
            CLR  P1.1
            MOV    TH0,#0
            MOV    TL0,#0
            setb  ES                  ;串行中断允许
             NOP
             NOP
             RET

;*******************************************************************
;串口红外发送子程序
;功能:根据R0指定的数据首址和r2指定的数据个数通过串行口
;     发送数据,最后发送字节为累加校验和
;影响资源:acc,r2,r3,R0
;*******************************************************************
SENDDATA2:     CLR  ES                 ;禁止串口中断
              PUSH    PSW
              PUSH    ACC
              PUSH    B
              SETB    PSW.4
              SETB    PSW.3
               mov  a,#0fEH
           ACALL SENDBYTE
           mov  a,#0fEH
           ACALL SENDBYTE
            mov  a,#0fEH
           ACALL SENDBYTE
            mov  a,#0fEH
           ACALL SENDBYTE
           mov  a,#068H             ;;  发送帧头 0X68
           MOV   R3, A
           ACALL SENDBYTE
           MOV   A, Addr_DataRE     ;;  发送 A0
           ADD   A, R3              ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE
           ACALL SENDBYTE
           MOV   A, Addr_DataRE+1   ;;  发送 A1
           ADD   A, R3              ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE+1
           ACALL SENDBYTE
           MOV   A, Addr_DataRE+2   ;;  发送 A2
           ADD   A, R3              ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE+2
           ACALL SENDBYTE
           mov   A, Addr_DataRE+3   ;;  发送 A3
           ADD   A, R3              ;; 计算累加和
           MOV   R3, A
           MOV   A,  Addr_DataRE+3
           ACALL SENDBYTE
           mov  a,  Addr_DataRE+4   ;;  发送 A4
           ADD   A, R3              ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE+4
           ACALL SENDBYTE
           mov   A,  Addr_DataRE+5  ;;  发送 A5
           ADD   A,  R3             ;; 计算累加和
           MOV   R3, A
           MOV   A, Addr_DataRE+5
           ACALL SENDBYTE
           mov  a,#068H             ;;  发送 帧头 0X68
           ADD   A, R3              ;; 计算累加和
           MOV   R3, A

⌨️ 快捷键说明

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