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

📄 hwframe.asm

📁 本程序为集中抄表系统中低压电力线载波数据采集器程序源代码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
                RET
;------------------------------
;;读电表常数
READ_METER_RESOLUTION:
                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
		PUSH    B                                 ;第一字节送堆栈区
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	RD_C04_1BYTE
                MOV     R6,B                              ;高位送R6
                POP     B
                MOV     R7,B                              ;低位在R7
                LCALL   HEX_BCD_2BYTES                    ;整数位由16进制转换为十进制数
                MOV     R0,#HW_SEND_DATA_ITEM             ;发送缓冲区数据第1字节
                MOV     A,R5
                ADD     A,#33H
                MOV     @R0,A
                INC     R0
                MOV     A,R4
                ADD     A,#33H
                MOV     @R0,A
                INC     R0
                MOV     A,R3
                ADD     A,#33H
                MOV     @R0,A
                RET
;--------------------------------------
;读电表底数
READ_METER_BOTTOM:
		MOV	A,R7
		DEC	A
		MOV	B,#4                               ;每表底数为4字节
		MUL	AB
		ADD	A,#C04_INIT_VAL_0
		MOV	DPL,A
                MOV	DPH,#C04_ADDR_H
		LCALL	RD_C04_1BYTE
                MOV     A,B
                LCALL   HEX_BCD_1BYTE                                ;小数由16进制数转换为十进制
		ADD     A,#33H                                       ;加33H
		MOV	R0,#HW_SEND_DATA_ITEM
                MOV     @R0,A                                        ;送发送缓冲区数据域
   		INC     DPL                                          ;当前表底数的整数首字节
		MOV	DPH,#C04_ADDR_H                              ;存储器高位
		LCALL	RD_C04_1BYTE
		PUSH    B                                            ;第一字节送堆栈区
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	RD_C04_1BYTE
		PUSH    B                                            ;送第二字节
		MOV	DPH,#C04_ADDR_H
		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
;----------------------------------
;读继电器状态字
HW_READ_JDQ_BYTE:
                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     A,B
                LCALL   HEX_BCD_1BYTE                                ;16进制数转换为十进制
		ADD     A,#33H                                       ;加33H
		MOV	R0,#HW_SEND_DATA_ITEM
                MOV     @R0,A
                RET
;************************************************************************
;-----------------------------------------------
;写请求帧处理
HW_WR_FRM_PROC:
                MOV     R0,#HW_REC_DATA_ID2              ;数据标识2
HW_WR_RESOLUTION:
                CJNE    @R0,#0C0H,HW_WR_BOTTOM           ;判断是写电表常数否?
                MOV     R0,#HW_REC_DATA_ID1              ;数据标识1
                CJNE    @R0,#30H,WR_FRAME_ERR            ;判断是写电表常数否?
                LCALL   WR_METER_RESOLUTION              ;写电表常数
                MOV     R5,#84H                          ;写正常回应标志
                MOV     R6,#00H                          ;数据域长度
                LCALL   FORM_SEND_READ_FRAMES            ;发送回应帧
                RET
HW_WR_BOTTOM:
                CJNE    @R0,#0C1H,HW_WR_ZJQ_ADDR         ;判断是电表底数否?
                MOV     R0,#HW_REC_DATA_ID1              ;数据标识1
                CJNE    @R0,#19H,WR_FRAME_ERR            ;判断是写电表底数否?
                LCALL   WR_METER_BOTTOM                  ;写电表底数
                MOV     R5,#84H                          ;写正常回应标志
                MOV     R6,#00H                          ;数据域长度
                LCALL   FORM_SEND_READ_FRAMES            ;发送回应帧
                RET
HW_WR_ZJQ_ADDR:
                CJNE    @R0,#0E6H,HW_WR_JDQ_STATE        ;判断是写中继器地址否?
                MOV     R0,#HW_REC_DATA_ID1              ;数据标识1
                CJNE    @R0,#01H,WR_FRAME_ERR            ;判断是写中继器地址否?
                LCALL   WR_ZJQ_ADDR                      ;写中继器地址
                MOV     R5,#84H                          ;写正常回应标志
                MOV     R6,#00H                          ;数据域长度
                LCALL   FORM_SEND_READ_FRAMES            ;发送回应帧
                RET                
HW_WR_JDQ_STATE:
                CJNE    @R0,#0E7H,WR_FRAME_ERR           ;判断是写继电器状态字否?
                MOV     R0,#HW_REC_DATA_ID1              ;数据标识1
                CJNE    @R0,#01H,WR_FRAME_ERR            ;判断是写继电器状态字否?
                LCALL   HW_WR_JDQ_BYTE                   ;写继电器状态字
                MOV     R5,#84H                          ;写正常回应标志
                MOV     R6,#00H                          ;数据域长度
                LCALL   FORM_SEND_READ_FRAMES            ;发送回应帧
                RET
WR_FRAME_ERR:
                LJMP    WRITE_FRAMES_ERR_ACK             ;数据标识错误回应
