rs485_com.asm
来自「串口232汇编接收发送原代码,接收协议可以根据自己的需要更改」· 汇编 代码 · 共 313 行
ASM
313 行
;************************************************************
;IR_receive sub programm
;************************************************************
$include (ram.inc)
$include (io.inc)
$include (pl3201.inc)
extrn code(delay_10ms)
code_reg segment code
rseg code_reg
public rs485_com
public rs485_receive_next2
;****************************************************
;com0 intermit
;****************************************************
rs485_receive_next2:
mov tmr_r,#00h
clr lcd_m10
clr lcd_m9
;lcd_1m
setb p_rs485_cs ;receive
clr rs485_IR ;sign rs485 or infrared
mov scon1,#0d0h ;485
mov scon,#0d0h ;红外
setb es1
setb es
ret
rs485_com:
jb eri,rs485_receive_begin ;接收标志
jb IR_trans_end,rs485_receive_next2 ;发送完标志
jb eti,rs485_send_begin0 ;发送标志
ret
rs485_send_begin0:
jmp rs485_send_begin ;judge receive
rs485_receive_begin:
clr eri
push psw
push acc
push b
push dph
push dpl
mov a,ext_adr
push acc
setb psw.3
clr psw.4;通用工作状态寄存器选择1区
mov tmr_r,#0
mov dph,#02h
mov dpl,r4
mov ext_adr,#0feh
mov ext_dat,#04h
mov a,sbuf1
mov c,psw.0
anl c,/erb8;判断奇偶校验位,erb8发送数据的第九位即奇偶校验位,/erb8取反
jc rs485_receive_stop
mov r3,sbuf1
cjne r2,#0,rs485_received
cjne a,#68h,rs485_receive_stop;判断是否为帧起始符
setb lcd_m10
;clr lcd_m9
clr es;关闭串行中断 ;
mov r0,a
mov r1,#6;六字节地址域
mov dptr,#IR_address
mov r2,#1
jmp rs485_ret
rs485_received:
mov ext_adr,#08h
mov ext_dat,#82h
call rcv_rs485_addr
rs485_ret:
mov ext_adr,#08h;06
mov ext_dat,#02h
clr c
mov r4,dpl
pop acc
mov ext_adr,a
pop dpl
pop dph
pop b
pop acc
pop psw
jb rs485_occur,rs485_receive_next1
mov tmr_r,#20
rs485_receive_next1:
ret
rs485_receive_stop:
mov r2,#0
call rs485_receive_next2
jmp rs485_ret
;****************************************************
;PUBLIC RCV_HW_ADDR
;****************************************************
rcv_rs485_addr:
cjne r2,#1,rs485_next2 ;接收6位表号
movx @dptr,a
add a,r0
mov r0,a
inc dptr
djnz r1,rs485_ret1
mov r2,#2
ret
rs485_next2:
cjne r2,#2,rs485_next3 ;接收帧超始符
cjne a,#68h,rs485_err
add a,r0
mov r0,a ;校验和
mov r2,#3
rs485_ret1: ret
rs485_next3:
cjne r2,#3,rs485_next4 ;接收控制码
mov dptr,#IR_control_code
movx @dptr,a
add a,r0
mov r0,a ;校验和
mov r2,#4
ret
rs485_err:
mov r2,#0
ret
rs485_next4:
cjne r2,#4,rs485_next5 ;数据长度<31
mov r1,a
mov dptr,#IR_data_length
movx @dptr,a
add a,r0
mov r0,a ;校验和
mov a,r1
clr c
subb a,#50 ; 2004.6.7,最大数据长度#40
jnc rs485_err
mov dptr,#IR_frame_data
mov r2,#5
ret
rs485_next5:
cjne r2,#5,rs485_next6 ;接收数据体
mov a,r1
jz rs485_next66
clr c
mov a,dpl
subb a,#60 ;#HW_BUF26冗余判断
jnc rs485_err
mov a,r3
mov b,a
clr c
subb a,#33h ;减33处理
movx @dptr,a
inc dptr
mov a,b
add a,r0 ;校验和,与未减33的数据相相加
mov r0,a
djnz r1,rs485_ret1
mov r2,#6
ret
rs485_next6: cjne R2,#6,rs485_next7 ;接收校验
rs485_next66:
mov a,r3 ;mov A,SBUF
mov b,r0
cjne a,b,rs485_err
mov r2,#7
ret
rs485_next7:
cjne r2,#7,rs485_loop
cjne a,#16h,rs485_err ;接收结束符
setb rs485_occur ;红外数据包收到标志
setb rs485_IR
clr IR_trans_end
clr p_rs485_cs
mov scon1,#0c0h ;485 禁止接收
rs485_loop:
mov r2,#0
ret
;******************************************************
rs485_send_1:
mov r3,#10
jmp rs485_send_11
rs485_send_begin:
clr eti
push psw
push acc
push b
push dph
push dpl
mov a,ext_adr
push acc
mov tmr_r,#0
setb psw.3
clr psw.4
clr lcd_m10
setb lcd_m9
mov ext_adr,#08h;06
mov ext_dat,#82h
mov dph,#02h
mov dpl,r4
cjne r2,#0,rs485_send_head
mov tmr_r,#30
mov a,#0feh
call com_send1
mov r2,#1
mov dptr,#IR_frame_beg1
mov a,#68h
movx @dptr,a
mov dptr,#IR_frame_beg2
movx @dptr,a
mov dptr,#IR_data_length
movx a,@dptr
mov r1,a ;LENGHT存R1
mov r0,#0 ;校验和初值
mov dptr,#IR_frame_data
movx a,@dptr
cjne a,#00h, rs485_send_1
mov r3,#11 ;2004.6.9,从68H至HW_L的10字节
rs485_send_11:
mov dptr,#IR_frame_beg1
rs485_send_end:
clr c
mov r4,dpl
pop acc
mov ext_adr,a
pop dpl
pop dph
pop b
pop acc
pop psw
mov scon1,#0c0h ;485 禁止接收
ret
rs485_send_head:
cjne r2,#1,rs485_send_data
movx a,@dptr
call com_send1
add a,r0
mov r0,a;校验和
clr a
movx @dptr,a
inc dptr
djnz r3,rs485_send_end;r3=10发送前10个字节即:两个字节的帧起始符,六个字节地址域,控制码和数据长度
;mov dptr,#IR_data_length
;movx a,@dptr
;call com_send1
;add a,r0
;mov r0,a
;clr a
mov r2,#2
mov a,r1
jz rs485_send_chk1
mov dptr,#IR_frame_data
jmp rs485_send_end
rs485_send_data:
cjne r2,#2,rs485_send_chk
movx a,@dptr
add a,#33h
call com_send1 ;发送数据
add a,r0;校验和
mov r0,a
clr a
movx @dptr,a
inc dptr
djnz r1,rs485_send_end;r1的值为数据长度
mov r2,#3
jmp rs485_send_end
rs485_send_chk:
cjne r2,#3,rs485_send_16
rs485_send_chk1:
mov a,r0 ;SEND 校验和
call com_send1
mov r2,#4
jmp rs485_send_end
rs485_send_16:
cjne r2,#4,rs485_send_end
mov a,#16h ;SEND 结束符
call com_send1
setb IR_trans_end
clr rs485_IR
mov infrared_err,#0 ;CLR 错误信息
mov r2,#0
clr lcd_m10
clr lcd_m9
mov ext_adr,#08h
mov ext_dat,#02h
pop acc
mov ext_adr,a
pop dpl
pop dph
pop b
pop acc
pop psw
ret
;**************************************************************
;MOV要发送的数据TO A
;**************************************************************
com_send1:
mov c,p ;PSW.0=P
mov etb8,c
mov sbuf1,a
; mov tmr_r,#20
ret
end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?