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

📄 hwframe.asm

📁 本程序为集中抄表系统中低压电力线载波数据采集器程序源代码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;------------------------------------------------------
;红外通信帧处理程序
;判断接收的表号是否是本采集器号,若不是,清HW_FRM_PROCESS
;采集器地址:R4R5R6(高--低),R7(表通道号1--16)
;------------------------------------------------------
HWFRM_PROCESS_PROC:
                LCALL   JUDGE_REC_TERMINAL_ID                           ;采集器地址判断是否合法
                JB      HW_FRM_PROCESS,ADDR_IS_RIGHT                    ;地址合法,进行帧处理
                LJMP    HW_FRM_PROCESS_OVER                             ;不合法,不进行帧处理,清
ADDR_IS_RIGHT:
                MOV     A,R6                                            ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_1),HW_FRM_PROCESS_2          ;表1地址低位
		MOV     A,R5                                            ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_1),HW_FRM_PROCESS_2         ;表1地址高位
		MOV	R7,#1                                           ;表通道号
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_2:
        	MOV     A,R6                                            ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_2),HW_FRM_PROCESS_3          ;表2地址低位
		MOV     A,R5                                            ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_2),HW_FRM_PROCESS_3         ;表2地址高位
		MOV	R7,#2
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_3:
        	MOV     A,R6                                            ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_3),HW_FRM_PROCESS_4          ;表3地址低位
		MOV     A,R5                                            ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_3),HW_FRM_PROCESS_4         ;表3地址高位
		MOV	R7,#3
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_4:
        	MOV     A,R6                                            ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_4),HW_FRM_PROCESS_5          ;表4地址低位
		MOV     A,R5                                            ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_4),HW_FRM_PROCESS_5         ;表4地址高位
		MOV	R7,#4
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_5:
        	MOV     A,R6                                            ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_5),HW_FRM_PROCESS_6          ;表5地址低位
		MOV     A,R5                                            ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_5),HW_FRM_PROCESS_6         ;表5地址高位
		MOV	R7,#5
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_6:
        	MOV     A,R6                                            ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_6),HW_FRM_PROCESS_7          ;表6地址低位
		MOV     A,R5                                            ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_6),HW_FRM_PROCESS_7         ;表6地址高位
		MOV	R7,#6
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_7:
        	MOV     A,R6                                            ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_7),HW_FRM_PROCESS_8          ;表7地址低位
		MOV     A,R5                                            ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_7),HW_FRM_PROCESS_8         ;表7地址高位
		MOV	R7,#7
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_8:
        	MOV     A,R6                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_8),HW_FRM_PROCESS_9 ;表8地址低位
		MOV     A,R5                                   ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_8),HW_FRM_PROCESS_9;表8地址高位
		MOV	R7,#8
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_9:
         	MOV     A,R6                                    ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_9),HW_FRM_PROCESS_10 ;表9地址低位
		MOV     A,R5                                    ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_9),HW_FRM_PROCESS_10;表9地址高位
		MOV	R7,#9
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_10:
        	MOV     A,R6                                     ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_10),HW_FRM_PROCESS_11 ;表10地址低位
		MOV     A,R5                                     ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_10),HW_FRM_PROCESS_11;表10地址高位
		MOV	R7,#10
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_11:
        	MOV     A,R6                                     ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_11),HW_FRM_PROCESS_12 ;表11地址低位
		MOV     A,R5                                     ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_11),HW_FRM_PROCESS_12;表11地址高位
		MOV	R7,#11
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_12:
        	MOV     A,R6                                     ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_12),HW_FRM_PROCESS_13 ;表12地址低位
		MOV     A,R5                                     ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_12),HW_FRM_PROCESS_13;表12地址高位
		MOV	R7,#12
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_13:
        	MOV     A,R6                                     ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_13),HW_FRM_PROCESS_14 ;表13地址低位
		MOV     A,R5                                     ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_13),HW_FRM_PROCESS_14;表13地址高位
		MOV	R7,#13
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_14:
        	MOV     A,R6                                     ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_14),HW_FRM_PROCESS_15 ;表14地址低位
		MOV     A,R5                                     ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_14),HW_FRM_PROCESS_15;表14地址高位
		MOV	R7,#14
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_15:
         	MOV     A,R6                                     ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_15),HW_FRM_PROCESS_16 ;表15地址低位
		MOV     A,R5                                     ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_15),HW_FRM_PROCESS_16;表15地址高位
		MOV	R7,#15
		LJMP	HW_IS_THIS_ID
