modbus interfacing with 8051

Status
Not open for further replies.
This asm code may help u for modbus usin 8051.


HTML:
;;;;;;;;;;;;;;;;;;;;;;;;; 
;;     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
 
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…