| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2295 人关注过本帖
标题:急!!帮我把自定义通信协议改为modbus通信协议
只看楼主 加入收藏
xuexibianc
Rank: 2
等 级:论坛游民
帖 子:35
专家分:34
注 册:2010-9-8
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:2 
急!!帮我把自定义通信协议改为modbus通信协议
;内存分配:
;ADD:30H,31H
;BTL:32H
;DI:33H,25h,26h
;DO:34H
;AI0:35H,36H,37H,38H
;AI2:39H,3AH,3BH,3CH
;AI3:3DH,3EH,3FH,40H
;AI4:41H,42H,43H,44H
;AO0:45H,46H,47H,48H
;AO1:49H,4AH,4BH,4CH
;CHKSUM:4DH,4EH
;接收区:50H~5FH
;堆栈区:60H~7FH

;ADS7841
DCLK      BIT  P1.3
ADCS      BIT  P1.2
DIN       BIT  P1.1                                                               
DOUT      BIT  P1.0
;TLV5618
DAIN      BIT  P1.4
SCLK      BIT  P1.5
DACS      BIT  P1.6
;LCD
RS        BIT  P3.4
RW        BIT  P3.5
EN        BIT  P3.6
+
SSIOMARK  BIT  00H    ;串行接收正确标志

DIasch    equ  25h
DIascl    equ  26h

lcdbusy   equ  27h

TIMES     EQU  28H    ;定时器计数
TIMESE    EQU  29H    ;定时器计数
SSIOSBUF  EQU  2AH    ;串行接收数据暂存
SSIOTIME  EQU  2BH    ;串行接收数据个数

DAAH      EQU  2CH    ;TLC5618输入数据
DAAL      EQU  2DH
DABH      EQU  2EH
DABL      EQU  2FH

dotime    equ  4fh

RR0       EQU  18H
RR1       EQU  19H
RR2       EQU  1AH
RR3       EQU  1BH
RR4       EQU  1CH
RR5       EQU  1DH
RR6       EQU  1EH
RR7       EQU  1FH

RRR0       EQU  10H
RRR1       EQU  11H
RRR2       EQU  12H
RRR3       EQU  13H
RRR4       EQU  14H
RRR5       EQU  15H
RRR6       EQU  16H
RRR7       EQU  17H


          ORG   0000H
          LJMP  MAIN
          ORG   000BH
          LJMP  TIMEINT      ;定时中断
          ORG   0023H
          LJMP  SSIO         ;串行中断

          ORG   0100H
MAIN:     MOV   SP,#60H
          CLR   P3.2        ;485收发控制端
          LCALL SETDATA     ;设置输出数据
          LCALL ADDRESS     ;读取站地址和波特率
          LCALL BTL0        ;设置波特率(晶振为11.0592M)
          LCALL SET232      ;串行口、定时器初始化
          lcall lcdset      ;液晶初始化
START:
          LCALL DIADDBTL    ;读取开关量输入、站地址和波特率
          //LCALL ADIN        ;模拟量输入
          LCALL DAOUT       ;模拟量输出
         // LCALL DISPLAY     ;液晶显示
          LCALL MESSAGE     ;消息处理
          LCALL SAVEDATA    ;保存输出数据及校验

          LJMP  START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SETDATA:  mov   a,daah      ;设置输出数据
          add   a,daal
          add   a,dabh
          add   a,dabl
          add   a,34h

          lcall hasc        ;单字节十六进制数转换成双字节ASCII码
          mov   4dh,a
          mov   4eh,b

          mov   a,23h
          cjne  a,4dh,SETDATA0
          mov   a,24h
          cjne  a,4eh,SETDATA0
          mov   p2,34h
          RET

SETDATA0: mov   p2,#0ffh    ;开关量输出复位
          mov   34h,#0ffh

          mov   45h,#41h
          mov   46h,#41h
          mov   47h,#41h
          mov   48h,#41h
          mov   49h,#41h
          mov   4ah,#41h
          mov   4bh,#41h
          mov   4ch,#41h
          mov   daah,#0C0h
          mov   daal,#00h
          mov   dabh,#50h
          mov   dabl,#00h
          RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SAVEDATA: mov   a,daah       ;保存输出数据及校验
          add   a,daal
          add   a,dabh
          add   a,dabl
          add   a,34h

          lcall hasc         ;单字节十六进制数转换成双字节ASCII码
          mov   23h,a
          mov   24h,b
          RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIADDBTL:
