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 + -
显示快捷键?