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 + -
显示快捷键?