DI:       MOV   P0,#0FFH    ;读输入开关量
          CLR   P3.7
          MOV   A,P0
          SETB  P3.7
          CPL   A
          rlc   a
          mov   08h,c
          rlc   a
          mov   09h,c
          rlc   a
          mov   0ah,c
          rlc   a
          mov   0bh,c
          rlc   a
          mov   0ch,c
          rlc   a
          mov   0dh,c
          rlc   a
          mov   0eh,c
          rlc   a
          mov   0fh,c
          MOV   33H,21h

          mov   a,33h
          lcall hasc
          mov   DIasch,a
          mov   DIascl,b

ADDRESS:  MOV   P0,#0FFH        ;读取拔码开关站地址和波特率
          CLR   P3.3
          MOV   A,P0
          SETB  P3.3
          CPL   A
          MOV   R2,A
          ANL   A,#1FH
          LCALL HBCD
          LCALL HASC
          MOV   30H,A
          MOV   31H,B

          MOV   A,R2
          ANL   A,#0E0H
          RL    A
          RL    A
          RL    A
          CJNE  A,32H,BTL
          RET

BTL:      MOV   32H,A         ;设置波特率(晶振为11.0592M)
BTL0:     MOV   A,32H
          CJNE  A,#00H,BTL1
          MOV   TH1,#0A0H     ;波特率300
          MOV   TL1,#0A0H
          RET
BTL1:     CJNE  A,#01H,BTL2
          MOV   TH1,#0D0H     ;波特率600
          MOV   TL1,#0D0H
          RET
BTL2:     CJNE  A,#02H,BTL3
          MOV   TH1,#0E8H     ;波特率1200
          MOV   TL1,#0E8H
          RET
BTL3:     CJNE  A,#03H,BTL4
          MOV   TH1,#0F4H     ;波特率2400
          MOV   TL1,#0F4H
          RET
BTL4:     CJNE  A,#04H,BTL5
          MOV   TH1,#0FAH     ;波特率4800
          MOV   TL1,#0FAH
          RET
BTL5:     MOV   TH1,#0FDH     ;波特率9600
          MOV   TL1,#0FDH
          RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
//ADIN:                         ;AI0-AI3采集并转换成BCD和ASC码  省略了采集部分
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DAOUT:
;        MOV   DAAH,#0C8H
;        MOV   DAAL,#03H
;        MOV   DABH,#5FH
;        MOV   DABL,#0FFH

        MOV   A,DABH
        CLR   C
        SETB  SCLK
        CLR   DACS
        MOV   R6,#02H
DA10:   MOV   R7,#08H
DA11:   SETB  SCLK
        RLC   A
        MOV   DAIN,C
        CLR   SCLK
        DJNZ  R7,DA11
        MOV   A,DABL
        DJNZ  R6,DA10
        SETB  SCLK
        SETB  DACS
        CLR   SCLK

        MOV   A,DAAH
        CLR   C
        SETB  SCLK
        CLR   DACS
        MOV   R6,#02H
DA20:   MOV   R7,#08H
DA21:   SETB  SCLK
        RLC   A
        MOV   DAIN,C
        CLR   SCLK
        DJNZ  R7,DA21
        MOV   A,DAAL
        DJNZ  R6,DA20
        SETB  SCLK
        SETB  DACS
        CLR   SCLK
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SSIO:   PUSH  ACC
        PUSH  PSW
        PUSH  01H
LOOP1:  CLR   RI
        MOV   A,SBUF
        JNB   PSW.0,LOOP10
        JNB   RB8,BACK
        LJMP  LOOP11
LOOP10: JB    RB8,BACK
LOOP11: MOV   SSIOSBUF,A
        MOV   A,SSIOTIME
        CJNE  A,#00H,LOOP2
        MOV   A,SSIOSBUF
       CJNE  A,#02H,BACK
LOOP2:  MOV   A,#50H
        ADD   A,SSIOTIME
        MOV   R1,A
        MOV   @R1,SSIOSBUF
        mov   a,ssiosbuf
        cjne  a,#0dh,loop3
        SETB  SSIOMARK
        CLR   ES
        ljmp  back1
loop3:  INC   SSIOTIME
        MOV   A,SSIOTIME
        CJNE  A,#10H,LOOP4
LOOP4:  JC    BACK1
BACK:   MOV   SSIOTIME,#00H
BACK1:  POP   01H
        POP   PSW
        POP   ACC
        RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;
