⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc485.asm

📁 采用16F877实现的485接送通讯。内含CRC校验
💻 ASM
字号:
#INCLUDE P16F877.INC
		CBLOCK	20H
R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,CRC_HI,CRC_LW,RC_COUNTER,BLO,BHI,T1,T2,BUF	
	ENDC
	CBLOCK	70H
W_TEMP,STATUS_TEMP,PCLATH_TEMP
	ENDC
#DEFINE	LED1	PORTC,2
#DEFINE	LED2	PORTC,3
#DEFINE	LED3	PORTC,4
#DEFINE	LED4	PORTC,5
	
	ORG	0000H
	NOP
	GOTO	MAIN
	ORG	0004H
	GOTO	INT_SER
MAIN
	MOVLW	B'11000000'
	MOVWF	INTCON
	BSF	STATUS,RP0
	MOVLW	B'00100000'
	MOVWF	PIE1
	BCF	STATUS,RP0
	CALL	USART_CSH
	MOVLW	50H
	MOVWF	FSR
	MOVLW	00H
	MOVWF	RC_COUNTER
	GOTO	$
;------------------------------------------------------------------
;中断服务子程序
;------------------------------------------------------------------
INT_SER
	MOVWF	W_TEMP
	SWAPF	STATUS,W
	MOVWF	STATUS_TEMP
	MOVF	PCLATH,W
	MOVWF	PCLATH_TEMP
	
	CLRF	PIR1
	
	MOVF	RCREG,W
	MOVWF	INDF
	MOVF	FSR,W
	MOVWF	R11
	CALL	DISP
	MOVF	R11,W
	MOVWF	FSR
	INCF	FSR
	INCF	RC_COUNTER
	MOVLW	.5	
	SUBWF	RC_COUNTER,W	;判断是否收到5个数据
	BTFSS	STATUS,Z	
	GOTO	RET		;没收到5个,跳出中断继续等待
;-----------------------------------------------------------	
;收到5个数据后,进行CRC校验
;-----------------------------------------------------------	
RECE1	
	CALL	CRC_CSH		;前3个数据进行CRC校验
	MOVF	50H,W
	CALL	CRC_SUB
RECE2	
	MOVF	51H,W
	CALL	CRC_SUB
RECE3	
	MOVF	52H,W
	CALL	CRC_SUB

RECE4	
	MOVF	53H,W		;收到的CRC_LW放在55H,和上面计
	SUBWF	CRC_LW,W	;算出的CRC_LW进行比较是否相同
	BTFSS	STATUS,Z
	GOTO	ERR		;CRC校验不正确
RECE5	
	MOVF	54H,W		;CRC_LW校验正确,继续比较CRC_HI
	SUBWF	CRC_HI,W
	BTFSS	STATUS,Z
	GOTO	ERR		;CRC校验不正确
CORR				;收到的数据CRC校验正确
	BSF	PORTB,1 	; 
	BANKSEL	TRISC		;输出PWM,蜂鸣器响
	BCF	TRISC,1
	MOVLW	.199
	MOVWF	PR2
	BANKSEL	PORTC
	MOVLW	3CH
	MOVWF	CCPR2L
	MOVLW	B'00001100'
	MOVWF	CCP2CON
	MOVLW	B'00000100'
	MOVWF	T2CON
	CALL	DELAY_1S
	CLRF	T2CON		;延时一秒后关闭PWM
SEND				;并回送报文
	
	MOVLW	05H
	MOVWF	TXREG
	CALL	DISP
	MOVLW	05H	
	CALL	CRC_SUB
	CALL	DELAY_5MS

	MOVLW	04H
	MOVWF	TXREG
	CALL	DISP
	MOVLW	04H	
	CALL	CRC_SUB
	CALL	DELAY_5MS

	MOVLW	.51
	MOVWF	TXREG
	CALL	DISP
	MOVLW	.51
	CALL	CRC_SUB
	CALL	DELAY_5MS
	
	MOVLW	.52
	MOVWF	TXREG
	CALL	DISP
	MOVLW	.52
	CALL	CRC_SUB
	CALL	DELAY_5MS
	
	MOVLW	.53
	MOVWF	TXREG
	CALL	DISP
	MOVLW	.53
	CALL	CRC_SUB
	CALL	DELAY_5MS
	
	
	MOVF	CRC_LW,W
	MOVWF	TXREG
	CALL	DISP
	MOVF	CRC_LW,W
	CALL	DELAY_5MS

	MOVF	CRC_HI,W
	MOVWF	TXREG
	CALL	DISP
	MOVF	CRC_HI,W
	CALL	DELAY_5MS
	
	
ERR	
		
	CLRF	RC_COUNTER
	MOVLW	50H
	MOVWF	FSR
	
	
RET	
	MOVF	PCLATH_TEMP,W
	MOVWF	PCLATH
	SWAPF	STATUS_TEMP,W
	MOVWF	STATUS
	SWAPF	W_TEMP,F
	SWAPF	W_TEMP,W
	RETFIE



