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

📄 bcd_hex.asm

📁 本程序为集中抄表系统中低压电力线载波数据采集器程序源代码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;---------------------------
;读帧判断
IS_READ_FRAMES:
                    CJNE    @R0,#01H,READ_BACK_FRAMES        ;是主站请求读数据帧否?
                    LCALL   READ_FRAMES_PROC                 ;请求读数据帧处理
                    SJMP    FRAMES_PROCESS_OVER
READ_BACK_FRAMES:
                    CJNE    @R0,#02H,READ_REPEAT_LAST_FRAMES ;是主站请求读后续数据帧否?
                    LCALL   READ_BACK_FRAMES_PROC            ;读请求读后续数据帧处理
                    SJMP    FRAMES_PROCESS_OVER
READ_REPEAT_LAST_FRAMES:
                    CJNE    @R0,#03H,IS_WRITE_FRAMES         ;是主站请求从站重发上帧数据帧否?
                    LCALL   READ_REPEAT_LAST_FRAMES_PROC     ;主站请求从站重发上帧数据帧处理
                    SJMP    FRAMES_PROCESS_OVER
;---------------------------
;---写数据请求帧判断
IS_WRITE_FRAMES:
                    CJNE    @R0,#04H,IS_GBJS_FRAMES          ;是写数据请求帧否?
                    LCALL   WRITE_FRAMES_PROC                ;写数据请求帧处理
                    SJMP    FRAMES_PROCESS_OVER
;---广播校时帧
IS_GBJS_FRAMES:
                    CJNE    @R0,#08H,IS_GB_READ_CJQ_ADDR     ;是广播校时帧否?
                    JNB     GBJS_OR_ADDR,NOT_GBJS            ;判为广播否?
                    LCALL   GBJS_FRAMES_PROC                 ;广播校时处理
NOT_GBJS:
                    SJMP    FRAMES_PROCESS_OVER
;---广播读采集器地址帧(扩展规约)
IS_GB_READ_CJQ_ADDR:
                    CJNE    @R0,#09H,IS_WRITE_ADDR_FRAMES    ;是广播读采集器地址帧否?
                    JNB     GBJS_OR_ADDR,NOT_GB_READ_CJQ_ADDR;判地址为广播否?
                    LCALL   GB_READ_CJQ_FRAMES_PROC          ;广播读采集器地址处理
NOT_GB_READ_CJQ_ADDR:
                    SJMP    FRAMES_PROCESS_OVER
;---广播写设备地址帧,建立电表与地址映射表
IS_WRITE_ADDR_FRAMES:
                    CJNE    @R0,#0AH,IS_CHANGE_BAUD_FRAMES   ;是写设备地址帧否?
                    JNB     GBJS_OR_ADDR,NOT_GB_ADDR         ;判地址为广播否?
                    LCALL   WRITE_ADDR_PROC                  ;写设备地址(表号)处理
NOT_GB_ADDR:
                    SJMP    FRAMES_PROCESS_OVER
;---更改通信速率帧
IS_CHANGE_BAUD_FRAMES:
                    CJNE    @R0,#0CH,IS_CHANGE_PASSWORD_FRAMES ;是更改通信速率帧否?
                    LCALL   CHANGE_BAUD_PROC                   ;更改通信速率处理
                    SJMP    FRAMES_PROCESS_OVER
;---修改密码帧
IS_CHANGE_PASSWORD_FRAMES:
                    CJNE    @R0,#0FH,IS_CLEAR_MAST_REQUIRE_FRAMES ;是修改密码帧否?
                    LCALL   CHANGE_PASSWORD_PROC                  ;修改密码处理
                    SJMP    FRAMES_PROCESS_OVER
IS_CLEAR_MAST_REQUIRE_FRAMES:
                    CJNE    @R0,#10H,FRAMES_PROCESS_OVER     ;是最大需量清0帧否?
                    LCALL   CLEAR_MAST_REQUIRE_PROC          ;最大需量清0及月转存处理
FRAMES_PROCESS_OVER:
                    LCALL   CLEAR_RECE_SBUF                  ;清接收缓冲
                    RET
;--------------------------------------------------------------------------------------------

;***********************************************************************************************
;-----------------------------------------------------------------------------------------------
;读帧处理程序
;-----------------------------------------------------------------------------------------------
READ_FRAMES_PROC:
                    MOV     R0,#REC_DATA_ID1         ;数据标识DI0
                    MOV     DATA_DI0,@R0             ;暂存到RAM
                    INC     R0                       ;数据标识DI1
                    MOV     DATA_DI1,@R0
;-------------------------------------------------------------------------------------
;数据标识判断
                    MOV     A,DATA_DI1               ;数据标识
;--------------------------------------------------------------------------------------
;#######################################################################################
;                                标准规约部分
;#######################################################################################
;                              读电能量数据编码
;--------------------------------------------------------------------------------------
;读当前有功电量
;脉冲表只有一种电量,不分有/无功,也不分正反向,其电量种类的区分由后台来标注,485表4种电能都有.
;---------------------------------------------------------------------------------------
READ_DQ_YG:
                    JNB     NOT_METER_ID,READ_DQ_YG_START    ;非电表号标志
                    AJMP    READ_VAR_DATA_LAB1