MESSAGE:jB    SSIOMARK,MESS1   ;串行消息处理
        CLR   P3.2
        RET
MESS1:  MOV   A,53H        ;核对站地址
        CJNE  A,30H,MESS6
        MOV   A,54H
        CJNE  A,31H,MESS6
        mov 20h,#0xff         ;核对校验字
        mov 21h,#0xff
        mov 12h,#0x0d
        mov 11h,#0x08
        mov r0,#0x34
zijiekaishi:
        mov a,21h
        xrl a,@r0
kaishi:
        rrc a
        mov 21h,a
        mov 10h,c
        clr c
        mov a,20h
        rrc a
        mov 0fh,c
        mov 20h,a
        anl 20h,#0x7f
        jnb 10h,next
        xrl 21h,#0x01
        xrl 20h,#0xa0
next:
        mov a,21h
        djnz 11h,kaishi
        mov 11h,#0x08
        inc r0
        djnz 12h,zijiekaishi
        mov 4eh,20h
        mov 4dh,21h
      


        SETB  P3.2

        MOV   A,51H          ;判断命令字
        CJNE  A,#03H,MESS3
        CJNE  A,#01H,MESS30
        CJNE  A,#05H,MESS5
        CJNE A,#06H,MESS4
        LCALL RD1
        LJMP  MESS6
MESS3:  
        LCALL RA
        LJMP  MESS6
MESS30:
        LCALL RALL
        LJMP  MESS6
MESS4:  
        LCALL WD
        LJMP  MESS6
MESS5:  
        LCALL AODATA
        LCALL WA
MESS6:  MOV   SSIOTIME,#00H
        CLR   SSIOMARK
        SETB  ES
        CLR   P3.2
        RET
;;;;;;;;;;;
RD1:    MOV   A,#52H
        ADD   A,#44H
        ADD   A,30H
        ADD   A,31H
        ADD   A,DIasch
        add   a,DIascl
        LCALL HASC
        MOV   57H,A
        MOV   58H,B
        MOV   55H,DIasch
        mov   56h,DIascl
    //    MOV   59H,#0DH

        MOV   R7,#0AH
        MOV   R0,#50H
RD0:    MOV   A,@R0
        LCALL BUFS
        INC   R0
        DJNZ  R7,RD0
        RET
;;;;;;;;;;;
RA:     MOV   A,#52H
        ADD   A,#41H
        ADD   A,30H
        ADD   A,31H

        MOV   R7,#10H
        MOV   R0,#35H
RA0:    ADD   A,@R0
        INC   R0
        DJNZ  R7,RA0
        LCALL HASC
        MOV   4DH,A
        MOV   4EH,B

        MOV   R7,#05H
        MOV   R0,#50H
RA1:    MOV   A,@R0
        LCALL BUFS
        INC   R0
        DJNZ  R7,RA1

        MOV   R7,#10H
        MOV   R0,#35H
RA2:    MOV   A,@R0
        LCALL BUFS
        INC   R0
        DJNZ  R7,RA2

        MOV   A,4DH
        LCALL BUFS
        MOV   A,4EH
        LCALL BUFS
        //MOV   A,#0DH
       // LCALL BUFS
        RET
;;;;;;;;;;;;
RALL:   MOV   A,34H
        CPL   A
        LCALL HASC
        MOV   RR0,A
        MOV   RR1,B

        MOV   A,#52H
        ADD   A,#52H
        ADD   A,30H
        ADD   A,31H

        MOV   R7,#18H
        MOV   R0,#35H
RALL0:  ADD   A,@R0
        INC   R0
        DJNZ  R7,RALL0
        ADD   A,DIasch
        add   a,DIascl
        ADD   A,RR0
        ADD   A,RR1
        LCALL HASC
        MOV   4DH,A
        MOV   4EH,B

        MOV   R7,#05H
        MOV   R0,#50H
RALL1:  MOV   A,@R0
        LCALL BUFS
        INC   R0
        DJNZ  R7,RALL1

        MOV   R7,#18H
        MOV   R0,#35H
RALL2:  MOV   A,@R0
        LCALL BUFS
        INC   R0
        DJNZ  R7,RALL2

        MOV   A,DIasch
        LCALL BUFS
        MOV   a,DIascl
        LCALL BUFS
        MOV   A,RR0
        LCALL BUFS
        MOV   A,RR1
        LCALL BUFS
        MOV   A,4DH
        LCALL BUFS
        MOV   A,4EH
        LCALL BUFS
    //    MOV   A,#0DH
    //    LCALL BUFS
        RET
