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