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

📄 hldmsapp.asm

📁 645规约集中抄表源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:

WDI		    EQU	     P1.5          ;
ROM_SCL		    EQU	     P1.6
ROM_SDA		    EQU	     P1.7          ;
R_T		    EQU	     P1.4
RXD_TXD		    EQU	     P1.3
ROM_WP		    EQU	     P3.5
R_T_485	            EQU	     P3.4
R_485               EQU      P3.7          ;控制CD4052

;定义保存于2404中数据的地址
Addr1_sno           EQU       00H        ;表号1的地址
ADDR_SNONUM         EQU       0BH       ;表号数量
ADDR_SNONUMXX       EQU       0CH       ; 是否设置电表标志
ADDR_SNONUMYY       EQU       1CH
ADDR2_sno           EQU       10H        ;表号2的地址
Addr3_Sno           EQU       20H       ;表号3的地址
Addr4_sno           EQU       30H        ;表号4的地址
ADDR5_sno           EQU       40H        ;表号5的地址
Addr6_Sno           EQU       50H       ;表号6的地址
Addr7_sno           EQU       60H        ;表号7的地址
ADDR8_sno           EQU       70H        ;表号8的地址
Addr9_Sno           EQU       80H       ;表号9的地址
Addr10_sno          EQU       90H       ;表号10的地址
ADDR11_sno          EQU       0A0H       ;表号11的地址
Addr12_Sno          EQU       0B0H      ;表号12的地址
Addr13_sno          EQU       0C0H       ;表号13的地址
ADDR14_sno          EQU       0D0H       ;表号14的地址
Addr15_Sno          EQU       0E0H      ;表号15的地址
Addr16_Sno          EQU       0F0H      ;表号16的地址
;定义保存于RAM中的数据的地址
SNO_NUM             EQU        7FH        ;收到的表号在2402中排列的序号
Addr_DataTR         EQU        38H
Addr_DataTRB        EQU        4AH
Addr_DataTRA        EQU        5AH
Addr_DataRE         EQU        38H         ;红外或载波接收到数据的首地址,共26字节
HW_COM              EQU        3FH         ;红外接收到的控制码C
ZB_COM              EQU        38H         ;载波接收到的控制码C
SADD                EQU        60H         ;校验和
SBS                 EQU        68H         ;计数
UPPER_ADDR_L        EQU        7BH         ;上位机地址
UPPER_ADDR_M        EQU        7CH
UPPER_ADDR_H        EQU        7DH
WAIT_TIME           EQU        0FH
ZB_SEND_TIME        EQU        7aH

;可寻址的位空间
HWBR_FRAM_ALL       EQU        00H
E99_BIT             EQU        01H
ZBR_FRAM_ALL        EQU        02H        ;载波数据接收完毕标志
ZBT_FRAM_ALL        EQU        03H        ;载波数据发送完毕标志
HWR_FRAM_ALL        EQU        04H
HWT_FRAM_ALL        EQU        05H
BS1_BIT             EQU        06H
BS2_BIT             EQU        07H


T_NOR_BIT	    EQU	       08H	   ;发送普通数据标志
BS3_BIT	            EQU	       09H         ;载波通信中1字节发送或接收完毕标志
RELAY_BIT           EQU        0AH
EEP_BIT             EQU        0BH
UP_BIT              EQU        0CH          ;上行转发接收到标志
DOWN_BIT            EQU        0DH          ;=0下行转发允许,收到一次下行转发后还没转发或等待时间不到,不再进行下行转发
WR_BIT              EQU        0EH          ;=1允许写
hwr1_fram_all       equ        0fh          ;
;22H用于载波接收标志
SYN_BIT             EQU        10H         ;
B1S_BIT             EQU        11H
B2S_BIT             EQU        12H
ADDR_BIT            EQU        13H
CL_BIT              EQU        14H
DATA_BIT            EQU        15H
CSL_BIT             EQU        16H
CSH_BIT             EQU        17H
;H_INT               EQU        18H          ; 红外有接收标志

WR1_COM		    EQU	       0A0H        ;24c02 写命令字
RD1_COM		    EQU        0A1H        ;24c02 读命令字


;**********************************************************

;**********************************************************
;入口地址定义
        org  0000h              ;主循环程序入口
        ljmp start
        org  0003h              ;载波int1中断程序入口
        ljmp TRANCIEVE
        nop
        nop
        reti

        org  000bh              ;定时器t0中断
        LJMP  T_DEAL
        nop
        nop
        nop
        reti
        org  0013h

        nop
        nop
        nop
        nop
        reti
        org  001bh              ;定时器t1中断保护(用串行通信)
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        reti
        org  0023h              ;长检中断(串行中断)程序入口
        ljmp HW                 ;使用寄存器3区
        nop
        nop
        nop
        nop
        reti

;********************************************************************************************
;主程序
;初始化模块
;*********************************************************************************************

               ORG    0030h
 START:        CLR   P1.0
               CLR   P1.1
               SETB   ROM_WP
               CLR    EA
               MOV    SP,#25H
               MOV   P1,#0FFH
               MOV   P3,#0FFH
               CLR   PSW.3
               CLR   PSW.4