;;;;;;;;;;;;
WD:     mov   a,55h
        lcall asch
        swap  a
        mov   34h,a
        mov   a,56h
        lcall asch
        add   a,34h
        CPL   A
        mov   34h,a
        MOV   P2,A
        mov   dotime,#00h

        MOV   A,#57H
        ADD   A,#44H
        ADD   A,30H
        ADD   A,31H
        LCALL HASC
        MOV   55H,A
        MOV   56H,A
       // MOV   57H,#0DH

        MOV   R7,#08H
        MOV   R0,#50H
WD0:    MOV   A,@R0
        LCALL BUFS
        INC   R0
        DJNZ  R7,WD0
        RET
;;;;;;;;;;;
WA:     MOV   A,#57H
        ADD   A,#41H
        ADD   A,30H
        ADD   A,31H
        LCALL HASC
        MOV   55H,A
        MOV   56H,A
        //MOV   57H,#0DH

        MOV   R7,#08H
        MOV   R0,#50H
WA0:    MOV   A,@R0
        LCALL BUFS
        INC   R0
        DJNZ  R7,WA0
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AODATA:                   ;对写模拟量命令进行保存并转换成十六进制
        MOV   45H,55H
        MOV   46H,56H
        MOV   47H,57H
        MOV   48H,58H
        MOV   49H,59H
        MOV   4AH,5AH
        MOV   4BH,5BH
        MOV   4CH,5CH

        MOV  R7,#08H
        MOV  R0,#55H
AODATA1:MOV   A,@R0
        LCALL ASCH
        MOV   @R0,A
        INC   R0
        DJNZ  R7,AODATA1

        mov   a,45h
        cjne  a,#41h,AODATA2
        MOV   DAAH,#00h
        MOV   DAAL,#00h
        ljmp  AODATA3
AODATA2:MOV   A,55H
        SWAP  A
        ADD   A,56H
        MOV   R2,A
        MOV   A,57H
        SWAP  A
        ADD   A,58H
        MOV   R3,A
        lcall aoddd
        MOV   DAAH,R3
        MOV   DAAL,R4

AODATA3:mov   a,49h
        cjne  a,#41h,AODATA4
        MOV   DABH,#00h
        MOV   DABL,#00h
        ljmp  AODATA5
AODATA4:MOV   A,59H
        SWAP  A
        ADD   A,5AH
        MOV   R2,A
        MOV   A,5BH
        SWAP  A
        ADD   A,5CH
        MOV   R3,A
        LCALL aoddd
        MOV   DABH,R3
        MOV   DABL,R4

AODATA5:ORL   DAAH,#50H
        ORL   DABH,#0C0H
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;
aoddd:  LCALL BH2
        mov   r6,#0ch
        mov   r7,#0cch
        lcall muld
        mov   r6,#0fh
        mov   r7,#0a0h
        lcall divd
        mov   c,ov
        jc    aoddd0
        mov   r4,03h
        mov   r3,02h
        ljmp  aoddd1
aoddd0: mov   r4,#00h
        mov   r3,#00h
aoddd1: mov   a,r4
        add   a,#33h
        mov   r4,a
        mov   a,r3
        addc  a,#03h
        mov   r3,a

        clr   c
        mov   a,#0ffh
        subb  a,r4
        mov   a,#0fh
        subb  a,r3
        jc    aoddd2
        ret
aoddd2: mov   r3,#0fh
        mov   r4,#0ffh
        ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BUFS:   MOV   C,P              ;串行发送
        MOV   TB8,C
        MOV   SBUF,A
BUF0:   JBC   TI,BUF1          ; TI=1,返回,并清C
        SJMP  BUF0
BUF1:   RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET232:                    ;[串行口初始化]
        MOV   TMOD,#21H    ;定时器1的工作方式为2
        MOV   TH0,#4BH     ;定时器0的工作方式为1
        MOV   TL0,#0FFH
        SETB  TR0
        SETB  TR1
        SETB  ET0
        MOV   SCON,#0D0H   ;串行口工作方式3
        MOV   PCON,#00H
        SETB  ES
        SETB  EA

        MOV   TIMES,#00H
        MOV   TIMESE,#00H

        clr   ssiomark
        mov   ssiotime,#00h
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIMEINT:PUSH  ACC         ;定时器0中断
        PUSH  PSW
        MOV   TH0,#4BH
        MOV   TL0,#0FFH

        inc   dotime
        mov   a,dotime
        cjne  a,#14h,tint00   ;1eh--1.5s,14h--1s
