急!!帮我把自定义通信协议改为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部分。