|
发表于 2010-3-24 11:44:01
|
显示全部楼层
下面是我用汇编写的,参考一下
;--------------------------------------------------------+
; MODBUS DEFINITIONL
;---------------------------------------------------------+
MOD_CS BIT P1.6
DATA_FIRST EQU 40H
BIT_FIRST EQU 28H
INPUT_STATUS EQU 00H
COIL_STATUS EQU 01H
INPUT_REGISTER EQU 02H
HOLD_REGISTER EQU 03H
SEND_DAT DATA 84H
REV_DAT DATA 84H
SEND_CNT DATA 86H
TIMER_CNT DATA 80H
SEND_RIG DATA 81H
SLAVE_ADDR DATA 82H
ADDR_RIGHT DATA 83H
;----------------------------------------------------------+
; MODBUS COM PORT INTERRUPT
;----------------------------------------------------------+
S_PORT_INT: CLR DOG_CS
NOP
SETB DOG_CS
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
CLR PSW.3
SETB PSW.4
JBC TI,SEND
RECEIVE: CLR RI
MOV R1,#ADDR_RIGHT
CJNE @R1,#0,RECEIVE_NEX
MOV A,SBUF
MOV R2,A
MOV R1,#SLAVE_ADDR
XRL A,@R1
JNZ S_PORT_E
MOV A,R2
MOV R0,#REV_DAT
MOV @R0,A
INC R0
MOV R1,#ADDR_RIGHT
MOV @R1,#1
MOV R1,#TIMER_CNT
MOV A,@R1
MOV R7,A
S_PORT_E: AJMP S_PORT_END
RECEIVE_NEX: CJNE R7,#0,RECEIVE_N_S
MOV R1,#ADDR_RIGHT
MOV @R1,#0
AJMP S_PORT_END
RECEIVE_N_S: MOV A,SBUF
MOV @R0,A
INC R0
MOV R1,#TIMER_CNT
MOV A,@R1
MOV R7,A
AJMP S_PORT_END
SEND: MOV R1,#SEND_RIG
MOV A,@R1
CJNE A,#0,SEND_NEX
SETB SCON.4
CLR RI
CLR MOD_CS
MOV R1,#TIMER_CNT
MOV A,@R1
MOV R7,A
MOV R1,#ADDR_RIGHT
MOV @R1,#0
AJMP S_PORT_E
SEND_NEX: ;LCALL DELAY
MOV R1,#SEND_RIG
MOV A,@R1
DEC A
MOV @R1,A
MOV R7,#100
MOV A,@R0
INC R0
MOV SBUF,A
S_PORT_END: POP DPL
POP DPH
POP ACC
POP PSW
CLR DOG_CS
NOP
SETB DOG_CS
RETI
;----------------------------------------------------------+
; MODBUS SEND DELAY
;----------------------------------------------------------+
DELAY: MOV R5,#12H
DELAY_2: MOV R6,#0FFH
DELAY_1: DJNZ R6,DELAY_1
DJNZ R5,DELAY_2
RET
;--------------------------------------------------------+
; MODBUS TIMER0 INTERRUPT
;--------------------------------------------------------+
TIMER0_INT: CLR TR0
CLR DOG_CS
NOP
SETB DOG_CS
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV TH0,#0FCH ;1ms
MOV TL0,#17H
SETB TR0
CLR PSW.3
SETB PSW.4
MOV R1,#ADDR_RIGHT
CJNE @R1,#0,TIMER0_NEX
JMP TIMER0_RETI
TIMER0_NEX: DJNZ R7,TIMER0_RETI
MOV R1,#ADDR_RIGHT
CJNE @R1,#0FFH,TIMER0_REV
SETB SCON.4
CLR RI
CLR MOD_CS
MOV R1,#ADDR_RIGHT
MOV @R1,#0
MOV R1,#TIMER_CNT
MOV A,@R1
MOV R7,A
JMP TIMER0_RETI
TIMER0_REV: CLR SCON.4
MOV R1,#ADDR_RIGHT
MOV @R1,#0
MOV R1,#TIMER_CNT
MOV A,@R1
MOV R7,A
JMP HANDLE_DATA
TIMER0_RETI: POP DPL
POP DPH
POP ACC
POP PSW
RETI
HANDLE_DATA: CLR DOG_CS
NOP
SETB DOG_CS
MOV R0,#REV_DAT
INC R0
MOV A,@R0
J_CMD16: CJNE A,#16,J_CMD1
MOV R0,#REV_DAT
MOV A,#6
CLR C
ADD A,R0
MOV R1,A
MOV A,@R1
CLR C
ADD A,#7
MOV R2,A
ACALL CRC_CALCULATE
MOV A,@R0
XRL A,R5
JNZ ERR_CRC
INC R0
MOV A,@R0
XRL A,R6
JNZ ERR_CRC
CLR P1.7
SETB MOD_CS
JMP CMD_16
J_CMD1: MOV R0,#REV_DAT
MOV R2,#6
ACALL CRC_CALCULATE
MOV A,@R0
XRL A,R5
JNZ ERR_CRC
INC R0
MOV A,@R0
XRL A,R6
JNZ ERR_CRC
CLR P1.7
SETB MOD_CS
MOV R0,#REV_DAT
INC R0
MOV A,@R0
CJNE A,#1,J_CMD2
JMP CMD_1
J_CMD2: CJNE A,#2,J_CMD3
JMP CMD_2
J_CMD3: CJNE A,#3,J_CMD4
JMP CMD_3
J_CMD4: CJNE A,#4,J_CMD5
JMP CMD_4
J_CMD5: CJNE A,#5,J_CMD6
JMP CMD_5
J_CMD6: CJNE A,#6,J_CMD_NO
JMP CMD_6
J_CMD_NO: SETB ACC.7
MOV @R0,A
INC R0
MOV @R0,#1
SEND_ERR: MOV R0,#SEND_DAT
MOV R2,#3
MOV R1,#SEND_RIG
MOV @R1,#5
SEND_DATA: ACALL CRC_CALCULATE
MOV A,R5
MOV @R0,A
INC R0
MOV A,R6
MOV @R0,A
SEND_TEST: MOV R0,#SEND_DAT
MOV R1,#SEND_RIG
MOV A,@R1
DEC A
MOV @R1,A
MOV R7,#0FFH
MOV R1,#ADDR_RIGHT
MOV @R1,#0FFH
MOV A,@R0
INC R0
MOV SBUF,A
JMP TIMER0_RETI
ERR_CRC: ;MOV R0,#SEND_DAT
;INC R0
;INC R0
;MOV @R0,#0FFH
;JMP SEND_ERR
SETB SCON.4
CLR RI
CLR MOD_CS
MOV R1,#ADDR_RIGHT
MOV @R1,#0
MOV R1,#TIMER_CNT
MOV A,@R1
MOV R7,A
JMP TIMER0_RETI
DATA_ADDR_ERR:MOV R0,#SEND_DAT
INC R0
MOV A,@R0
SETB ACC.7
MOV @R0,A
INC R0
MOV @R0,#02H
JMP SEND_ERR
;-------------------------------------------------------------------+
; MODBUS FUNCTION
;-------------------------------------------------------------------+
CMD_1: MOV R0,#REV_DAT
INC R0
INC R0
MOV A,@R0
CJNE A,#COIL_STATUS,DATA_ADDR_ERR
INC R0
MOV A,@R0
CLR C
SUBB A,#8
JNC DATA_ADDR_ERR
MOV A,@R0
MOV R4,A
INC R0
INC R0
MOV A,@R0
CLR C
ADD A,R4
MOV R5,A
CLR C
SUBB A,#8
JNC CMD1_OV
MOV A,@R0
MOV R2,A
MOV A,#8
CLR C
SUBB A,R5
MOV R5,A
MOV R2,A
MOV A,BIT_FIRST
CMD1_J: CJNE R5,#0,CMD1_C1
JMP CMD1_C
CMD1_C1: CLR C
RLC A
DEC R5
JMP CMD1_J
CMD1_C : CJNE R2,#0,CMD1_N1
JMP CMD1_N
CMD1_N1: CLR C
RRC A
DEC R2
JMP CMD1_C
CMD1_OV: MOV A,BIT_FIRST
CMD1_N : CJNE R4,#0,CMD1_E1
JMP CMD1_E
CMD1_E1: CLR C
RRC A
DEC R4
JMP CMD1_N
CMD1_E: MOV R1,#SEND_CNT+1
MOV @R1,A
DEC R1
MOV @R1,#01
MOV R2,#4
MOV R1,#SEND_RIG
MOV @R1,#6
MOV R0,#SEND_DAT
JMP SEND_DATA
CMD_2: MOV R0,#REV_DAT
INC R0
INC R0
MOV A,@R0
CJNE A,#INPUT_STATUS,DATA_ADDR_ERR
INC R0
MOV A,@R0
CLR C
SUBB A,#8
JNC DATA_ADDR_ERR
MOV A,@R0
MOV R4,A
INC R0
INC R0
MOV A,@R0
CLR C
ADD A,R4
MOV R5,A
CLR C
SUBB A,#8
JNC CMD2_OV
MOV A,@R0
MOV R2,A
MOV A,#8
CLR C
SUBB A,R5
MOV R5,A
MOV R2,A
MOV A,BIT_FIRST
CMD2_J: CJNE R5,#0,CMD2_C1
JMP CMD2_C
CMD2_C1: CLR C
RLC A
DEC R5
JMP CMD2_J
CMD2_C : CJNE R2,#0,CMD2_N1
JMP CMD2_N
CMD2_N1: CLR C
RRC A
DEC R2
JMP CMD2_C
CMD2_OV: MOV A,BIT_FIRST
CMD2_N : CJNE R4,#0,CMD2_E1
JMP CMD2_E
CMD2_E1: CLR C
RRC A
DEC R4
JMP CMD2_N
CMD2_E: MOV R1,#SEND_CNT+1
MOV @R1,A
DEC R1
MOV @R1,#01
MOV R2,#4
MOV R1,#SEND_RIG
MOV @R1,#6
MOV R0,#SEND_DAT
JMP SEND_DATA
CMD_3: MOV R0,#REV_DAT
INC R0
INC R0
MOV A,@R0
CJNE A,#HOLD_REGISTER,CMD3_ADDR_ERR
INC R0
MOV A,@R0
CLR C
RLC A
MOV R4,A
INC R0
INC R0
MOV A,@R0
CLR C
RLC A
MOV R2,A
MOV R1,#SEND_CNT
MOV @R1,A
MOV A,#DATA_FIRST
CLR C
ADD A,R4
MOV R0,A
MOV R1,#SEND_CNT+1
CLR DOG_CS
NOP
SETB DOG_CS
ACALL RD_RAM
MOV R1,#SEND_CNT
MOV A,@R1
CLR C
ADD A,#3
MOV R2,A
CLR C
INC A
INC A
MOV R1,#SEND_RIG
MOV @R1,A
MOV R0,#SEND_DAT
JMP SEND_DATA
CMD3_ADDR_ERR:JMP DATA_ADDR_ERR
CMD_4: MOV R0,#REV_DAT
INC R0
INC R0
MOV A,@R0
CJNE A,#INPUT_REGISTER,CMD4_ADDR_ERR
INC R0
MOV A,@R0
CLR C
RLC A
MOV R4,A
INC R0
INC R0
MOV A,@R0
CLR C
RLC A
MOV R2,A
MOV R1,#SEND_CNT
MOV @R1,A
MOV A,#DATA_FIRST
CLR C
ADD A,R4
MOV R0,A
MOV R1,#SEND_CNT+1
CLR DOG_CS
NOP
SETB DOG_CS
ACALL RD_RAM
MOV R1,#SEND_CNT
MOV A,@R1
CLR C
ADD A,#3
MOV R2,A
CLR C
INC A
INC A
MOV R1,#SEND_RIG
MOV @R1,A
MOV R0,#SEND_DAT
JMP SEND_DATA
CMD4_ADDR_ERR:JMP DATA_ADDR_ERR
CMD_5: MOV R0,#REV_DAT
INC R0
INC R0
MOV A,@R0
CJNE A,#COIL_STATUS,CMD5_ADDR_ERR
INC R0
MOV A,@R0
CLR C
RLC A
MOV R4,A
MOV A,#40H
CLR C
ADD A,R4
MOV R1,A
INC R0
INC R0
MOV A,@R0
CJNE A,#00,CMD5_E
DEC R0
MOV A,@R0
MOV @R1,A
INC R0
INC R1
MOV A,@R0
MOV @R1,A
CMD5_E: MOV R2,#6
MOV R1,#SEND_RIG
MOV @R1,#8
MOV R0,#SEND_DAT
JMP SEND_DATA
CMD5_ADDR_ERR:JMP DATA_ADDR_ERR
CMD_6: MOV R0,#REV_DAT
INC R0
INC R0
MOV A,@R0
CJNE A,#HOLD_REGISTER,CMD6_ADDR_ERR
INC R0
MOV A,@R0
CLR C
RLC A
MOV R4,A
INC R0
MOV A,#DATA_FIRST
CLR C
ADD A,R4
MOV R1,A
MOV R2,#2
CLR DOG_CS
NOP
SETB DOG_CS
ACALL RD_RAM
MOV R1,#SEND_RIG
MOV @R1,#8
MOV R0,#SEND_DAT
MOV R2,#6
JMP SEND_DATA
CMD6_ADDR_ERR:JMP DATA_ADDR_ERR
CMD_16: MOV R0,#REV_DAT
INC R0
INC R0
MOV A,@R0
CJNE A,#HOLD_REGISTER,CMD16_ADDR_ERR
INC R0
MOV A,@R0
CLR C
RLC A
MOV R4,A
INC R0
INC R0
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,#DATA_FIRST
CLR C
ADD A,R4
MOV R1,A
CLR DOG_CS
NOP
SETB DOG_CS
ACALL RD_RAM
MOV R1,#SEND_RIG
MOV @R1,#8
MOV R0,#SEND_DAT
MOV R2,#6
JMP SEND_DATA
CMD16_ADDR_ERR:JMP DATA_ADDR_ERR |
|