搜索
bottom↓
回复: 7

单片机写modbus通讯协议

[复制链接]

出0入0汤圆

发表于 2010-3-24 08:18:56 | 显示全部楼层 |阅读模式
各位大虾,如果是51单片机,想做modbus的话,协议定义的保持寄存器是怎么对应上单片机中的数据存储器的,对应关系是怎么样的?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

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

出0入0汤圆

发表于 2010-3-24 23:06:55 | 显示全部楼层
楼主的问题可以加我qq 67802412,发帖两次不成功,也不会贴图。先睡觉了,白天还要工作。

出0入0汤圆

发表于 2010-3-24 23:54:30 | 显示全部楼层
gg

出0入0汤圆

发表于 2010-3-25 23:27:50 | 显示全部楼层
不需要对应关系

出0入0汤圆

发表于 2010-5-28 10:41:40 | 显示全部楼层
很好!

出0入0汤圆

发表于 2012-7-12 17:13:19 | 显示全部楼层
不需对应,根据统一的协议,就像送快递的送给小区7单元1号,他只要送到门口,每个小区规定的7单元1号都不可能在一个位置

出0入0汤圆

发表于 2013-4-27 19:59:31 | 显示全部楼层
就没点注释什么的?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表