;;;;;;;;;;;;;;;;;;;;;;;;;
;; MODBUS.ASM ;;
;;;;;;;;;;;;;;;;;;;;;;;;;
PROC MODBUS,SP0INT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SP0INT:
NOP
PUSH PSW
PUSH ACC
PUSH DPH1
PUSH DPL1
JB SP0_RTC,SP0INT_RECEIVE
LJMP SP0INT_SEND
SP0INT_RECEIVE:
JBC RI,SP0INT_RECEIVE1
CLR TI
LJMP SP0INT_RECE_END
SP0INT_RECEIVE1:
MOV A,SBUF
;MOV C,RB8
;JNB SP0INT_RECE_ERROR
MOV DPH1,#00H
MOV DPL1,SP0RXD_CAL
MOVX @DPTR,A
INC SP0RXD_CAL
SP0INT_RECE_END:
SJMP SP0INT_END
;;;;-----------------------;;;;;
SP0INT_SEND:
NOP
JBC TI,SP0INT_SEND1
CLR RI
SJMP SP0INT_SEND_END
SP0INT_SEND1:
DJNZ SP0_LONG,SP0INT_SEND2
;SETB SP0_RTC
;MOV SP0RXD_CAL,#00H
SJMP SP0INT_SEND_END
SP0INT_SEND2:
INC SP0TXD_CAL
MOV A,SP0TXD_CAL
;ADD A,#00H
MOV DPL1,A
MOV DPH1,#00H
MOVX A,@DPTR
SETB TB8
MOV SBUF,A
SP0INT_SEND_END:
;; SJMP SP0INT_END
;;;---------------------------;;;
SP0INT_END:
MOV SP0_WD,#00H
POP DPL1
POP DPH1
POP ACC
POP PSW
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MODBUS:
NOP
JBC SP0_REND,MODBUS_CHECK_ADDRESS
LJMP MODBUS_END
MODBUS_CHECK_ADDRESS:
MOV DPTR,#SP0_SBUF1
MOVX A,@DPTR
XRL A,SLAVE
JZ MODBUS_CHECK_CRC
MODBUS_ADDRESS_ERROR:
NOP
LJMP MODBUS_ORDER_ERROR
MODBUS_CHECK_CRC:
MOV DPTR,#SP0_SBUF1
MOV R2,SP0RXD_CAL
DEC R2
DEC R2
LCALL CRC16
MOVX A,@DPTR
INC DPTR
XRL A,R1
JNZ MODBUS_CRC_ERROR
MOVX A,@DPTR
XRL A,R0
JZ MODBUS_CHECK_ORDER
MODBUS_CRC_ERROR:
NOP
LJMP MODBUS_ORDER_ERROR
MODBUS_CHECK_ORDER:
NOP
MOV DPTR,#SP0_SBUF2
MOVX A,@DPTR
CJNE A,#07H,MODBUS_CHECK_ORDER1
MODBUS_CHECK_ORDER1:
JC MODBUS_ORDER_CASE
NOP
LJMP MODBUS_ORDER_ERROR
MODBUS_ORDER_CASE:
MOV B,#03H
MUL AB
MOV DPTR,#MODBUS_ORDER_TABLE
JMP @A+DPTR
MODBUS_ORDER_TABLE:
LJMP MODBUS_ORDER_ERROR
LJMP MODBUS_ORDER_ERROR
LJMP MODBUS_ORDER_ERROR
LJMP MODBUS_ORDER3
LJMP MODBUS_ORDER_ERROR
LJMP MODBUS_ORDER_ERROR
LJMP MODBUS_ORDER6
LJMP MODBUS_ORDER_ERROR
MODBUS_END:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MODBUS_ORDER_ERROR:
SETB SP0_RTC
MOV SP0RXD_CAL,#00H
LJMP MODBUS_END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MODBUS_ORDER3:
NOP
MODBUS_ORDER3_CHECK_ADDRESS:
MOV DPTR,#SP0_SBUF3
MOVX A,@DPTR
XRL A,#00H
JNZ MODBUS_ORDER3_ADDRESS_ERROR
INC DPTR
MOVX A,@DPTR
MOV R7,A
CJNE A,#0BH,MODBUS_ORDER3_1
MODBUS_ORDER3_1:
JC MODBUS_ORDER3_CHECK_LONG
MODBUS_ORDER3_ADDRESS_ERROR:
LJMP MODBUS_ORDER_ERROR
MODBUS_ORDER3_CHECK_LONG:
INC DPTR
MOVX A,@DPTR
JNZ MODBUS_ORDER3_LONG_ERROR
MOV A,#0BH
CLR C
SUBB A,R7
MOV B,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
XCH A,B
CLR C
SUBB A,B
JNC MODBUS_ORDER3_READ_DATA
MODBUS_ORDER3_LONG_ERROR:
NOP
LJMP MODBUS_ORDER_ERROR
MODBUS_ORDER3_READ_DATA:
MOV A,R6
MOV R2,A
RL A
MOV SP0_LONG,A
MOV A,R7
RL A
ADD A,#KRL
MOV R0,A
MOV DPTR,#SP0_SBUF4
LCALL MOVE_IRAMXRAM2
MOV DPTR,#SP0_SBUF1
MOV A,SLAVE
MOVX @DPTR,A
INC DPTR
MOV A,#03H
MOVX @DPTR,A
INC DPTR
MOV A,SP0_LONG
MOVX @DPTR,A
INC SP0_LONG
INC SP0_LONG
INC SP0_LONG
LJMP MODBUS_SEND_CRC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MODBUS_ORDER6:
NOP
MODBUS_ORDER6_CHECK_ADDRESS:
MOV DPTR,#SP0_SBUF3
MOVX A,@DPTR
JNZ MODBUS_ORDER6_ADDRESS_ERROR
INC DPTR
MOVX A,@DPTR
MOV R7,A
CJNE A,#02H,MODBUS_ORDER6_1
MODBUS_ORDER6_1:
JC MODBUS_ORDER6_READ_DATA
MODBUS_ORDER6_ADDRESS_ERROR:
LJMP MODBUS_ORDER_ERROR
MODBUS_ORDER6_READ_DATA:
MOV DPTR,#SP0_SBUF5
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
MOV R5,#KU1H_AD
MOV A,R7
RL A
ADD A,#KU1L_AD
MOV R4,A
LCALL WWRITE
MOV DPTR,#SBUF1
MOV A,SLAVE
MOVX @DPTR,A
INC DPTR
MOV A,#06H
MOVX @DPTR,A
INC DPTR
MOV A,#00H
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
INC DPTR
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
MOV SP0_LONG,#06H
LJMP MODBUS_SEND_CRC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MODBUS_SEND_CRC:
NOP
MOV DPTR,#SP0_SBUF1
MOV R2,SP0_LONG
LCALL CRC16
MOV A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R0
MOVX @DPTR,A
INC SP0_LONG
INC SP0_LONG
MODBUS_SEND_BEGIN:
CLR SP0_RTC
MOV DPTR,#SP0_SBUF1
MOVX A,@DPTR
SETB TB8
MOV SBUF,A
MOV SP0TXD_CAL,#00H
LJMP MODBUS_END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Èë¿Ú: dptr R2¸ö²ÎÓë¼ÆËãµÄ×Ö½Ú
;³ö¿Ú: R1-CRC½á¹û¸ßλ R0-CRC½á¹ûµÍλ,DPTR
;Ó°Ï죺A£¬DPH£¬DPL
;X16+X14+X2+1
CRC16:
NOP
MOV R0,#0FFH
MOV R1,#0FFH
CRC16_LOOP:
MOV DPS,#01H
MOVX A,@DPTR
INC DPTR
XRL A,R1
INC DPS
MOV DPTR,#CRC16_DATA
ADD A,DPL
MOV DPL,A
CLR A
ADDC A,DPH
MOV DPH,A
CLR A
MOVC A,@A+DPTR
XRL A,R0
MOV R1,A
INC DPH
CLR A
MOVC A,@A+DPTR
MOV R0,A
DJNZ R2,CRC16_LOOP
MOV DPS,#01H
RET
;ORG 0FF9H
PROGRAM_ERROR_CRCTABL1:
NOP
NOP
NOP
NOP
NOP
SJMP $
;ORG 1000H
CRC16_DATA:
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H ;1
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H ;8
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H ;16
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H ;24
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB 001H,0C0H,080H,041H,000H,0C1H,081H,040H ;32
DB 000H,0C0H,0C1H,001H,0C3H,003H,002H,0C2H
DB 0C6H,006H,007H,0C7H,005H,0C5H,0C4H,004H
DB 0CCH,00CH,00DH,0CDH,00FH,0CFH,0CEH,00EH
DB 00AH,0CAH,0CBH,00BH,0C9H,009H,008H,0C8H
DB 0D8H,018H,019H,0D9H,01BH,0DBH,0DAH,01AH
DB 01EH,0DEH,0DFH,01FH,0DDH,01DH,01CH,0DCH
DB 014H,0D4H,0D5H,015H,0D7H,017H,016H,0D6H
DB 0D2H,012H,013H,0D3H,011H,0D1H,0D0H,010H ;40
DB 0F0H,030H,031H,0F1H,033H,0F3H,0F2H,032H
DB 036H,0F6H,0F7H,037H,0F5H,035H,034H,0F4H
DB 03CH,0FCH,0FDH,03DH,0FFH,03FH,03EH,0FEH
DB 0FAH,03AH,03BH,0FBH,039H,0F9H,0F8H,038H
DB 028H,0E8H,0E9H,029H,0EBH,02BH,02AH,0EAH
DB 0EEH,02EH,02FH,0EFH,02DH,0EDH,0ECH,02CH
DB 0E4H,024H,025H,0E5H,027H,0E7H,0E6H,026H
DB 022H,0E2H,0E3H,023H,0E1H,021H,020H,0E0H ;48
DB 0A0H,060H,061H,0A1H,063H,0A3H,0A2H,062H
DB 066H,0A6H,0A7H,067H,0A5H,065H,064H,0A4H
DB 06CH,0ACH,0ADH,06DH,0AFH,06FH,06EH,0AEH
DB 0AAH,06AH,06BH,0ABH,069H,0A9H,0A8H,068H
DB 078H,0B8H,0B9H,079H,0BBH,07BH,07AH,0BAH
DB 0BEH,07EH,07FH,0BFH,07DH,0BDH,0BCH,07CH
DB 0B4H,074H,075H,0B5H,077H,0B7H,0B6H,076H
DB 072H,0B2H,0B3H,073H,0B1H,071H,070H,0B0H
DB 050H,090H,091H,051H,093H,053H,052H,092H ;56
DB 096H,056H,057H,097H,055H,095H,094H,054H
DB 09CH,05CH,05DH,09DH,05FH,09FH,09EH,05EH
DB 05AH,09AH,09BH,05BH,099H,059H,058H,098H
DB 088H,048H,049H,089H,04BH,08BH,08AH,04AH
DB 04EH,08EH,08FH,04FH,08DH,04DH,04CH,08CH
DB 044H,084H,085H,045H,087H,047H,046H,086H
DB 082H,042H,043H,083H,041H,081H,080H,040H ;64
PROGRAM_ERROR_CRCTABLE2:
NOP
NOP
NOP
NOP
NOP
SJMP $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END