clrin:         MOV    R0,#0
               MOV    A,#0
XHX:           MOV    @R0,A
               NOP
               INC     R0
               NOP
               cjne    R0,#00h,XHX
               MOV    R5,  #02H
XHX3:          MOV    R7, #0FEH
XHX2:          MOV    R6, #0FEH
XHX1:          CLR    WDI
               NOP
               NOP
               NOP
               SETB   WDI
               DJNZ   R6, XHX1
               DJNZ   R7,XHX2
               DJNZ   R5,XHX3
COMM1:
               MOV    WAIT_TIME,#0FFH
               MOV    TL1, #0D7H          ;晶振9.6MHZ,通信波特率1200bps
               MOV    TH1, #0D7H
               setb   R_T                ;载波中断处于接收
               MOV    TMOD,#21h          ;t1工作于方式2,T0工作于方式1
               MOV    PCON,#80h          ;smod=1
               MOV    SCON,#0D0h         ;串行口工作于方式3,带奇偶校验位
               SETB   ZBT_FRAM_ALL
               MOV    SP,#25H
;YES_OK:
              CLR   P1.0
              CLR   P1.1
              MOV   TH0,#00
              MOV   TL0,#00

;循环程序
 MAIN_LOOP:
                          ;部分设置重复初始化
              SETB   ROM_WP
              MOV    IP,#07h            ;int0int1T0为高级,串口中断低级中断
              SETB   IT0                ;载波中断(int1)沿触发
              SETB   EX0                ;载波中断允许
              ;setb   R_T
              SETB   TR1                ;允许t1计数
              SETB   TR0                ;允许t0计数
              CLR    RI                 ;清接收中断标志
              SETB   EA                 ;开中断
              SETB   ET0                ;T0中断允许
              setb   rxd
              setb   txd
              CLR    R_T_485             ;485接收状态
              clr   psw.3
              clr   psw.4
	      clr   hwr1_fram_all
	      JNB    ZBT_FRAM_ALL,MAIN_LOOPa
	      setb   ES                 ;串行中断允许
MAIN_LOOPa:   MOV    A,SCON
              CJNE  A,#11010000B,REG1       ;部分设置重复初始化
              AJMP   REG1
REG1:         MOV  SCON,#0D0H
REG2:         MOV   A,PCON
              CJNE  A,#10000000B,REG3
              AJMP  REG4
REG3:         MOV  PCON,#80H
REG4:         MOV  A,TMOD
              CJNE  A,#00100001B,REG5
              AJMP  REG6
REG5:         MOV  TMOD,#21H
REG6:         MOV   A,TH1
              CJNE  A,#0D7H,REG7
              AJMP  MAIN_LOOP1
REG7:         MOV   TH1,#0D7H


MAIN_LOOP1:   CLR   HWR1_FRAM_ALL                ;  红外有接收标志hwr1_fram_all
              SETB   R_485                       ;; CD4052重恢复
              SETB   P3.3                        ;; 设置键重恢复
             ; CLR    H_INT                       ;  红外有接收标志
              clr     wr_bit                     ;; 循环清写允许标志位
              MOV   C,P3.3
              JNC   MAX_1                        ; 强制允许为0时 亮灯
              SETB  P1.1
              SJMP  MAX_2
MAX_1:        CLR   P1.1
MAX_2:        JNB   HWR_FRAM_ALL,MAIN_LOOP2
              JNB  HWBR_FRAM_ALL,MAIN_LOOP2      ;红外接收完毕
              clr  hwbr_fram_all
              clr  hwr_fram_all
              SETB HWR1_FRAM_ALL
              CLR   EX0
              CLR   ES
              ACALL  HW_DEAL
             ; CLR   H_INT                       ;  红外有接收标志
              clr  hwbr_fram_all
              clr  hwr_fram_all
              CLR   HWR1_FRAM_ALL
              SETB  EX0
              SETB  ES
  MAIN_LOOP2: JNB  ZBR_FRAM_ALL,MAIN_LOOP
              clr zbr_fram_all                  ;载波接收完毕
              CLR   EX0
              CLR   ES
              AJMP ZB_DEAL

;红外通信处理模块
RETEND:       RET
HW_DEAL :       CLR  E99_BIT
                MOV   24H,ADDR_DATARE+9           ;; 保存 D0
                MOV  7EH,ADDR_DATARE+10           ;; 保存 D1
                MOV   DPL,ADDR_DATARE             ;; 保存 A0
                MOV   DPH,ADDR_DATARE+1           ;; 保存 A1
                MOV   23H,ADDR_DATARE+2           ;; 保存 A2
                MOV   ADDR_DATARE-3,ADDR_DATARE+3 ;; 保存 A3
                MOV   ADDR_DATARE-2,ADDR_DATARE+4 ;; 保存 A4
                MOV   ADDR_DATARE-1,ADDR_DATARE+5 ;; 保存 A5
                MOV   R2,#6
                MOV   R0,#ADDR_DATARE