READ_DQ_YG_START:
                    CJNE    A,#90H,READ_DQ_WG                ;判断是当前有功否?
                    MOV     A,DATA_DI0                       ;是当前有功,再判断是正向还是反向
                    ANL     A,#0F0H                          ;屏蔽掉低4位
;当前正向有功:数据标识:DI1:90,DI0:10--------------------------
READ_DQ_ZX_YG:
                    CJNE    A,#10H,READ_DQ_FX_YG                  ;判断是正向有功否
                    LCALL   JUDGE_WHAT_KIND_RAT_OR_VAR            ;判断为何种费率
                    JNB     PULSE_OR_485METER,READ_PULSE_DQ_ZX_YG ;判断是读485表还是脉冲表
                    LCALL   TERMINAL_CONNECT_485METER                 ;采集器与485表通信.
                    JNB     TERMINAL_METER485_CONNECT_OK,FALSE_RETURN1;判断采集终端与485表通信成功否?
                    CLR     TERMINAL_METER485_CONNECT_OK              ;清此标志位
                    LCALL   SEND_ONE_FRAMES_ACK                       ;发送读回应帧到集中器
                    MOV     DPTR,#RS485_CURRENT_ZA_ENERGY             ;485表存贮区当前正向有功首地址
                    LCALL   SAVE_METER485_VAR                         ;通信成功,存储读出的485电表参数
                    LJMP    READ_FRAMES_OVER                          ;结束
FALSE_RETURN1:
                    MOV     DPTR,#RS485_CURRENT_ZA_ENERGY         ;485表存贮区当前正向有功首地址
                    JMP     MAKE_DQ_ZX_YG_FRAMES                  ;把当前485表正向有功形成回应帧发送给集中器
READ_PULSE_DQ_ZX_YG:
                    MOV     DPTR,#PULSE_CURRENT_ENERGY            ;脉冲表当前电量首地址
MAKE_DQ_ZX_YG_FRAMES:
                    LCALL   READ_FRAMES_ACK                       ;读当前正向有功回应帧
DZY_READ_METER485_OVER:
                    LJMP    READ_FRAMES_OVER                      ;回应帧发送完,退出.
;当前反向有功:数据标识:DI1:90,DI0:20-------------------------
READ_DQ_FX_YG:
                    CJNE    A,#20H,READ_DQ_YG_ERR                 ;判断是反向有功否
                    LCALL   JUDGE_WHAT_KIND_RAT_OR_VAR            ;判断为何种费率
                    JNB     PULSE_OR_485METER,READ_PULSE_DQ_FX_YG ;判断是读485表还是脉冲表
                    LCALL   TERMINAL_CONNECT_485METER                 ;采集器与485表通信.
                    JNB     TERMINAL_METER485_CONNECT_OK,FALSE_RETURN2;判断采集终端与485表通信成功否?
                    CLR     TERMINAL_METER485_CONNECT_OK              ;清此标志位
                    LCALL   SEND_ONE_FRAMES_ACK                       ;发送读回应帧到集中器
                    MOV     DPTR,#RS485_CURRENT_FA_ENERGY             ;485表存贮区当前反向有功首地址
                    LCALL   SAVE_METER485_VAR                         ;通信成功,存储读出的485电表参数
                    LJMP    READ_FRAMES_OVER                          ;结束
FALSE_RETURN2:
                    MOV     DPTR,#RS485_CURRENT_FA_ENERGY         ;485表存贮区当前反向有功首地址
                    JMP     MAKE_DQ_FX_YG_FRAMES                  ;把当前485表反向有功形成回应帧发送给集中器
READ_PULSE_DQ_FX_YG:
                    MOV     DPTR,#PULSE_CURRENT_ENERGY            ;脉冲表当前电量首地址
MAKE_DQ_FX_YG_FRAMES:
                    LCALL   READ_FRAMES_ACK                       ;读当前反向有功回应帧
READ_DQ_YG_ERR:
                    LJMP    READ_FRAMES_OVER                      ;标识非法结束帧处理
;------------------------------------
;读当前无功电量
READ_DQ_WG:
                    CJNE    A,#91H,READ_LAST_YG                  ;判断是当前无功否?
                    MOV     A,DATA_DI0                           ;是当前无功,再判断是正向还是反向
                    ANL     A,#0F0H                              ;屏蔽掉低4位
;当前正向无功:数据标识:DI1:91,DI0:10------------------------------
READ_DQ_ZX_WG:
                    CJNE    A,#10H,READ_DQ_FX_WG                 ;判断是正向无功否
                    LCALL   JUDGE_WHAT_KIND_RAT_OR_VAR           ;判断为何种费率
                    JNB     PULSE_OR_485METER,READ_PULSE_DQ_ZX_WG;判断是读485表还是脉冲表
                    LCALL   TERMINAL_CONNECT_485METER                 ;采集器与485表通信.
                    JNB     TERMINAL_METER485_CONNECT_OK,FALSE_RETURN3;判断采集终端与485表通信成功否?
                    CLR     TERMINAL_METER485_CONNECT_OK              ;清此标志位
                    LCALL   SEND_ONE_FRAMES_ACK                       ;发送读回应帧到集中器

⌨️ 快捷键说明

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