tint00: jc    tint01
        mov   dotime,#13h
        orl   34h,#0fh
        orl   p2,#0fh

tint01: INC   TIMES
        MOV   A,TIMES
        CJNE  A,#0A0H,TINT0
TINT0:  JC    TINT
        MOV   TIMES,#00H
        INC   TIMESE
        MOV   A,TIMESE
        CJNE  A,#04H,TINT1
TINT1:  JC    TINT
        MOV   TIMESE,#00H
TINT:   POP   PSW
        POP   ACC
        RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
//DISPLAY:mov   a,#38h   省略了显示部分
       ;;;;;;;;;;;;;;;;;;;;;
CHABIAO1: MOV   R7,#16
          LJMP  CHABIAO4
CHABIAO2: MOV   R7,#04
          LJMP  CHABIAO4
CHABIAO3: MOV   R7,#08
chabiao4: CLR   A
          MOVC  A,@A+DPTR
          LCALL WDATA
          INC   DPTR
          DJNZ  R7,CHABIAO4
          RET
;;;;;;;;;;;;;;;;;;;;;
DISAIASC:MOV   R7,#04H
DISAASC: MOV   A,@R0
         LCALL WDATA
         INC   R0
         DJNZ  R7,DISAASC
         MOV   A,#20H
         LCALL WDATA
         RET
;;;;;;;;;;;;;;;;;;;;;
ASCASC:  MOV   A,@R0
         cjne  a,#41h,ascasc00
         mov   r2,#30h
         mov   r3,#30h
         mov   r4,#30h
         mov   r5,#30h
         ljmp  ascasc4

ascasc00:LCALL ASCH
         SWAP  A
         MOV   R2,A
         INC   R0
         MOV   A,@R0
         LCALL ASCH
         ADD   A,R2
         MOV   R2,A
         INC   R0
         MOV   A,@R0
         LCALL ASCH
         SWAP  A
         MOV   R3,A
         INC   R0
         MOV   A,@R0
         LCALL ASCH
         ADD   A,R3
         MOV   R3,A

         LCALL BH2

         MOV   R6,#06H
         MOV   R7,#40H
         LCALL MULD
         mov   r6,#0fh
         mov   r7,#0a0h
         lcall divd
         mov   c,ov
         jc    ascasc0
         mov   r7,03h
         mov   r6,02h
         ljmp  ascasc1
ascasc0: mov   r7,#00h
         mov   r6,#00h
ascasc1: MOV  A,R7
         ADD  A,#90H
         MOV  R7,A
         MOV  A,R6
         ADDC A,#01H
         MOV  R6,A

         clr   c
         mov   a,#0d0h
         subb  a,r7
         mov   a,#07h
         subb  a,r6
         jc    ascasc2
         ljmp  ascasc3
ascasc2: mov   r6,#07h
         mov   r7,#0d0h

ascasc3: LCALL HB2
         MOV   A,R5
         ANL   A,#0FH
         MOV   R3,A
         MOV   A,R5
         ANL   A,#0F0H
         SWAP  A
         MOV   R2,A
         MOV   A,R4
         ANL   A,#0FH
         MOV   R5,A
         MOV   A,R4
         ANL   A,#0F0H
         SWAP  A
         MOV   R4,A

         ORL   04H,#30H
         ORL   05H,#30H
         ORL   02H,#30H
         ORL   03H,#30H

ascasc4: MOV   A,R4
         LCALL WDATA
         MOV   A,R5
         LCALL WDATA
         MOV   A,#2EH
         LCALL WDATA
         MOV   A,R2
         LCALL WDATA
         MOV   A,R3
         LCALL WDATA
         MOV   A,#6DH
         LCALL WDATA
         MOV   A,#41H
         LCALL WDATA
         RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;
LCDSET: MOV   R7,#8
DLY30:  LCALL DELAY
        DJNZ  R7,DLY30
        SETB  RS
        SETB  RW
        clr   EN

        mov   a,#38h
        lcall wopt
        lcall delay2

        mov   a,#38h
        lcall wopt
        lcall delay2

        mov   a,#38H
        lcall wopt
        lcall delay2

        mov   a,#38H
        lcall woption
        lcall delay2

        mov   a,#0CH
        lcall woption
        lcall delay2

        mov   a,#01h
        lcall woption
        LCALL DELAY2

        mov   a,#06h
        lcall woption
        lcall delay2
        ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;
