qcmc 发表于 2010-3-24 08:18:56

单片机写modbus通讯协议

各位大虾,如果是51单片机,想做modbus的话,协议定义的保持寄存器是怎么对应上单片机中的数据存储器的,对应关系是怎么样的?

majingsong 发表于 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

cool33777612 发表于 2010-3-24 23:06:55

楼主的问题可以加我qq 67802412,发帖两次不成功,也不会贴图。先睡觉了,白天还要工作。

oldmen 发表于 2010-3-24 23:54:30

gg

ppsen 发表于 2010-3-25 23:27:50

不需要对应关系

xiaowei0588 发表于 2010-5-28 10:41:40

很好!

jklooo 发表于 2012-7-12 17:13:19

不需对应,根据统一的协议,就像送快递的送给小区7单元1号,他只要送到门口,每个小区规定的7单元1号都不可能在一个位置

liu609178658 发表于 2013-4-27 19:59:31

就没点注释什么的?
页: [1]
查看完整版本: 单片机写modbus通讯协议