⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus.asm

📁 modebus协议的汇编实现
💻 ASM
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;
;;     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

⌨️ 快捷键说明

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