woption:LCALL RDBUSY
wopt:   clr  RS
        clr  RW
        setb EN
        mov  p0,a
        clr  EN
        setb RW
        setb RS
        ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;
wdata:  LCALL RDBUSY
        setb RS
        clr  RW
        setb EN
        mov  p0,a
        clr  EN
        setb RW
        clr  RS
        ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;
rdbusy: PUSH ACC
        mov  lcdbusy,#04h
rdbusy0:mov  p0,#0ffh
        clr  RS
        setb RW
        setb EN
        MOV  A,P0
        clr  EN
        SETB RW
        setb RS
        djnz lcdbusy,rdbusy1
        pop  acc
        ret
rdbusy1:jb   acc.7,rdbusy0
        POP  ACC
        ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:  MOV  R5,#0FFH
DL1:    MOV  R6,#0FFH
        DJNZ R6,$
        DJNZ R5,DL1
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY2: MOV  R6,#08H
        DJNZ R6,$
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHATAB1:DB   41H,64H,64H,72H      ;Address:
        DB   65H,73H,73H,3AH
CHATAB2:DB   42H,61H,75H,64H      ;Baud rate:300
        DB   20H,72H,61H,74H
        DB   65H,3AH,33H,30H
        DB   30H,20H,20H,20H
CHATAB3:DB   42H,61H,75H,64H      ;Baud rate:600
        DB   20H,72H,61H,74H
        DB   65H,3AH,36H,30H
        DB   30H,20H,20H,20H
CHATAB4:DB   42H,61H,75H,64H      ;Baud rate:1200
        DB   20H,72H,61H,74H
        DB   65H,3AH,31H,32H
        DB   30H,30H,20H,20H
CHATAB5:DB   42H,61H,75H,64H      ;Baud rate:2400
        DB   20H,72H,61H,74H
        DB   65H,3AH,32H,34H
        DB   30H,30H,20H,20H
CHATAB6:DB   42H,61H,75H,64H      ;Baud rate:4800
        DB   20H,72H,61H,74H
        DB   65H,3AH,34H,38H
        DB   30H,30H,20H,20H
CHATAB7:DB   42H,61H,75H,64H      ;Baud rate:9600
        DB   20H,72H,61H,74H
        DB   65H,3AH,39H,36H
        DB   30H,30H,20H,20H
CHATAB8:DB   41H,69H,30H,3AH      ;Ai0:
CHATAB9:DB   41H,69H,31H,3AH      ;Ai1:
CHATABA:DB   41H,69H,32H,3AH      ;Ai2:
CHATABB:DB   41H,69H,33H,3AH      ;Ai3:
CHATABC:DB   41H,6FH,30H,3AH      ;Ao0:
CHATABD:DB   41H,6FH,31H,3AH      ;Ao1:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;以下为运算子程序:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;HB2   功能:双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在R6、R7中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;影响资源:PSW、A、R2~R7    堆栈需求:  2字节
HB2:    CLR    A         ;     ;BCD码初始化
    MOV    R3,A
    MOV    R4,A
    MOV    R5,A
    MOV    R2,#10H   ;    ;转换双字节十六进制整数
HB3:    MOV    A,R7   ;    ;从高端移出待转换数的一位到CY中
    RLC    A
    MOV    R7,A
    MOV    A,R6
    RLC    A
    MOV    R6,A
    MOV    A,R5   ;    ;BCD码带进位自身相加,相当于乘2
    ADDC    A,R5
    DA    A      ;    ;十进制调整
    MOV    R5,A
    MOV    A,R4
    ADDC    A,R4
    DA    A
    MOV    R4,A
    MOV    A,R3
    ADDC    A,R3
    MOV    R3,A;    ;双字节十六进制数的万位数不超过6,不用调整
    DJNZ    R2,HB3;    ;处理完16bit
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;HBCD  功能:单字节十六进制整数转换成单字节BCD码整数
;入口条件:待转换的单字节十六进制整数在累加器A中。
;出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。
;影响资源:PSW、A、B、R3    堆栈需求:  2字节
HBCD:    MOV    B,#100;    ;分离出百位,存放在R3中
    DIV    AB
    MOV    R3,A
    MOV    A,#10;    ;余数继续分离十位和个位
    XCH    A,B
    DIV    AB
    SWAP    A
    ORL    A,B;    ;将十位和个位拼装成BCD码
    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; HASC  功能:单字节十六进制数转换成双字节ASCII码
