📄 rc485.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 + -