modbus2002-1d.asm
来自「自已编写的MODBUS程序」· 汇编 代码 · 共 1,722 行 · 第 1/4 页
ASM
1,722 行
FUNC02_4:
MOV A, 4AH
CJNE A,#03H,FUNC02_5 ;待发回的有效数据长度是3吗?
MOV 4BH, R3 ;3字节处处理,低字节在前。
MOV 4CH, R2
MOV 4DH, R1
MOV R0, #4EH
MOV 22H, #06H
SJMP FUNC02_8
FUNC02_5:
CJNE A,#02H,FUNC02_6 ;待发回的有效数据长度是2吗?
MOV 4BH, R3 ;2字节处理,低字节在前。
MOV 4CH, R2
MOV R0, #4DH
MOV 22H, #05H
SJMP FUNC02_8
FUNC02_6: ;待发回的有效数据长度是1
MOV 4BH, R3 ;1字节处理
MOV R0, #4CH
MOV 22H, #04H ;送待校验数据长度
FUNC02_8:
MOV 48H, 30H ;送返回的从机地址
MOV 49H, 31H ;送返回的功能码
MOV 20H, #48H ;送待校验数据首地址
LCALL CRC ;进行CRC校验
MOV @R0, 23H ;存校验数据低位
INC R0
MOV @R0, 24H ;存校验数据高位
MOV A, 4AH ;取发送回总线数据长度
ADD A, #05H
MOV LONG_S_BUS,A ;送发送总线数据长度
LJMP EXIT ;发送及标志位处理
;---------------------****功能F03处理程序****----------------------
FUNC03_1:
LJMP ERROR_TREAT
FUNCTION03:
LCALL OVER_FLOW ;判断地址,长度是否溢出.
JB SHUJU_Z_ERR,FUNC03_1 ;数据错误?
JB DIZHI_Z_ERR,FUNC03_1 ;地址错误?
;SJMP FUNC03_COMM_END
;---------------------****与CPU通讯,读输出寄存器****--------------
FUNC03_COMM:
MOV A,33H
MOV R3,35H
CJNE A,#00H,FUNC03_COMM_B ;读阀位寄存器
MOV LONG_S_CPU,#01H
MOV LONG_R_CPU,#03H
MOV 50H,#07H ;命令=07H
; MOV DIZHI_R_CPU,#8EH
LCALL COMM_CPU
JNB TONGXUN_CPU_ERR,FUNC03_COMM_A
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC03_COMM_A:
MOV R0,#8EH ;存取阀位设定
MOV @R0,5AH ;CPU数据高位在后。
INC R0
MOV @R0,59H ;CPU数据低位在前。
DJNZ R3,FUNC03_COMM_B1
AJMP FUNC03_COMM_END
FUNC03_COMM_B:
MOV A,33H
CJNE A,#01H,FUNC03_COMM_D
FUNC03_COMM_B1: ;读灵敏度处理。
MOV LONG_S_CPU,#01H
MOV LONG_R_CPU,#02H ;形成接受长度
MOV 50H,#08H ;命令=08H
; MOV DIZHI_R_CPU,#90H
LCALL COMM_CPU
JNB TONGXUN_CPU_ERR,FUNC03_COMM_C
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC03_COMM_C:
MOV R0,#90H ;存取灵敏度
MOV @R0,59H ;低位不变,为主机写入值。
; INC R0
; MOV @R0,#00H
DJNZ R3,FUNC03_COMM_D1
AJMP FUNC03_COMM_END
FUNC03_COMM_D:
MOV A,33H
CJNE A,#02H,FUNC03_COMM_F
FUNC03_COMM_D1: ;读禁止动作时间。
MOV LONG_S_CPU,#01H
MOV LONG_R_CPU,#02H ;形成接受长度
MOV 50H,#09H ;命令=09H
; MOV DIZHI_R_CPU,#92H
LCALL COMM_CPU
JNB TONGXUN_CPU_ERR,FUNC03_COMM_E
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC03_COMM_E:
MOV R0,#92H ;存取禁止动作时间
MOV @R0,59H ;低位不变,为主机写入值。
; INC R0
; MOV @R0,#00H
DJNZ R3,FUNC03_COMM_F1
AJMP FUNC03_COMM_END
FUNC03_COMM_F:
MOV A,33H
CJNE A,#03H,FUNC03_COMM_H
FUNC03_COMM_F1: ;读低信阀位。
MOV LONG_S_CPU,#01H
MOV LONG_R_CPU,#03H ;形成接受长度
MOV 50H,#0AH ;命令=0AH
; MOV DIZHI_R_CPU,#94H
LCALL COMM_CPU
JNB TONGXUN_CPU_ERR,FUNC03_COMM_G
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC03_COMM_G:
MOV R0,#94H ;存取低信阀位
MOV @R0,5AH ;CPU数据高位在后
INC R0
MOV @R0,59H ;CPU数据低位在前
DJNZ R3,FUNC03_COMM_H1
AJMP FUNC03_COMM_END
FUNC03_COMM_H:
MOV A,33H
CJNE A,#04H,FUNC03_COMM_END
FUNC03_COMM_H1:
MOV LONG_S_CPU,#01H ;读高信阀位。
MOV LONG_R_CPU,#03H ;形成接受长度
MOV 50H,#0BH ;命令=0BH
; MOV DIZHI_R_CPU,#96H
LCALL COMM_CPU
JNB TONGXUN_CPU_ERR,FUNC03_COMM_I
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC03_COMM_I:
MOV R0,#96H ;存取高信阀位
MOV @R0,5AH ;CPU数据高位在后
INC R0
MOV @R0,59H ;CPU数据低位在前
;----------------****功能F03与主板通讯结束****---------------------
FUNC03_COMM_END:
MOV 48H, 30H ;送地址
MOV 49H, 31H ;送功能码
MOV A, 35H
ADD A, 35H
MOV 4AH, A
MOV R7, A
MOV A, 33H
ADD A, 33H
ADD A, #8EH ;计算阀位寄存器高位地址
MOV R0, A ;源数据首址
MOV R1, #4BH ;目的首址
FUNC03_2:MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R7,FUNC03_2
MOV 20H, #48H ;送CRC校验首地址
MOV A, 4AH ;计算校验数据长度
ADD A, #03H
MOV 22H, A
LCALL CRC ;进行CRC校验(使用RAM01区)
MOV @R1, 23H ;存校验结果低位
INC R1
MOV @R1, 24H ;存校验结果高位
MOV A, 4AH ;计算发送总线数据长度
ADD A, #05H
MOV LONG_S_BUS,A
LJMP EXIT ;转处理
;-------------------****F04功能处理程序****---------------------
FUNC04_0:
LJMP ERROR_TREAT
FUNCTION04:
LCALL OVER_FLOW ;判断地址,长度是否溢出.
JB SHUJU_Z_ERR,FUNC04_0 ;数据错误?
JB DIZHI_Z_ERR,FUNC04_0 ;地址错误?
;SJMP FUNC04_COMM_END
;----------------****功能F04与主板通讯开始****------------------
MOV A,33H
CJNE A,#00H,FUNC04_COMM_B
MOV 50H,#05H ;命令=05H.
MOV LONG_S_CPU,#01H ;读扭矩反馈
MOV LONG_R_CPU,#03H
; MOV DIZHI_R_CPU,#88H
LCALL COMM_CPU
JNB TONGXUN_CPU_ERR,FUNC04_COMM_A
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC04_COMM_A:
MOV R0,#88H ;存取扭矩
MOV @R0,5AH ;CPU数据高位在后
INC R0
MOV @R0,59H ;CPU数据低位在前
MOV A,35H
CJNE A,#02H,FUNC04_COMM_END
FUNC04_COMM_B:
MOV 50H,#06H ;命令=06H.
MOV LONG_S_CPU,#01H ;读阀位反馈
MOV LONG_R_CPU,#03H
; MOV DIZHI_R_CPU,#8AH
LCALL COMM_CPU
JNB TONGXUN_CPU_ERR,FUNC04_COMM_C
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC04_COMM_C:
MOV R0,#8AH ;存阀位
MOV @R0,5AH ;CPU数据高位在后
INC R0
MOV @R0,59H ;CPU数据低位在前
;-----------****功能F04与主板通讯结束****--------------
FUNC04_COMM_END:
MOV 48H, 30H ;送地址
MOV 49H, 31H ;送功能码
MOV A, 35H
ADD A, 35H
MOV 4AH, A
MOV R7, A ;暂存
MOV A, 33H
ADD A, 33H
ADD A, #88H
MOV R0, A
MOV R1, #4BH
FUNC04_1:
MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R7,FUNC04_1
MOV A, 4AH
ADD A, #03H
MOV 22H, A
MOV 20H, #48H
LCALL CRC ;进行CRC校验
MOV @R1, 23H ;存校验结果低位
INC R1
MOV @R1, 24H ;存校验结果高位
MOV A, 4AH
ADD A, #05H
MOV LONG_S_BUS,A
LJMP EXIT
;-----------------****F05功能处理程序****-------------
FUNCTION05:
MOV A, 32H
JNZ FUNC05_ERR_A ;地址溢出,转处理
MOV A, 33H ;地址溢出?
CLR C
SUBB A, #08H
JNC FUNC05_ERR_A ;地址溢出,转处理
JNB GUANGBO,FUNC05_2 ;是广播地址吗?
MOV R7, 33H
CJNE R7,#01H,FUNC05_1 ;禁止对关闭位广播操作
SJMP FUNC05_ERR_1
FUNC05_1:
CJNE R7,#02H,FUNC05_2 ;禁止对打开位广播操作
SJMP FUNC05_ERR_1
FUNC05_2:
MOV A, 33H
MOV B, #01H
JZ FUNC05_4 ;起始地址为0 ?
MOV R7, A
MOV A, #01
FUNC05_3:
CLR C ;C=0
RLC A
DJNZ R7, FUNC05_3
MOV B, A
FUNC05_4:
MOV R7, 35H
CJNE R7,#00H,FUNC05_ERR_B ;是非法数据吗?
MOV R0, #81H
MOV R7, 34H
CJNE R7,#00H,FUNC05_5 ;是非法数据吗?
MOV A, B ;无效处理
CPL A
ANL A, @R0
MOV @R0, A
SJMP FUNC05_6_A
FUNC05_5:
CJNE R7,#0FFH,FUNC05_ERR_B ;数据有效吗?
FUNC05_6:
MOV A, B
ORL A, @R0
MOV @R0, A
FUNC05_6_A:
;SJMP FUNC05_COMM_END
;-------------****功能F05与主板通讯开始****-----------
FUNC05_COMM: ;与CPU通讯,写输出线圈
MOV LONG_S_CPU,#02H
MOV LONG_R_CPU,#02H
MOV 50H,#11H ;命令=11H.
MOV R1,#81H
MOV 51H,@R1
; MOV DIZHI_R_CPU,#0F0H ;无数据存取地址.
LCALL COMM_CPU ;
JNB TONGXUN_CPU_ERR,FUNC05_COMM_END
MOV 4AH,#04H
LJMP ERROR_TREAT
;------------****功能F05与主板通讯结束****-----------
FUNC05_COMM_END:
JB GUANGBO,FUNC05_7 ;是广播吗?
MOV LONG_S_BUS,#08H
SETB MODE17
LJMP EXIT
FUNC05_7:
CLR GUANGBO
LJMP MAKE_END
FUNC05_ERR_1:
CLR GUANGBO
FUNC05_ERR_A:
SETB DIZHI_Z_ERR ;置地址溢出标志
LJMP ERROR_TREAT
FUNC05_ERR_B:
SETB SHUJU_Z_ERR ;置非法数据标志
LJMP ERROR_TREAT
;---------------****F06功能处理程序****-------------------
FUNCTION06:
MOV A, 32H
CJNE A,#00H,FUNC05_ERR_A ;地址溢出?.
MOV A, 33H
CLR C
SUBB A, #05H
JNC FUNC05_ERR_A
MOV R0, #8EH ;计算存数据首地址
MOV A, 33H
ADD A, 33H
ADD A, R0
MOV R0, A
MOV @R0, 34H ;存高位数据
INC R0
MOV @R0, 35H ;存低位数据
;SJMP FUNC06_COMM_END ;与CPU通讯,写单个数据。
;------------****功能F06与主板通讯开始****----------------
FUNC06_COMM:
MOV R3,33H
CJNE R3,#00H,FUNC06_COMM_B
MOV LONG_S_CPU,#03H ;单写阀位寄存器
MOV LONG_R_CPU,#03H
MOV 50H,#12H ;命令=12H.
MOV R0,#8EH
MOV 52H,@R0 ;CPU数据高位在后
INC R0
MOV 51H,@R0 ;CPU数据低位在前
LCALL COMM_CPU
JB TONGXUN_CPU_ERR,FUNC06_COMM_A
AJMP FUNC06_COMM_END
FUNC06_COMM_A:
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC06_COMM_B:
CJNE R3,#01H,FUNC06_COMM_D
MOV LONG_S_CPU,#02H ;单写灵敏度
MOV LONG_R_CPU,#02H
MOV 50H,#13H ;命令=13H.
MOV R0,#90H
MOV 51H,@R0
LCALL COMM_CPU
JB TONGXUN_CPU_ERR,FUNC06_COMM_C
AJMP FUNC06_COMM_END
FUNC06_COMM_C:
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC06_COMM_D:
CJNE R3,#02H,FUNC06_COMM_F
MOV LONG_S_CPU,#02H ;单写禁止动作时间
MOV LONG_R_CPU,#02H
MOV 50H,#14H ;命令=14H.
MOV R0,#92H
MOV 51H,@R0
LCALL COMM_CPU
JB TONGXUN_CPU_ERR,FUNC06_COMM_E
AJMP FUNC06_COMM_END
FUNC06_COMM_E:
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC06_COMM_F:
CJNE R3,#03H,FUNC06_COMM_H
MOV LONG_S_CPU,#03H ;单写低信阀位
MOV LONG_R_CPU,#03H
MOV 50H,#15H ;命令=15H.
MOV R0,#94H
MOV 52H,@R0 ;CPU数据高位在后
INC R0
MOV 51H,@R0 ;CPU数据低位在前
LCALL COMM_CPU
JB TONGXUN_CPU_ERR,FUNC06_COMM_G
AJMP FUNC06_COMM_END
FUNC06_COMM_G:
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC06_COMM_H:
CJNE R3,#04H,FUNC06_COMM_END
MOV LONG_S_CPU,#03H ;单写高信阀位
MOV LONG_R_CPU,#03H
MOV 50H,#16H ;命令=16H.
MOV R0,#96H
MOV 52H,@R0 ;CPU数据高位在后
INC R0
MOV 51H,@R0 ;CPU数据低位在前
LCALL COMM_CPU
JB TONGXUN_CPU_ERR,FUNC06_COMM_I
AJMP FUNC06_COMM_END
FUNC06_COMM_I:
MOV 4AH,#04H
LJMP ERROR_TREAT
;------------****功能F06与主板通讯结束****-----------------
FUNC06_COMM_END:
MOV LONG_S_BUS,#08H ;送发送总线数据长度
SETB MODE17
LJMP EXIT
;----------------****F07功能处理程序****--------------------
FUNCTION07:
;SJMP FUNC07_COMM_END ;与CPU通讯,读特殊状态
;------------****功能F07与主板通讯开始****------------------
FUNC07_COMM:
MOV LONG_S_CPU,#01H
MOV LONG_R_CPU,#02H ;#04H/04H
MOV 50H,#0DH ;命令=0DH/04H.
; MOV DIZHI_R_CPU,#86H
LCALL COMM_CPU
JNB TONGXUN_CPU_ERR,FUNC07_COMM_OVER
MOV 4AH,#04H
LJMP ERROR_TREAT
FUNC07_COMM_OVER: ;存取特殊状态数据
MOV R0,#87H
MOV @R0,59H ;5BH(04H)
;------------****功能F07与主板通讯结束****---------------
FUNC07_COMM_END:
MOV 48H, 30H ;送地址
MOV 49H, 31H ;送功能码
MOV R0, #87H
MOV 4AH, @R0
MOV 20H, #48H ;送CRC入口数据
MOV 22H, #03H
LCALL CRC
MOV 4BH, 23H ;送CRC_L
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?