;入口条件:待转换的单字节十六进制数在累加器A中。
;出口信息:高四位的ASCII码在A中,低四位的ASCII码在B中。
;影响资源:PSW、A、B    堆栈需求:  4字节
HASC:    MOV    B,A;    ;暂存待转换的单字节十六进制数
    LCALL    HAS1;    ;转换低四位
    XCH    A,B;    ;存放低四位的ASCII码
    SWAP    A;    ;准备转换高四位
HAS1:    ANL    A,#0FH;    ;将累加器的低四位转换成ASCII码
    ADD    A,#90H
    DA    A
    ADDC    A,#40H
    DA    A
    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ASCH    功能:ASCII码转换成十六进制数
;入口条件:待转换的ASCII码(30H~39H或41H~46H)在A中。
;出口信息:转换后的十六进制数(00H~0FH)仍在累加器A中。
;影响资源:PSW、A    堆栈需求:  2字节
ASCH:    CLR    C
    SUBB    A,#30H
    JNB    ACC.4,ASH1
    SUBB    A,#7
ASH1:    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;BCDH    功能:单字节BCD码整数转换成单字节十六进制整数
;入口条件:待转换的单字节BCD码整数在累加器A中。
;出口信息:转换后的单字节十六进制整数仍在累加器A中。
;影响资源:PSW、A、B、R4    堆栈需求:  2字节
BCDH:    MOV    B,#10H;    ;分离十位和个位
    DIV    AB
    MOV    R4,B;    ;暂存个位
    MOV    B,#10;    ;将十位转换成十六进制
    MUL    AB
    ADD    A,R4;    ;按十六进制加上个位
    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;BH2   功能:双字节BCD码整数转换成双字节十六进制整数
;入口条件:待转换的双字节BCD码整数在R2、R3中。
;出口信息:转换后的双字节十六进制整数仍在R2、R3中。
;影响资源:PSW、A、B、R2、R3、R4    堆栈需求:  4字节
BH2:    MOV    A,R3;    ;将低字节转换成十六进制
        LCALL    BCDH
    MOV    R3,A
    MOV    A,R2;    ;将高字节转换成十六进制
    LCALL    BCDH
    MOV    B,#100;    ;扩大一百倍
    MUL    AB
    ADD    A,R3;    ;和低字节按十六进制相加
    MOV    R3,A
    CLR    A
    ADDC    A,B
    MOV    R2,A
    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;MULD    功能:双字节二进制无符号数乘法
;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7    堆栈需求:  2字节
MULD:    MOV    A,R3;    ;计算R3乘R7
    MOV    B,R7
MUL    AB
    MOV    R4,B;    ;暂存部分积
    MOV    R5,A
    MOV    A,R3;    ;计算R3乘R6
    MOV    B,R6
    MUL    AB
    ADD    A,R4;    ;累加部分积
    MOV    R4,A
    CLR    A
    ADDC    A,B
    MOV    R3,A
    MOV    A,R2;    ;计算R2乘R7
    MOV    B,R7
    MUL    AB
    ADD    A,R4;    ;累加部分积
    MOV    R4,A
    MOV    A,R3
    ADDC    A,B
    MOV    R3,A
    CLR    A
    RLC    A
    XCH    A,R2;    ;计算R2乘R6
    MOV    B,R6
    MUL    AB
    ADD    A,R3;    ;累加部分积
    MOV    R3,A
    MOV    A,R2
    ADDC    A,B
    MOV    R2,A
    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;DIVD    功能:双字节二进制无符号数除法

;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
;影响资源:PSW、A、B、R1~R7    堆栈需求:  2字节

DIVD:    CLR    C    ;;比较被除数和除数
    MOV    A,R3
    SUBB    A,R7
    MOV    A,R2
    SUBB    A,R6
    JC    DVD1
    SETB    OV    ;;溢出
    RET
DVD1:    MOV    B,#10H    ;;计算双字节商

DVD2:    CLR    C    ;;部分商和余数同时左移一位
    MOV    A,R5
    RLC    A
    MOV    R5,A
    MOV    A,R4
    RLC    A
    MOV    R4,A
    MOV    A,R3
    RLC    A
    MOV    R3,A
    XCH    A,R2
    RLC    A
    XCH    A,R2
    MOV    F0,C    ;;保存溢出位
    CLR    C
    SUBB    A,R7    ;;计算(R2R3-R6R7)
    MOV    R1,A
    MOV    A,R2
    SUBB    A,R6
    ANL    C,/F0    ;;结果判断
    JC    DVD3
    MOV    R2,A    ;;够减,存放新的余数
    MOV    A,R1
    MOV    R3,A
    INC    R5    ;;商的低位置一
