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

📄 zbframe.asm

📁 本程序为集中抄表系统中低压电力线载波数据采集器程序源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;------------------------------------------------------
;载波通信帧处理程序
;判断接收的表号是否是本采集器号,若不是,清FRM_PROCESS
;------------------------------------------------------
FRM_PROCESS_PROC:
                MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID),FRM_PROCESS_1            ;判断是采集器地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID),FRM_PROCESS_1           ;是采集器地址,要通过本采集器作为中继器抄表
		MOV	R7,#0                                        ;不含表通道号
		LCALL	REPEATER_FRM_PROCESS                         ;转中继抄表程序
                RET
FRM_PROCESS_1:
                MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_1),FRM_PROCESS_2          ;判断是表1地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_1),FRM_PROCESS_2
		MOV	R7,#1
		LJMP	IS_THIS_ID
FRM_PROCESS_2:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_2),FRM_PROCESS_3          ;判断是表2地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_2),FRM_PROCESS_3
		MOV	R7,#2
		LJMP	IS_THIS_ID
FRM_PROCESS_3:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_3),FRM_PROCESS_4          ;判断是表3地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_3),FRM_PROCESS_4
		MOV	R7,#3
		LJMP	IS_THIS_ID
FRM_PROCESS_4:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_4),FRM_PROCESS_5          ;判断是表4地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_4),FRM_PROCESS_5
		MOV	R7,#4
		LJMP	IS_THIS_ID
FRM_PROCESS_5:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_5),FRM_PROCESS_6          ;判断是表5地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_5),FRM_PROCESS_6
		MOV	R7,#5
		LJMP	IS_THIS_ID
FRM_PROCESS_6:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_6),FRM_PROCESS_7          ;判断是表6地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_6),FRM_PROCESS_7
		MOV	R7,#6
		LJMP	IS_THIS_ID
FRM_PROCESS_7:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_7),FRM_PROCESS_8          ;判断是表7地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_7),FRM_PROCESS_8
		MOV	R7,#7
		LJMP	IS_THIS_ID
FRM_PROCESS_8:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_8),FRM_PROCESS_9          ;判断是表8地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_8),FRM_PROCESS_9
		MOV	R7,#8
		LJMP	IS_THIS_ID
FRM_PROCESS_9:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_9),FRM_PROCESS_10         ;判断是表9地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_9),FRM_PROCESS_10
		MOV	R7,#9
		LJMP	IS_THIS_ID
FRM_PROCESS_10:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_10),FRM_PROCESS_11        ;判断是表10地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_10),FRM_PROCESS_11
		MOV	R7,#10
		LJMP	IS_THIS_ID
FRM_PROCESS_11:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_11),FRM_PROCESS_12        ;判断是表11地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_11),FRM_PROCESS_12
		MOV	R7,#11
		LJMP	IS_THIS_ID
FRM_PROCESS_12:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_12),FRM_PROCESS_13        ;判断是表12地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_12),FRM_PROCESS_13
		MOV	R7,#12
		LJMP	IS_THIS_ID
FRM_PROCESS_13:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_13),FRM_PROCESS_14        ;判断是表13地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_13),FRM_PROCESS_14
		MOV	R7,#13
		LJMP	IS_THIS_ID
FRM_PROCESS_14:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_14),FRM_PROCESS_15        ;判断是表14地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_14),FRM_PROCESS_15
		MOV	R7,#14
		LJMP	IS_THIS_ID
FRM_PROCESS_15:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_15),FRM_PROCESS_16        ;判断是表15地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_15),FRM_PROCESS_16
		MOV	R7,#15
		LJMP	IS_THIS_ID
FRM_PROCESS_16:	MOV     A,REC_ADDR                                   ;接收到的地址低位
		CJNE    A,#LOW(TERMINAL_ID_16),FRM_PROCESS_OVER      ;判断是表16地址否?
		MOV     A,REC_ADDR+1                                 ;接收到的地址高位
		CJNE    A,#HIGH(TERMINAL_ID_16),FRM_PROCESS_OVER
		MOV	R7,#16
IS_THIS_ID:     MOV     A,REC_CTRL_CODE                              ;读入控制码
                CJNE    A,#01H,IS_RD_FRM                             ;是写请求帧?
                LCALL   WR_FRM_PROC                                  ;写请求帧
                SJMP    FRM_PROCESS_OVER