HW_FRM_PROCESS_16:
        	MOV     A,R6                                       ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_16),HW_FRM_PROCESS_OVER ;表16地址低位
		MOV     A,R5                                       ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_16),HW_FRM_PROCESS_OVER;表16地址高位
		MOV	R7,#16
;---------------------------------------------------
;地址正确,进行控制码判断
HW_IS_THIS_ID:
                LCALL   DATA_SUBB_33H                                   ;接收缓冲区数据域数据减33H子程序
                MOV     R0,#HW_REC_CTRL_CODE                            ;读入控制码
                CJNE    @R0,#01H,HW_IS_WR_FRM                           ;是读请求帧?
                LCALL   HW_RD_FRM_PROC                                  ;读请求帧
                LJMP    HW_FRM_PROCESS_OVER
HW_IS_WR_FRM:
                CJNE    @R0,#04H,HW_FRM_PROCESS_OVER                    ;是写请求帧?
                LCALL   HW_WR_FRM_PROC                                  ;写请求帧处理
HW_FRM_PROCESS_OVER:
                MOV     HW_REC_CUR_LEN,#00H                             ;当前帧长度清0
                MOV     R0,#HW_REC_BUF                                  ;清接收缓冲
                MOV     B,#HW_REC_BUF_LEN
HW_CLR_REC_FRM1:
                MOV     @R0,#00H
                INC     R0
                DJNZ    B,HW_CLR_REC_FRM1
                CLR     HW_CONTRA                                        ;红外接收状态
                CLR     HW_FRM_PROCESS
                SETB    S_LEDR                                           ;红外接收灯灭
                SETB    R_LEDR                                           ;红外发送灯灭
                RET
;-----------------------------------------------
;读请求帧处理
;-----------------------------------------------
HW_RD_FRM_PROC:
;读当前电量,走标准规约标识#90H#10H或数据块#0FFH#0E3H
                MOV     R0,#HW_REC_DATA_ID2          ;数据标识2
                CJNE    @R0,#90H,OTHER_DATA_CAD      ;#94H,#10H判断是读当前电量否?
                MOV     R0,#HW_REC_DATA_ID1          ;数据标识1
                CJNE    @R0,#10H,READ_FRAME_ERR      ;判断是读正向有功电量否?
                AJMP    READ_OUT_DQDL
OTHER_DATA_CAD:                
                CJNE    @R0,#0E3H,HW_READ_LAST_MONTH ;#0E3H,#0FFH判断是读当前电量块否?
                MOV     R0,#HW_REC_DATA_ID1          ;数据标识1
                CJNE    @R0,#0FFH,READ_FRAME_ERR     ;判断是读正向有功电量否?
READ_OUT_DQDL:
                LCALL   READ_FRAME_DL               ;读取当前电量
                MOV     R5,#81H                     ;读正常回应标志
                MOV     R6,#06H                     ;数据域长度
                LCALL   FORM_SEND_READ_FRAMES       ;发送回应帧
                RET
                
HW_READ_LAST_MONTH:
                CJNE    @R0,#0E2H,HW_READ_LAST_LAST_MONTH ;#94H,#10H判断是读上月电量否?
                MOV     R0,#HW_REC_DATA_ID1               ;数据标识1
                CJNE    @R0,#0FFH,READ_FRAME_ERR          ;判断是读正向有功电量否?
                LCALL   READ_LAST_MONTH_DL               ;读取上月电量
                MOV     R5,#81H                          ;读正常回应标志
                MOV     R6,#06H                          ;数据域长度
                LCALL   FORM_SEND_READ_FRAMES            ;发送回应帧
                RET
HW_READ_LAST_LAST_MONTH:
                CJNE    @R0,#98H,HW_READ_RESOLUTION      ;判断是读上上月电量否?
                MOV     R0,#HW_REC_DATA_ID1              ;数据标识1
                CJNE    @R0,#10H,READ_FRAME_ERR          ;判断是读正向有功电量否?
                LCALL   READ_LAST_LAST_MONTH_DL          ;读取上上月电量
                MOV     R5,#81H                          ;读正常回应标志
                MOV     R6,#06H                          ;数据域长度
                LCALL   FORM_SEND_READ_FRAMES            ;发送回应帧
                RET