CMP1:           MOV   A,@R0
                INC   R0
                CJNE  A,#99H,CMP     ;地址为广播地址吗?不为,判断是否为本抄表器地址
                DJNZ  R2,CMP1
                MOV   A, HW_COM
                SETB  E99_BIT
                AJMP  HW_DEAL_R
CMP:            clr  hwbr_fram_all
                clr  hwr_fram_all
                LCALL  ADDR_CMP               ;; 比较地址
                JNC    HW_DEAL_R             ;地址不符,不处理
                 RET
HW_BSCOM:       LCALL  AD_BS1                ;通过485抄表子程序
                CLR   ES
                RET
RDBS_ERRORA:    MOV   ADDR_DATATRB+2,#08H
                MOV   ADDR_DATATRB,#0C1H
                AJMP   WRBS_ERROR1A
RDSY1:          AJMP   RDSY
RDBS_ERROR2:    AJMP   RDBS_ERROR1
HW_DEAL_R:      MOV    A,HW_COM                  ;读命令字
RDATA:          CJNE   A,#04H,RDATA1             ;=04H,请求写数据
                LJMP   WDATA
RDATA1:         CJNE   A,#01H,RDBS_ERROR2        ;=01H,请求读数据
                MOV    A,7EH                    ;读数据项标识高位
                CJNE   A,#0F3H,JMPNN
                MOV    A, ADDR_DATARE+8
                CJNE   A, #2,   JMPLL4
                MOV    A, 24H
                CJNE   A,#65H, JMPLL4
                LJMP   RDXXX
JMPNN:          CJNE   A,#0C3H,JMPLL2            ;; 90H + 33H 当前
                AJMP   JMPLL1
JMPLL2:         CJNE   A,#0C7H,JMPLL3            ;; 94H + 33H 上月
                AJMP   JMPLL1
JMPLL3:         CJNE   A,#0CBH, JMPLL4  ;RDSY1            ;; 98H + 33H 上上月
                AJMP   JMPLL1
JMPLL4:         MOV    A,7EH
                CJNE   A,#0F3H, RDBS_ERRORAXX  ;RDSY1
                AJMP   RDSNO_NUM
JMPLL1:         LCALL   HW_BSCOM
  ;;  // 抄表返回处理
                JNB   HWR_FRAM_ALL,RDBS_ERRORAXX
                CLR   HWR_FRAM_ALL
                MOV   A, ADDR_DATARE+7
                CJNE   A,#81H,RDC1
                MOV    A, ADDR_DATARE
                CLR    C
                SUBB   A, DPL
                JNZ    RDBS_ERRORAXX     ; A0不等 转移
                MOV    A, ADDR_DATARE+1
                CLR    C
                SUBB   A, DPH
                JNZ    RDBS_ERRORAXX     ; A1不等 转移
                MOV    A, ADDR_DATARE+2
                CLR    C
                SUBB   A, 23H
                JNZ    RDBS_ERRORAXX     ; A2不等 转移
                MOV   A,   ADDR_DATARE+10
                CJNE  A,   #0C3H,  RLMP1
                AJMP  RLMP3
RLMP1:          CJNE  A,   #0C7H,  RLMP2
RLMP3:
;                MOV   R0,  #ADDR_DATARE+15
;                MOV   R1,  #ADDR_DATARE+19
;                MOV   R7,  #12
;RLMP4:          MOV   A,   @R1
;                MOV   @R0, A
;                INC   R0
;                INC   R1
;                DJNZ  R7,  RLMP4
;                MOV   A, ADDR_DATARE+8
;                CLR   C
;                SUBB  A, #4
;                MOV   ADDR_DATARE+8, A
RLMP2:         LCALL SENDDATA2
                RET
RDC1:          CJNE   A,#0C1H,RDBS_ERRORAXX
                MOV   ADDR_DATARE,  DPL   ;; 加入表号
                MOV   ADDR_DATARE+1,DPH
                MOV   ADDR_DATARE+2,23H
                MOV   ADDR_DATARE+3,ADDR_DATARE-3
                MOV   ADDR_DATARE+4,ADDR_DATARE-2
                MOV   ADDR_DATARE+5,ADDR_DATARE-1
                LCALL SENDDATA2
                RET
RDBS_ERRORAXX:  MOV   ADDR_DATARE,  DPL   ;; 加入表号
                MOV   ADDR_DATARE+1,DPH
                MOV   ADDR_DATARE+2,23H
                MOV   ADDR_DATARE+3,ADDR_DATARE-3
                MOV   ADDR_DATARE+4,ADDR_DATARE-2
                MOV   ADDR_DATARE+5,ADDR_DATARE-1
                MOV   ADDR_DATARE+7, #0C1H
                MOV   ADDR_DATARE+8, #01H
                MOV   ADDR_DATARE+9, #34H
                LCALL SENDDATA2

⌨️ 快捷键说明

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