IS_RD_FRM:      CJNE    A,#06H,FRM_PROCESS_OVER                      ;是读请求帧?
                LCALL   RD_FRM_PROC                                  ;请求帧处理
FRM_PROCESS_OVER:
                MOV     REC_CUR_LEN,#00H                             ;当前帧长度清0
                MOV     R0,#REC_BUF                                  ;清接收缓冲
                MOV     B,#REC_BUF_LEN
CLR_REC_FRM1:   MOV     @R0,#00H
                INC     R0
                DJNZ    B,CLR_REC_FRM1
                SETB    RX_TX                                          ;ST7536接收状态
                SETB    RXD
                CLR     FRM_PROCESS
                RET
;--------------------------------------
;读帧处理程序
;--------------------------------------
RD_FRM_PROC:    MOV     A,REC_DATA_ID
RD_ID_2:        CJNE    A,#02H,RD_ID_3                               ;读电表常数
		MOV	SEND_DATA_FEILD_LEN,#5
        	MOV	DPH,#C04_ADDR_H
		MOV	A,R7
		DEC	A
		MOV	B,#2
		MUL	AB
		ADD	A,#C04_CONSTANT_0
		MOV	DPL,A
		LCALL	RD_C04_1BYTE
		MOV	SEND_DATA_ITEM,B
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	RD_C04_1BYTE
		MOV	SEND_DATA_ITEM+1,B
        	AJMP	RD_ID_EXIT

RD_ID_3:        CJNE    A,#03H,RD_ID_4                    ;读电表底数
                MOV	SEND_DATA_FEILD_LEN,#7
           	MOV	DPH,#C04_ADDR_H
		MOV	A,R7
		DEC	A
		MOV	B,#4                               ;每表底数为4字节
		MUL	AB
		ADD	A,#C04_INIT_VAL_0
		MOV	DPL,A
		LCALL	RD_C04_1BYTE
		MOV	SEND_DATA_ITEM,B
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	RD_C04_1BYTE
		MOV	SEND_DATA_ITEM+1,B
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	RD_C04_1BYTE
		MOV	SEND_DATA_ITEM+2,B
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	RD_C04_1BYTE
		MOV	SEND_DATA_ITEM+3,B
        	AJMP	RD_ID_EXIT
;2004-3-23,tjd修改内容:读当前电量改从FM24C04内读,节省出CPU内RAM
RD_ID_4:        CJNE    A,#04H,RD_ID_5                               ;读本月电能
                MOV	SEND_DATA_FEILD_LEN,#7                       ;数据域长度7字节
         	MOV	A,R7
		DEC	A
		ADD	A,#RAM_COUNTER_DECIMAL_0                     ;小数部分从CPU内寄存器读取
		MOV	R0,A
		MOV	SEND_DATA_ITEM,@R0
   		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
		MOV	SEND_DATA_ITEM+1,B                         ;第一字节送发送缓冲区
		MOV	DPH,#C04_ADDR_L
		INC	DPL
		LCALL	RD_C04_1BYTE
		MOV	SEND_DATA_ITEM+2,B                         ;送第二字节
		MOV	DPH,#C04_ADDR_L
		INC	DPL
		LCALL	RD_C04_1BYTE
		MOV	SEND_DATA_ITEM+3,B    		           ;送第三字节
		AJMP	RD_ID_EXIT

RD_ID_5:        CJNE    A,#07H,RD_FRM_OVER                           ;读继电器状态
                MOV	A,R7                                         ;当前表号
		DEC	A                                            ;得出通道号
                ADD     A,#C04_RELAY_STATE_0                         ;得出当前表的继电器状态字的地址
                MOV	DPL,A
                MOV	DPH,#C04_ADDR_H                              ;FM24C04高位控制字
		LCALL	RD_C04_1BYTE
		MOV	SEND_DATA_ITEM,B                             ;将当前表的继电器状态字送发送缓冲区
                MOV	SEND_DATA_FEILD_LEN,#4                       ;数据域长度为4字节

RD_ID_EXIT:	MOV	SEND_CTRL_CODE,#07H
		MOV	SEND_DATA_METER,#00H
		MOV	SEND_DATA_METER+1,#00H
		LCALL   PRODUCE_SUM_END
                SETB    R_LEDC                                       ;接收灯灭
                CLR     S_LEDC			                     ;发送指示亮
                LCALL   SEND_FRM                                     ;发送写应答帧
RD_FRM_OVER:	RET
;--------------------------------------

⌨️ 快捷键说明

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