HW_READ_RESOLUTION:
                CJNE    @R0,#0C0H,HW_READ_BOTTOM         ;判断是电表常数否?
                MOV     R0,#HW_REC_DATA_ID1              ;数据标识1
                CJNE    @R0,#30H,READ_FRAME_ERR          ;判断是读电表常数否?
                LCALL   READ_METER_RESOLUTION            ;读电表常数
                MOV     R5,#81H                          ;读正常回应标志
                MOV     R6,#05H                          ;数据域长度
                LCALL   FORM_SEND_READ_FRAMES            ;发送回应帧
                RET
HW_READ_BOTTOM:
                CJNE    @R0,#0C1H,HW_READ_JDQ_STATE      ;判断是电表底数否?
                MOV     R0,#HW_REC_DATA_ID1              ;数据标识1
                CJNE    @R0,#19H,READ_FRAME_ERR          ;判断是读电表底数否?
                LCALL   READ_METER_BOTTOM                ;读电表底数
                MOV     R5,#81H                          ;读正常回应标志
                MOV     R6,#06H                          ;数据域长度
                LCALL   FORM_SEND_READ_FRAMES            ;发送回应帧
                RET
HW_READ_JDQ_STATE:
                CJNE    @R0,#0E7H,READ_FRAME_ERR         ;判断是读继电器状态字否?
                MOV     R0,#HW_REC_DATA_ID1              ;数据标识1
                CJNE    @R0,#01H,READ_FRAME_ERR          ;判断是读继电器状态字否?
                LCALL   HW_READ_JDQ_BYTE                 ;读继电器状态字
                MOV     R5,#81H                          ;读正常回应标志
                MOV     R6,#03H                          ;数据域长度
                LCALL   FORM_SEND_READ_FRAMES            ;发送回应帧
                RET
READ_FRAME_ERR:
                LJMP    READ_FRAMES_ERR_ACK
;--------------------------------------------------
;读取当前电量
READ_FRAME_DL:
                MOV	A,R7
		DEC	A
		ADD	A,#RAM_COUNTER_DECIMAL_0                     ;小数部分从CPU内寄存器读取
                MOV	R0,A                                         ;当前表小数位地址
                MOV     A,@R0                                        ;取出小数值
                LCALL   HEX_BCD_1BYTE                                ;小数由16进制数转换为十进制
		ADD     A,#33H                                       ;加33H
		MOV	R0,#HW_SEND_DATA_ITEM
                MOV     @R0,A                                        ;送发送缓冲区数据域
   		MOV	A,R7
		DEC	A
		MOV	B,#3
		MUL	AB
		ADD	A,#C04_COUNTER_INTEGER_0                   ;当前表当前电量的整数首字节
		MOV	DPL,A
                MOV	DPH,#C04_ADDR_L                            ;存储器低位
		LCALL	RD_C04_1BYTE
		PUSH    B                                          ;第一字节送堆栈区
		MOV	DPH,#C04_ADDR_L
		INC	DPL
		LCALL	RD_C04_1BYTE
		PUSH    B                                      ;送第二字节
		MOV	DPH,#C04_ADDR_L
		INC	DPL
		LCALL	RD_C04_1BYTE
		MOV     R4,B                                    ;高位送R4
                POP     B
                MOV     R5,B
                POP     B
                MOV     R6,B
                LCALL   HEX_BCD_3BYTES                            ;整数位由16进制转换为十进制数
                MOV     R0,#HW_SEND_DATA_ITEM+1                   ;发送缓冲区数据第2字节
                MOV     A,R3
                ADD     A,#33H
                MOV     @R0,A
                INC     R0
                MOV     A,R2
                ADD     A,#33H
                MOV     @R0,A
                INC     R0
                MOV     A,R1
                ADD     A,#33H
                MOV     @R0,A
                RET
;---------------------------
;读取上月电量
READ_LAST_MONTH_DL:


                RET
;---------------------------
;读取上上月电量
READ_LAST_LAST_MONTH_DL:


⌨️ 快捷键说明

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