;------------------------------------------------------
;写电表常数
WR_METER_RESOLUTION:
                MOV     R0,#HW_REC_DATA_ITEM
                MOV     A,@R0
                MOV     R6,A                            ;将电表常数低1位存R6
                INC     R0
                MOV     A,@R0
                MOV     R5,A                            ;将电表常数2位存R5
                INC     R0
                MOV     A,@R0
                MOV     R4,A                            ;将电表常数高位存R4
                PUSH    07H                             ;保存当前表通道号
                LCALL   BCD_HEX_3BYTES                  ;电表常数由十进制转换为16进制数
                POP     07H                             ;取出当前表号
		MOV	A,R7
		DEC	A
		MOV	B,#2
		MUL	AB
		ADD	A,#C04_CONSTANT_0
		MOV	DPL,A                           ;计算出当前表电表常数首地址
                MOV	DPH,#C04_ADDR_H
		MOV	B,R6                            ;转换后数据仍在R4R5R6 ,转换后的R4一般情况下为0
		LCALL	WR_C04_1BYTE
		MOV	DPH,#C04_ADDR_H
		INC	DPL
                MOV	B,R5
		LCALL	WR_C04_1BYTE
		MOV	A,R5                            ;写电表分辨率时电表常数放在R4R5
                MOV     R4,A
		MOV	A,R6
                MOV     R5,A
		MOV	DPH,R7                          ;表号暂存DPH
                LCALL   COMPUTE_RESOLUTION              ;写入电表分辨率
                RET
;------------------------------------------------------
;写电表底数
WR_METER_BOTTOM:
                PUSH    07H                             ;保存当前表号
                MOV     R0,#HW_REC_DATA_ITEM
                MOV     A,@R0
                LCALL   BCD_HEX_1BYTE
                MOV     @R0,A                           ;转换后的小数重存回接收缓冲
                INC     R0                              ;整数位
                MOV     A,@R0
                MOV     R6,A                            ;将电表常数低1位存R6
                INC     R0
                MOV     A,@R0
                MOV     R5,A                            ;将电表常数2位存R5
                INC     R0
                MOV     A,@R0
                MOV     R4,A                            ;将电表常数高位存R4
                LCALL   BCD_HEX_3BYTES                  ;电表常数由十进制转换为16进制数
                MOV     A,R4                            ;转换后的值重存回接收缓冲区
                MOV     @R0,A
                DEC     R0
                MOV     A,R5
                MOV     @R0,A
                DEC     R0
                MOV     A,R6
                MOV     @R0,A
;--写表底
                MOV     R0,#HW_REC_DATA_ITEM
                POP     07H                             ;取出当前表号
		MOV	A,R7
		DEC	A
		MOV	B,#4
		MUL	AB
		ADD	A,#C04_INIT_VAL_0                ;表底小数位地址
		MOV	DPL,A
                MOV	DPH,#C04_ADDR_H
                MOV     B,@R0                            ;表底小数弹出到B
		LCALL	WR_C04_1BYTE
                INC     R0                               ;整数低位字节
               	MOV	B,@R0                            ;表底整数第一字节
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	WR_C04_1BYTE
                INC     R0
		MOV	B,@R0
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	WR_C04_1BYTE
		INC     R0
		MOV	B,@R0
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	WR_C04_1BYTE
;改变当前表的当前电量//04-03-24
		MOV	A,R7
		DEC	A
		ADD	A,#RAM_COUNTER_DECIMAL_0                  ;当前电量小数寄存器地址
		MOV	R1,A
                MOV     R0,#HW_REC_DATA_ITEM                      ;接收缓冲区数据首地址
                MOV     A,@R0
	        MOV     @R1,A                                     ;RAM内小数位更新
                MOV     B,A                                       ;存储器内小数位更新
		MOV	DPH,#C04_ADDR_L
		MOV	A,R7
		DEC	A
		ADD	A,#C04_COUNTER_DECIMAL_0                 ;当前电量小数存储器地址
		MOV	DPL,A
		LCALL	WR_C04_1BYTE
;---------------------------
;存储器中当前电量整数位更新
		MOV	A,R7
		DEC	A
		MOV	B,#3
		MUL	AB
		ADD	A,#C04_COUNTER_INTEGER_0                 ;存储器中当前电量整数
		MOV	DPL,A
                MOV	DPH,#C04_ADDR_L
                INC     R0
		MOV	B,@R0
		LCALL	WR_C04_1BYTE
		MOV	DPH,#C04_ADDR_L
                INC     R0
		INC	DPL
                MOV	B,@R0
		LCALL	WR_C04_1BYTE
		MOV	DPH,#C04_ADDR_L
                INC     R0
		INC	DPL
                MOV	B,@R0
		LCALL	WR_C04_1BYTE
                LCALL   CLR_PULSE_AND_OTHER                    ;当前脉冲数,存0.1度电到标志,0.1度电计数器清零
                RET
;-----------------------------------------------------
;写本采集器的中继器地址    
WR_ZJQ_ADDR:
                MOV     R0,#HW_REC_DATA_ITEM
                MOV     A,@R0
                LCALL   BCD_HEX_1BYTE

⌨️ 快捷键说明

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