;-----------------------------------------------------------	
;异步通信初始化程序
;-----------------------------------------------------------
USART_CSH
	BSF	STATUS,RP0
	MOVLW	B'10000000'
	MOVWF	TRISC
	CLRF	TRISB
	MOVLW	.51
	MOVWF	SPBRG
	MOVLW	B'00100100'
	MOVWF	TXSTA
	;CLRF	PIE1
	CLRF	PORTB
	BCF	STATUS,RP0
	MOVLW	B'10010000'
	MOVWF	RCSTA
	
	RETURN
;-----------------------------------------------------------	
;CRC初始化
;-----------------------------------------------------------

CRC_CSH
	MOVLW	0FFH
	MOVWF	CRC_LW
	MOVWF	CRC_HI
	RETURN
;-----------------------------------------------------------	
;CRC运算
;-----------------------------------------------------------

CRC_SUB
	XORWF	CRC_LW,F
	MOVLW	.8
	MOVWF	R0
L3
	BCF	STATUS,C
	RRF	CRC_HI,F
	RRF	CRC_LW,F
	BTFSS	STATUS,C
	GOTO 	L5
	MOVLW	0A0H
	XORWF	CRC_HI,F
	MOVLW	01H
	XORWF	CRC_LW,F
L5
	DECFSZ	R0,F
	GOTO	L3	
	RETURN

;-----------------------------------------------------------	
;显示程序
;-----------------------------------------------------------
DISP
	MOVWF	BLO
	CLRF	BHI
	CALL	B2BCD
	;BANKSEL	TRISC
	;CLRF	TRISC
	;CLRF	TRISD
	;BANKSEL	PORTC
	;CLRF	PORTC
DISPLAY_2
	MOVLW	.50
	MOVWF	R10	
	SWAPF	R6,W
	ANDLW	0FH
	CALL	LED_CODE
	MOVWF	PORTD
	BCF	LED1
	NOP	
	BCF	LED2
	NOP
	BCF	LED4
	NOP
	BSF	LED3
	NOP
	CALL	DELAY_5MS

	MOVF	R6,W
	ANDLW	0FH
	CALL	LED_CODE
	MOVWF	PORTD
	BCF	LED1
	NOP	
	BCF	LED2
	NOP
	BCF	LED3
	NOP
	BSF	LED4
	NOP
	CALL	DELAY_5MS
			
	DECFSZ	R10
	GOTO	DISPLAY_2+2
	RETURN	
;--------------------------------------------------
;BCD转换,入口BHI,BLO,出口,R4,R5,R6
;-------------------------------------------------
B2BCD
	BCF	STATUS,C
	MOVLW	.16
	MOVWF	T1
	CLRF	R4
	CLRF	R5
	CLRF	R6
LOOP16
	RLF	BLO,F
	RLF	BHI,F
	RLF	R6,F
	RLF	R5,F
	RLF	R4,F
	DECFSZ	T1,F
	GOTO	ADJDEC
	RETURN
;--------------
;BCD
;-------------
ADJDEC	MOVLW	R6
	MOVWF	FSR
	CALL	ADJBCD
	MOVLW	R5
	MOVWF	FSR
	CALL	ADJBCD
	MOVLW	R4
	MOVWF	FSR
	CALL	ADJBCD
	GOTO	LOOP16
ADJBCD	MOVLW	.3
	ADDWF	INDF,W
	MOVWF	T2
	BTFSC	T2,3
	MOVWF	INDF
	MOVLW	30H
	ADDWF	INDF,W
	MOVWF	T2
	BTFSC	T2,7
	MOVWF	INDF
	RETURN		

;------------------------------------
;LED
;----------------------------------
LED_CODE
	MOVWF	BUF
	MOVLW	HIGH LABEL1
	MOVWF	PCLATH
	MOVF	BUF,W
LABEL1
	ADDWF	PCL,F
	RETLW	B'11000000'		;0
	RETLW	B'11111001'		;1
	RETLW	B'10100100'		;2
	RETLW	B'10110000'		;3
	RETLW	B'10011001'		;4
	RETLW	B'10010010'		;5
	RETLW	B'10000010'		;6
	RETLW	B'11111000'		;7
	RETLW	B'10000000'		;8
	RETLW	B'10010000'		;9
	RETURN
	

	

;-----------------------------------------------------------	
;延时5MS程序
;-----------------------------------------------------------

DELAY_5MS
	MOVLW .5
LOOP
	MOVWF R2
	MOVLW .200
	MOVWF R3
	GOTO $+1 
	DECFSZ R3,F
	GOTO $-2
	DECFSZ R2,F
	GOTO LOOP+1
	RETURN

;-----------------------------------------------------------	
;延时1S程序
;-----------------------------------------------------------
DELAY_1S
	MOVLW	06H
	MOVWF	R7
LOOP1	MOVLW	0EBH
	MOVWF	R8
LOOP2	MOVLW	0ECH
	MOVWF	R9
LOOP3	DECFSZ	R9
	GOTO	LOOP3
	DECFSZ	R8
	GOTO	LOOP2
	DECFSZ	R7
	GOTO	LOOP1
	RETURN

	
	END
;尚未完成的工作:显示程序,和正确错误的时候的处理过程	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -