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

📄 zbframe.bak

📁 本程序为集中抄表系统中低压电力线载波数据采集器程序源代码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
;--入口:R7(通道号1-16)
;--------------------------------------
WR_FRM_PROC:    MOV     A,REC_DATA_ID
WR_ID_1:        CJNE    A,#02H,WR_ID_2                               ;写电表常数
 		MOV	DPH,#C04_ADDR_H
		MOV	A,R7
		DEC	A
		MOV	B,#2
		MUL	AB
		ADD	A,#C04_CONSTANT_0
		MOV	DPL,A
		MOV	B,REC_DATA_ITEM
		LCALL	WR_C04_1BYTE
		MOV	B,REC_DATA_ITEM+1
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	WR_C04_1BYTE
		MOV	R5,REC_DATA_ITEM
		MOV	R4,REC_DATA_ITEM+1
		MOV	DPH,R7
                LCALL   COMPUTE_RESOLUTION                           ;写入电表分辨率
		LJMP	WR_ID_EXIT
WR_ID_2:        CJNE    A,#03H,WR_ID_20                              ;写电表底数
		SJMP	WR_ID_21
WR_ID_20:	LJMP	WR_ID_3
WR_ID_21:
		MOV	DPH,#C04_ADDR_H
		MOV	A,R7
		DEC	A
		MOV	B,#4
		MUL	AB
		ADD	A,#C04_INIT_VAL_0                           ;表底小数位地址
		MOV	DPL,A
		MOV	B,REC_DATA_ITEM                             ;表底小数
		LCALL	WR_C04_1BYTE
		MOV	B,REC_DATA_ITEM+1                           ;表底整数第一字节
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	WR_C04_1BYTE
		MOV	B,REC_DATA_ITEM+2
		MOV	DPH,#C04_ADDR_H
		INC	DPL
		LCALL	WR_C04_1BYTE
		MOV	B,REC_DATA_ITEM+3
		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	R0,A
		MOV	@R0,REC_DATA_ITEM
		MOV	B,REC_DATA_ITEM
		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
		MOV	B,REC_DATA_ITEM+1
		LCALL	WR_C04_1BYTE
		MOV	B,REC_DATA_ITEM+2
		MOV	DPH,#C04_ADDR_L
		INC	DPL
		LCALL	WR_C04_1BYTE
		MOV	B,REC_DATA_ITEM+3
		MOV	DPH,#C04_ADDR_L
		INC	DPL
		LCALL	WR_C04_1BYTE
                LCALL   CLR_PULSE_AND_OTHER                    ;当前脉冲数,存0.1度电到标志,0.1度电计数器清零
		LJMP	WR_ID_EXIT
WR_ID_3:
                CJNE    A,#07H,WR_FRM_OVER
                MOV     A,REC_DATA_ITEM                   ;存当前表的继电器状态字
                CJNE    A,#00H,JUDGE_JDQ01
                AJMP    WRITE_JDQSTATE
JUDGE_JDQ01:
                CJNE    A,#01H,WR_FRM_OVER
WRITE_JDQSTATE:
                LCALL   JUDGE_JDQ_STATE_BYTE              ;发送当前所有继电器状态字
                MOV	DPH,#C04_ADDR_H                   ;状态合法,存储当前状态字
		MOV	A,R7
		DEC	A
		ADD	A,#C04_RELAY_STATE_0              ;得出当前表的继电器状态字的地址
		MOV	DPL,A
		MOV	B,REC_DATA_ITEM                   ;存当前表的继电器状态字
		LCALL	WR_C04_1BYTE
WR_ID_EXIT:
		MOV	SEND_CTRL_CODE,#02H
		MOV	SEND_DATA_FEILD_LEN,#03H
		MOV	SEND_DATA_METER,#00H
		MOV	SEND_DATA_METER+1,#00H
		LCALL   PRODUCE_SUM_END
                SETB    R_LEDC                             ;接收灯灭
                CLR     S_LEDC			           ;发送指示亮
                LCALL   SEND_FRM                           ;发送写应答帧
WR_FRM_OVER:    RET
;------------------------------------------------
;当前脉冲数,存0.1度电到标志,0.1度电计数器清零
CLR_PULSE_AND_OTHER:
           	MOV	A,R7
		DEC	A
		ADD	A,#RAM_PULSES1_0
		MOV	R0,A
		MOV	@R0,#00H
		MOV	B,#0
		MOV	DPH,#C04_ADDR_L
		MOV	A,R7
		DEC	A
		ADD	A,#C04_PULSES1_0              ;脉冲数清零
		MOV	DPL,A
		LCALL	WR_C04_1BYTE
		MOV	A,R7
		DEC	A
		ADD	A,#RAM_0DOT01_COUNTER_0
		MOV	R0,A
		MOV	@R0,#00H
		MOV	B,#0
		MOV	DPH,#C04_ADDR_L
		MOV	A,R7
		DEC	A
		ADD	A,#C04_0DOT01_COUNTER_0           ;存0.1度电到标志清零
		MOV	DPL,A
		LCALL	WR_C04_1BYTE
		MOV	A,R7
		DEC	A
		ADD	A,#RAM_TO_0DOT1_FLAG_0
		MOV	R0,A
		MOV	@R0,#00H
		MOV	B,#0
		MOV	DPH,#C04_ADDR_L
		MOV	A,R7
		DEC	A
		ADD	A,#C04_TO_0DOT1_FLAG_0            ;0.1度电计数器清零
		MOV	DPL,A
		LCALL	WR_C04_1BYTE
                RET
;--------------------------------------
;产生和校验和帧尾
;-------------------------------------
PRODUCE_SUM_END:MOV     R0,#SEND_DATA_FEILD_LEN
                MOV     A,@R0
                ADD     A,#05H
                MOV     B,A
                MOV     R0,#SEND_BUF
                MOV     A,#00
PRODUCE_SUM_END1:ADD    A,@R0
                INC     R0
                DJNZ    B,PRODUCE_SUM_END1
                MOV     @R0,A                                        ;存和校验
                INC     R0
                MOV     @R0,#16H
                RET
;--------------------------------------
;发送帧
;------------------------------------
SEND_FRM:
		CPL     WATCH_DOG                       ;清看门狗
                CLR     ZB_HW                           ;串行口置载波收发状态
                SETB    RX_TX                           ;转换为发送状态前至少要保持高电平3微秒
                NOP
                NOP
                NOP
                NOP
                CLR     RX_TX                           ;ST7536为发送状态
                LCALL   WAIT_5ms                        ;等待5ms
		MOV     COUNTER_SEND_DELAY,#30H		;ST7536置为发送态后,必须等待几个同步信号后,才能发送
	        JNB     TXD_READY_FLAG,$                ;等待发送准备好标志
                MOV     SEND_WHOLE_BYTE,#0AAH		;发送唤醒帧系统地址低位0AAH
		LCALL   SEND_ONE_BYTE
                MOV     SEND_WHOLE_BYTE,#0AAH		;发送唤醒帧系统地址高位字节0AAH
		LCALL   SEND_ONE_BYTE
;ajmp  aaaa
                MOV     A,SEND_DATA_FEILD_LEN           ;发送帧
                ADD     A,#07H                          ;待发送帧的总长度
                MOV     B,A
                MOV     R0,#SEND_BUF
SEND_FRM1:      MOV     SEND_WHOLE_BYTE,@R0	        ;当前字节连续发送3次
                LCALL   SEND_ONE_BYTE
                MOV     SEND_WHOLE_BYTE,@R0	        ;第2次
                LCALL   SEND_ONE_BYTE
                MOV     SEND_WHOLE_BYTE,@R0	        ;第3次
                LCALL   SEND_ONE_BYTE
           ;     LCALL   WAIT_FOR_1ms                    ;发送两个数据间隔1毫秒以便接收方进行数据处理
                INC     R0                              ;下一字节
                DJNZ    B,SEND_FRM1
            	MOV     SEND_WHOLE_BYTE,#16H		;发完全帧后,必须随便发一个字节,否则帧的最后一个字节可能接收不对
		LCALL   SEND_ONE_BYTE
                LCALL   WAIT_5ms                        ;等待5ms
aaaa:
                SETB	S_LEDC			        ;发送指示灭
                SETB    RX_TX				;ST7536为接收状态
		CLR     TXD_READY_FLAG			;清发送准备好标志
                CLR     SEND_BYTE_OVER			;清发送完整字节标志
         ;       SETB    ZB_HW                           ;串行口置红外收发状态

                RET
;;;;;;;;;;;;;;;;;;;;;
;发送一个字节       ;
;入口A:待发送的字节 ;
SEND_ONE_BYTE:
		CLR     SEND_BYTE_OVER			;清字节发送完成标志
                CPL     WATCH_DOG
SEND_ONE_BYTE1:
                NOP
                NOP
                JNB     SEND_BYTE_OVER,SEND_ONE_BYTE1    ;等待发送字节8位发送完
        	CPL     WATCH_DOG
                RET

⌨️ 快捷键说明

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