DVD3:    DJNZ    B,DVD2    ;;计算完十六位商(R4R5)
    MOV    A,R4    ;;将商移到R2R3中

MOV    R2,A
    MOV    A,R5
    MOV    R3,A
    CLR    OV    ;;设立成功标志
    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        END


DAOUT: MOV DAAH,#0C8H
       MOV DAAL,#03H
       MOV DABH,#5FH
       MOV DABL,#0FFH
        
       MOV A,DABH
       CLR C
       SETB SCLK
       CLR DACS
       MOV R6,#02H
DA10:  MOV R7,#08H
DA11:  SETB SCLK
       RLC A
       MOV DAIN,C
       CLR SCLK
       DJNZ R7,DA11
       MOV A,DABL
       DJNZ R6,DA10
       SETB SCLK
       SETB DACS
       CLR SCLK
      
       MOV A,DAAH
       CLR C
       SETB SCLK
       CLR DACS
       MOV R6 ,#02H
DA20:  MOV R7,#08H
DA21:  SETB SCLK
       RLC A
       MOV DAIN,C
       CLR SCLK
       DJNZ R7,DA21
       MOV A,DAAL
       DJNZ R6.DA20
       SETB SCLK
       SETB DACS
       CLR SCLK
       RET
SSIO:  PUSH ACC
       PUSH PSW
       PUSH 01H
LOOP1: CLR RI
       MOV A,SBUF
       JNB PSW.0,LOOP10
       JNB RB8,BACK
       LJMP LOOP11
LOOP10:JB RB8,BACK
LOOP11:MOV SSIOSBUF,A
       MOV A,SSIOTIME
       CJNE A,#00H,LOOP2
       MOV A,SSIOSBUF
       CJNE A,#02H,BACK
LOOP2: MOV A,#50H
       ADD A,SSIOTIME
       MOV R1,A
       MOV @R1,SSIOBUF
       MOV A,SSIOSBUF
       CJNE A,#ODH,LOOP3
       SETB SSIOMARK
       CLR ES
       LJMP BACK1
LOOP3: INC SSIOTIME
       MOV A,SSIOTIME
       CJNE A,#10H,LOOP4
LOOP4: JC BACK1
BACK:  MOV SSIOTIME,#00H
BACK1: POP 01H
       POP PSW
       POP ACC
       RETI




1.1硬件设置
(1)物理规范
RS232  RS485
(2)字符格式
起始位:1位
数据位:8位
奇偶位:偶、奇、无
停止位:1、1.5、2
波特率:300、600、1200、2400、4800、9600
1.2消息格式
<消息头><命令字><站地址><数据><校验><消息尾>
消息头    STX : H02
消息尾    DTX : H0D
校验    命令节+站地址+…,取和最低位一个字节,并将其按ASCII转化为2个字符,如0x01转化为0x30,0x31
1.3命令字
(1)读数据命令
STX    RR    ADD    CHSUM    ETX
RR: 2字节    ADD: 2字节        CHKSUM: 2字节        共:8字节
回应
STX    RR    ADD    AI1    AI2    AI3    AI4    .

.    AO1    AO2    DI1    DI2    CHKSUM    ETX
RR: 2字节    ADD: 2字节        A: 四字节    D: 1字节    CHKSUM: 2字节        
共: 34字节
(2)写开关量
STX    WD    ADD    DATA    CHKSUM    ETX
WD: 2字节    ADD: 2字节        DATA: 二进制 1 字节        CHKSUM: 2字节
共:9字节

A机选择:    0x01
B机选择:    0x02
关机:          0x04
远程通断:    0x10
省略了采集数据部分(太长)部分以及显示display部分。

搜索更多相关主题的帖子: 定义 modbus 通信协议 
2010-09-21 13:39
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:7 
汇编的吧》
太长了
懒得看
这种工作要我们帮忙 不会就给专家分就打发了吧
请枪吧

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-09-21 14:17
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:7 
太长了!! 汇编还没学 不懂

清风拂暮(木)
2010-09-22 01:03
快速回复:急!!帮我把自定义通信协议改为modbus通信协议
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039303 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved