modbus2002-1d.asm

来自「自已编写的MODBUS程序」· 汇编 代码 · 共 1,722 行 · 第 1/4 页

ASM
1,722
字号
	MOV	4CH,	24H		;送CRC_H
	MOV	LONG_S_BUS,#05H		;送发送总线数据长度
	LJMP	EXIT
;-----------------****F08功能处理程序****------------------	
FUNCTION08:		
	MOV	R7,	32H
	CJNE	R7,#00H,FUNC08_ERRA	;非法数据?
	MOV	R7,	33H
	CJNE	R7,#11H,FUNC08_1
	JB	GUANGBO,FUNC08_EXIT	;广播出口	
	MOV	A,	34H	 	;子功能17处理
	ADD	A,	35H
	JNZ	FUNC08_ERRA		;非法数据?
	MOV	R0,	#4CH		;存数首址
	MOV	R1,	#98H		;取数首址
	AJMP	FUNC08_1A
FUNC08_1:
	CJNE	R7,#0BH,FUNC08_2
	JB	GUANGBO,FUNC08_EXIT	;广播出口	
	MOV	A,	34H		;子功能11处理
	ADD	A,	35H
	JNZ	FUNC08_ERRA		;非法数据?
	MOV	R0,	#4CH		;存数首址
	MOV	R1,	#9AH		;取数首址	
FUNC08_1A:
	MOV	A,	@R1		;存数高位
	MOV	@R0,	A
	INC	R0
	INC	R1
	MOV	A,	@R1
	MOV	@R0,	A		;存数低位
	AJMP	FUNC08_SEND		;正常发送
FUNC08_2:
	CJNE	R7,#0AH,FUNC08_3
	MOV	A,	34H		;子功能10处理
	ADD	A,	35H
	JNZ	FUNC08_ERRA
	MOV	2DH,	#00H		;清诊断寄存器
	MOV	2FH,	#00H
	MOV	R0,	#98H		;和计数
	MOV	R1,	#04H
FUNC08_2A:
	MOV	@R0,	#00H			
	INC	R0
	DJNZ	R1,	FUNC08_2A
	MOV	R0,	#0A0H
	MOV	@R0,	#00
	INC	R0
	MOV	@R0,	#00
	AJMP	FUNC08_6A		;按原数返回
FUNC08_3:
	CJNE	R7,#04H,FUNC08_4
	MOV	A,	34H		;子功能04处理
	ADD	A,	35H
	JNZ	FUNC08_ERRA
	SETB	ZHITING_MODE
FUNC08_EXIT:
	LJMP	EXIT2			;转出口3,不回送
FUNC08_ERRA:
	MOV	4AH,	#03H		;非法数据
	LJMP	ERROR_TREAT
FUNC08_4:
	CJNE	R7,#02H,FUNC08_5
	JB	GUANGBO,FUNC08_EXIT	;广播出口
	MOV	A,	34H		;子功能02处理
	ADD	A,	35H
	JNZ	FUNC08_ERRA
;SJMP	FUNC08_COMM_END		;与CPU通讯,读诊断寄存器。	
;--------------****功能F08与主板通讯开始****-------------		
FUNC08_COMM:
	MOV	LONG_S_CPU,#01H
	MOV	LONG_R_CPU,#02H
	MOV	50H,#0CH		;命令=0CH.	
;	MOV	DIZHI_R_CPU,#0A0H
	LCALL	COMM_CPU
	JNB	TONGXUN_CPU_ERR,FUNC08_COMM_OVER
	MOV	4AH,#04H
	LJMP	ERROR_TREAT
FUNC08_COMM_OVER:			;存取诊断寄存器数据
	MOV	R0,#0A1H
	MOV	@R0,59H
;----------****功能F08与主板通讯结束****------------------	
FUNC08_COMM_END:
	MOV	R0,	#0A1H		
	MOV	4CH,	@R0		;CPU诊断寄存器
	MOV	4DH,	2DH		;本卡诊断寄存器
	AJMP	FUNC08_SEND		;正常发送
FUNC08_5:				
	CJNE	R7,#01H,FUNC08_6
	JNB	ZHITING_MODE,FUNC08_5A	;子功能01处理
FUNC08_5_0:
	CLR	ZHITING_MODE
	LJMP	EXIT2			;转出口3,不回送
FUNC08_5A:
	MOV	A,	35H
	JNZ	FUNC08_ERRA
	MOV	A,	34H
	JZ	FUNC08_5C
	CJNE	A,#0FFH,FUNC08_ERRA
	MOV	R0,	#98H
	MOV	R1,	#04H
FUNC08_5B:		
	MOV	@R0,	#00H
	INC	R0
	DJNZ	R1,	FUNC08_5B
FUNC08_5C:
	CLR	ZHITING_MODE
	AJMP	FUNC08_6A		;按原数返回
;	MOV	4CH,	34H
;	MOV	4DH,	35H	
FUNC08_SEND:
	MOV	48H,	30H
	MOV	49H,	31H
	MOV	4AH,	32H
	MOV	4BH,	33H
	MOV	20H,	#48H		
	MOV	22H,	#06H
	LCALL	CRC
	MOV	4EH,	23H
	MOV	4FH,	24H
	MOV	LONG_S_BUS,#08H
	LJMP	EXIT
FUNC08_6:
	CJNE	R7,#00H,ERROR		;子功能00处理	
	JB	GUANGBO,EXIT2		;广播出口	
FUNC08_6A:
	SETB	MODE17			
	MOV	LONG_S_BUS,#08H		;送发送总线数据长度
	LJMP	EXIT			;正常退出

;-------------****功能码错误处理程序****-------------------
ERROR:		
	MOV	4AH,	#01H
;------********处理数据出错处理服务程序区***********-------
ERROR_TREAT:
	MOV	48H,	30H		;送返回地址
	MOV	A,	31H		;计算错误信息反馈码
	ADD	A,	#80H		
	MOV	49H,	A		
	JB	DIZHI_Z_ERR,ERR_TREAT1	;地址溢出?
	JB	SHUJU_Z_ERR,ERR_TREAT2	;数据错误?
EXIT1:	MOV	20H,	#48H		;送CRC校验数据首地址
	MOV	22H,	#03H		;送校验数据长度	
	LCALL	CRC			;进行CRC校验
	MOV	4BH,	23H		;送校验低位
	MOV	4CH,	24H		;送校验高位
	MOV	LONG_S_BUS,#05H		;送发送总线数据长度
EXIT:	LCALL	SEND_BUS		;准备发送
EXIT2:	CLR	MANG			;清忙标志
	MOV	2FH,	#00H		;清总线通讯诊断寄存器
	CLR 	GUANGBO
	LJMP	MAKE_END
ERR_TREAT1:	MOV	4AH,	#02H	;送地址溢出的返回错误码	
	SJMP	EXIT1
ERR_TREAT2:	MOV	4AH,	#03H	;送数据长度错误的返回错误码
	SJMP	EXIT1
;---------------------****F15功能处理程序-------------------------
FUNC15_ERR_A:SETB	DIZHI_Z_ERR
	SJMP	ERROR_TREAT		
FUNCTION15:		
	LCALL	OVER_FLOW		;判断地址,长度是否溢出.
	JB	SHUJU_Z_ERR,ERROR_TREAT	;数据错误?
	JB	DIZHI_Z_ERR,ERROR_TREAT	;地址错误?
;	MOV	R2,	#0FFH
;	JNB	GUANGBO,FUNC15_0	;是广播地址?
;	MOV	R2,	#0F9H	
;FUNC15_0:
	MOV	A,	33H
	ADD	A,	35H
	MOV	R7,	A
	JZ	FUNC15_ERR_A
	MOV	A,	#01H
FUNC15_1:
	CLR	C
	RLC	A	
	DJNZ	R7,	FUNC15_1
	DEC	A
	MOV	R6,	A		;R6=2的(首址+长度)幂-1 
	CPL	A
	MOV	R5,	A		;R5=2的(首址+长度)幂-1 -- 取反
	MOV	A,	33H
	JZ	FUNC15_3
	MOV	R7,	A
	MOV	A,	#01H
FUNC15_2:
	CLR	C
	RLC	A
	DJNZ	R7,	FUNC15_2
	DEC	A
FUNC15_3:
	MOV	R4,	A		;R4=2的(首址)幂-1 
	MOV	R7,	37H
	MOV	A,	33H		;数据移位
	JZ	FUNC15_5
	MOV	A,	37H
	MOV	R7,	33H
FUNC15_4:
	CLR	C
	RLC	A
	DJNZ	R7,	FUNC15_4			
	MOV	R7,	A
FUNC15_5:
	MOV	A,	R7		;移位后数据
	ANL	A,	R6		;无用位去掉 
	JNB	GUANGBO,FUNC15_6	;是广播地址?	
	ANL	A,	#0F9H		;屏蔽广播禁止位
FUNC15_6:	
	MOV	R6,	A		;R6=得有效数据
	MOV	A,	R5
	ADD	A,	R4
	MOV	R5,	A		;R5=有效操作数据
	MOV	R0,	#81H
	MOV	A,	@R0
	ANL	A,	R5
	ADD	A,	R6
	MOV	@R0,	A		;存数据
;SJMP	FUNC15_COMM_END		;与CPU通讯,写输出线圈。	
;-------------****功能F15与主板通讯开始****------------	
FUNC15_COMM:
	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,FUNC15_COMM_END
	MOV	4AH,#04H
	LJMP	ERROR_TREAT
;-------------****功能F15与主板通讯结束****------------
FUNC15_COMM_END:
	MOV	20H,	#30H		;送校验数据首址
	MOV	22H,	#06H		;送校验数据长度
	LCALL	CRC			;进行CRC校验	
	MOV	36H,	23H		;存CRC低位
	MOV	37H,	24H		;存CRC高位
	MOV	LONG_S_BUS,#08H
	SETB	MODE17
;	CLR 	GUANGBO			; 不清广播标志!SEND_BIS中用.
	LJMP	EXIT
;-------------------****F16功能处理程序****------------------------
FUNC16_ERR:
	LJMP	ERROR_TREAT		
FUNCTION16:		
	LCALL	OVER_FLOW		;判断地址,长度是否溢出.
	JB	SHUJU_Z_ERR,FUNC16_ERR	;数据错误?
	JB	DIZHI_Z_ERR,FUNC16_ERR	;地址错误?
	MOV	R7,	36H
	CLR 	C
	MOV	A,	33H
	ADD	A,	33H
	ADD	A,	#8EH
	MOV	R1,	A
	MOV	R0,	#37H
FUNC16_1:MOV	A,@R0
	MOV	@R1,A
	INC	R0
	INC	R1
	DJNZ	R7,FUNC16_1
;SJMP	FUNC16_COMM_END		;与CPU通讯,组写输出。	
;----------------****功能F16与主板通讯开始****---------------------
FUNC16_COMM:
	MOV	A,33H
	MOV	R3,35H			;暂存长度
	CJNE 	A,#00H,FUNC16_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数据低位在前。
;	MOV	DIZHI_R_CPU,#0F0H	;无数据存取地址。
	LCALL	COMM_CPU
	JNB	TONGXUN_CPU_ERR,FUNC16_COMM_A2
	MOV	4AH,#04H
	LJMP	ERROR_TREAT
FUNC16_COMM_A2:
	DJNZ	R3,FUNC16_COMM_B1
        AJMP 	FUNC16_COMM_END
FUNC16_COMM_B:
	MOV	A,33H
	CJNE	A,#01H,FUNC16_COMM_C
FUNC16_COMM_B1:				;写灵敏度
	MOV	LONG_S_CPU,#02H
	MOV	LONG_R_CPU,#02H
	MOV	50H,#13H		;命令=13H.
	MOV	R0,#90H			;高位。
	MOV	51H,@R0
;	MOV	DIZHI_R_CPU,#0F0H	;无数据存取地址。
	LCALL	COMM_CPU
	JNB	TONGXUN_CPU_ERR,FUNC16_COMM_B2
	MOV	4AH,#04H
	LJMP	ERROR_TREAT
FUNC16_COMM_B2:
	DJNZ	R3,FUNC16_COMM_C1
	AJMP	FUNC16_COMM_END
FUNC16_COMM_C:
	MOV	A,33H
	CJNE	A,#02H,FUNC16_COMM_D	
FUNC16_COMM_C1:				;写禁止动作时间
	MOV	LONG_S_CPU,#02H
	MOV	LONG_R_CPU,#02H
	MOV	50H,#14H		;命令=14H.
	MOV	R0,#92H			;高位。
	MOV	51H,@R0
;	MOV	DIZHI_R_CPU,#0F0H	;无数据存取地址。
	LCALL	COMM_CPU
	JNB	TONGXUN_CPU_ERR,FUNC16_COMM_C2
	MOV	4AH,#04H
	LJMP	ERROR_TREAT
FUNC16_COMM_C2:
	DJNZ	R3,FUNC16_COMM_D1
	AJMP	FUNC16_COMM_END
FUNC16_COMM_D:
	MOV	A,33H
	CJNE	A,#03H,FUNC16_COMM_E	
FUNC16_COMM_D1:				;写低信阀位
	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数据低位在前
;	MOV	DIZHI_R_CPU,#0F0H	;无数据存取地址。
	LCALL	COMM_CPU
	JNB	TONGXUN_CPU_ERR,FUNC16_COMM_D2
	MOV	4AH,#04H
	LJMP	ERROR_TREAT
FUNC16_COMM_D2:
 	DJNZ	R3,FUNC16_COMM_E1
	AJMP	FUNC16_COMM_END
FUNC16_COMM_E:
	MOV	A,33H
	CJNE	A,#04H,FUNC16_COMM_END	
FUNC16_COMM_E1:				;写高信阀位
;	DEC	R3			;长度-1
	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
	JNB	TONGXUN_CPU_ERR,FUNC16_COMM_END
	MOV	4AH,#04H
	LJMP	ERROR_TREAT
;------------****功能F16与主板通讯结束****-------------	
FUNC16_COMM_END:
	MOV	20H,	#30H
	MOV	22H,	#06H
	LCALL	CRC
	MOV	36H,	23H
	MOV	37H,	24H
	MOV	LONG_S_BUS,#08H
	SETB	MODE17
	LJMP	EXIT
;---------------****功F17功能处理程序****---------------
FUNCTION17:		
	MOV	32H,	#20H		;数据字节数
	MOV	33H,	#00H		;从机ID
	MOV	34H,	#00H		;运行指示灯
	MOV	R0,	#35H
	MOV	DPTR,	#TAB1
	MOV	R6,	#00H
FUNC17_1:	
	MOV	A,	R6
	MOVC	A,	@A+DPTR
	MOV	@R0,	A
	INC	R0
	INC	R6	
	CJNE	R6,#20H,FUNC17_1
	MOV	20H,	#30H
	MOV	22H,	#25H
	LCALL	CRC
	MOV	55H,	23H		;送CRC低位                                                                                                                                                                                                                                                                                      
	MOV	56H,	24H		;送CRC高位
	MOV	LONG_S_BUS,#27H
	SETB	MODE17			;置F17模式标志位
	LJMP	EXIT
;*********////////程序暂停(主程序完)/////////**********
	LJMP    START                   ;软件抗干扰语句
;-------------------****CPU发送/接收子程序****----------
COMM_CPU:	;入口:   发长度=LONG_S_CPU,收长度=LONG_R_CPU
		;终存CPU来的数据首址DIZHI_CPU(长度=LONG_R_CPU-1)
		;R5,R6作为T35定时的中间寄存器,此程序中不得使用
	PUSH	ACC			;保护现场	
	PUSH	PSW			;保护现场
	CLR	ES			;禁止中断,改为查询方式
	SETB	RS0			;RAM--01区
	CLR	RS1
	CLR	JIAOYAN			;不校验
	CLR	SM2			;改为双机通讯,RB8为奇偶校验位
	MOV	CISHU_CPU,#03		;置错误时最多可通讯次数	
	MOV	R0,	#58H		;清接收区
CLR_1:	MOV	@R0,	#00		
	INC	R0
	CJNE	R0,#5DH,CLR_1
	LCALL	T1_MAKE			;暂存TH1于R5,TL1于R6	
	LCALL	T2_MAKE			;波特率发生器设置并启动(38400BPS)
APPLY_1:			
	;MOV     C,      P1.7 
	;JC	APPLY_B			;是B卡转出.
APPLY_A:;JNB	P0.1,   APPLY_A1
	CLR	P1.6
	CLR	P1.4
	NOP
	SETB	P1.6			;发A卡总线申请/只有A卡
	NOP
	JB	P0.7,	APPLY_A		;未得到继续申请
	SJMP	APPLY_OK
;APPLY_A1:
;	CLR	P1.6
;	SETB	P1.4
;	SETB	P1.6			;发A卡总线申请
;	NOP
;	JB	P0.7,	APPLY_A1	;未得到继续申请
;	SJMP	APPLY_OK
;APPLY_B:		
;	CLR	P1.2			;置A+B卡标志
;	LCALL	DELAY_140		;延时140微秒
;APPLY_B1:
;	CLR	P1.4
;	SETB	P1.6
;	SETB	P1.4			;发B卡总线申请
;	NOP
;	JB	P0.5,	APPLY_B1	;未得到继续申请
APPLY_OK:
		;----------------申请与CPU通讯总线完-------------													

⌨️ 快捷键说明

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