📄 fangqu_v3.asm
字号:
;BANK0 Address:0x20-0x4F variable register
; :0x50-0x7F for save messages to be sent to DSP
;BANK1 Address:0xA0-0xFF for save messages sent by the decorder
#include <p16f876A.inc>
WAIT1 EQU 20 ;延时内循环寄存器
WAIT2 EQU 21 ;延时外循环寄存器
WAIT3 EQU 22 ;延时内循环寄存器
WAIT4 EQU 23 ;延时外循环寄存器
WAIT5 EQU 24 ;延时内循环寄存器
WAIT6 EQU 25 ;延时外循环寄存器
REGEST1 EQU 26 ;防区1-防区8正常状态/普通报警状态
REGEST2 EQU 27 ;防区1-防区8的TAMPER状态
SAMPLE EQU 28 ;暂时存放防区1--防区8的采样结果
SENDBIT EQU 2A
SENDBUF EQU 2B
RECE_LENGTH1 EQU 2D
RECE_LENGTH2 EQU 2E
TEMP_LENGTH EQU 2F
RECE_LENGTH EQU 30
TEL_NUMH EQU 31
TEL_NUML EQU 32
RECE_COMD EQU 33
TEMPADDR1 EQU 34
TEMPADDR2 EQU 35
W_TEMP EQU 36
STATUS_TEMP EQU 37
TEMP EQU 38
FLAG EQU 39
RECE_BYTE EQU 40
REC_CRC EQU 41
ACK_DISPLAY EQU 42
CHECKSUM EQU 43
FRAME_SYNCHAR1 EQU 50
FRAME_SYNCHAR2 EQU 51
SEND_LENGTH EQU 52
PACKET_COUNT EQU 53
PACKET_NUM EQU 54
SEND_COMD EQU 55
SEND_CHECKSUM EQU 7E
SEND_ENDCHAR EQU 7F
;----- FLAG Bits --------------------------------------------------------
MSG_SEND EQU 7
RXD_START EQU 6
LEN_OK EQU 5
MSG_LONG EQU 4 ;MSG_LONG=1,long messages,MSG_LONG=0,short messages
FRAME_HEAD EQU 3
SENSOR_STATUS EQU 1 ;SENSOR_STATUS=1,the sensor is connected;SENSOR_STATUS=0,the sensor is not connected
TEMPER_STATUS EQU 0 ;TEMPER_STATUS=1,alarm;TEMPER_STATUS=0,not alarm
;----- MACRO DEFINITION --------------------------------------
PUSH_MACRO MACRO ; This Macro Saves register contents
MOVWF W_TEMP ; Copy W to a Temporary Register
; regardless of current bank
SWAPF STATUS,W ; Swap STATUS nibbles and place
; into W register
MOVWF STATUS_TEMP ; Save STATUS to a Temporary register
; in Bank0
ENDM ; End this Macro
POP_MACRO MACRO ; This Macro Restores register contents
SWAPF STATUS_TEMP,W ; Swap original STATUS register value
; into W (restores original bank)
MOVWF STATUS ; Restore STATUS register from
; W register
SWAPF W_TEMP,F ; Swap W_Temp nibbles and return
; value to W_Temp
SWAPF W_TEMP,W ; Swap W_Temp to W to restore original
; W value without affecting STATUS
ENDM ; End this Macro
;-----------------------------------------------------------------
org 00h
goto START
org 04h
goto INT_SER
org 20h
START:
BSF STATUS,RP0 ;BANK1
MOVLW 0xFF
MOVWF TRISA
MOVLW 0xC0
MOVWF TRISB
MOVLW 0x80 ;10000000
MOVWF TRISC
BCF STATUS,RP0 ;BANK0
CLRF PORTA
CLRF PORTB
MOVLW 0xC1 ;1100 0001
MOVWF PORTC
;*************Variable initializtion***************
CLRF REGEST1 ;防区1-防区8正常状态/普通报警状态
CLRF REGEST2 ;防区1-防区8的TAMPER状态
CLRF SAMPLE ;暂时存放防区1--防区8的采样结果
CLRF SENDBIT
CLRF SENDBUF
CLRF RECE_LENGTH1
CLRF RECE_LENGTH2
CLRF TEMP_LENGTH
CLRF W_TEMP
CLRF STATUS_TEMP
CLRF REC_CRC
CLRF TEMP
CLRF FLAG
CLRF CHECKSUM
CLRF ACK_DISPLAY
CLRF RECE_COMD
CLRF RECE_BYTE
CLRF RECE_LENGTH
CLRF TEL_NUMH
CLRF TEL_NUML
;UART initializtion
BSF STATUS,RP0 ;Bank1
MOVLW 0x40 ;Baud rate = 9615
MOVWF SPBRG
BCF STATUS,RP0 ;Bank 0
CLRF RCSTA
BSF RCSTA,SPEN
CLRF PIR1
BSF STATUS,RP0 ;Bank1
CLRF TXSTA
BSF TXSTA,TXEN
BSF TXSTA,BRGH
BCF STATUS,RP0 ;Bank 0
BSF RCSTA,CREN
BSF STATUS,RP0 ;Bank1
BCF PIE1,TXIE ;Disable transmit interrupts
BSF PIE1,RCIE ;Enable receive interrupts
BSF INTCON,PEIE
BSF INTCON,GIE
BCF STATUS,RP0 ;Bank0
NOP
NOP
NOP
NOP
;************************************
MAIN:
CALL MANAGE1 ;查看防区1,通道AN4
NOP
CALL MANAGE2 ;查看防区2,通道AN4
NOP
CALL MANAGE3 ;查看防区3,通道AN4
NOP
CALL MANAGE4 ;查看防区4,通道AN4
NOP
CALL MANAGE5 ;查看防区5,通道AN4
NOP
CALL MANAGE6 ;查看防区6,通道AN4
NOP
CALL MANAGE7 ;查看防区7,通道AN4
NOP
CALL MANAGE8 ;查看防区8,通道AN4
NOP
CALL SENDSYN ;通过同步串口,发送数据到DSP
GOTO MAIN
;**********************************************
MANAGE1: ;查看防区1,通道AN4
BCF STATUS,RP0 ;BANK0
BSF PORTC,0 ;4051禁止
BCF PORTC,1 ;4051选择通道0
BCF PORTC,2 ;4051选择通道0
BCF PORTC,3 ;4051选择通道0
BCF PORTC,0 ;4051选通
CALL ADC
MOVF ADRESH,0
MOVWF SAMPLE ;防区1采样结果
CALL MANAGE
BTFSC FLAG,SENSOR_STATUS
GOTO QQ1_1
BCF REGEST1,0
GOTO QQ1_2
QQ1_1:
BSF REGEST1,0
QQ1_2:
BTFSC FLAG,TEMPER_STATUS
GOTO QQ1_3
BCF REGEST2,0
GOTO QQ1_4
QQ1_3:
BSF REGEST2,0
QQ1_4:
RETURN
;**************************************
MANAGE2: ;查看防区2,通道AN4
BCF STATUS,RP0 ;BANK0
BSF PORTC,0 ;4051禁止
BCF PORTC,1 ;4051选择通道1
BCF PORTC,2 ;4051选择通道1
BSF PORTC,3 ;4051选择通道1
BCF PORTC,0 ;4051选通
CALL ADC
MOVF ADRESH,0
MOVWF SAMPLE ;防区2采样结果
CALL MANAGE
BTFSC FLAG,SENSOR_STATUS
GOTO QQ2_1
BCF REGEST1,1
GOTO QQ2_2
QQ2_1:
BSF REGEST1,1
QQ2_2:
BTFSC FLAG,TEMPER_STATUS
GOTO QQ2_3
BCF REGEST2,1
GOTO QQ2_4
QQ2_3:
BSF REGEST2,1
QQ2_4:
RETURN
;**************************************
MANAGE3: ;查看防区3,通道AN4
BCF STATUS,RP0 ;BANK0
BSF PORTC,0 ;4051禁止
BCF PORTC,1 ;4051选择通道3
BSF PORTC,2 ;4051选择通道3
BCF PORTC,3 ;4051选择通道3
BCF PORTC,0 ;4051选通
CALL ADC
MOVF ADRESH,0
MOVWF SAMPLE ;防区3采样结果
CALL MANAGE
BTFSC FLAG,SENSOR_STATUS
GOTO QQ3_1
BCF REGEST1,2
GOTO QQ3_2
QQ3_1:
BSF REGEST1,2
QQ3_2:
BTFSC FLAG,TEMPER_STATUS
GOTO QQ3_3
BCF REGEST2,2
GOTO QQ3_4
QQ3_3:
BSF REGEST2,2
QQ3_4:
RETURN
;************************************
MANAGE4: ;查看防区4,通道AN4
BCF STATUS,RP0 ;BANK0
BSF PORTC,0 ;4051禁止
BCF PORTC,1 ;4051选择通道4
BSF PORTC,2 ;4051选择通道4
BSF PORTC,3 ;4051选择通道4
BCF PORTC,0 ;4051选通
CALL ADC
MOVF ADRESH,0
MOVWF SAMPLE ;防区4采样结果
CALL MANAGE
BTFSC FLAG,SENSOR_STATUS
GOTO QQ4_1
BCF REGEST1,3
GOTO QQ4_2
QQ4_1:
BSF REGEST1,3
QQ4_2:
BTFSC FLAG,TEMPER_STATUS
GOTO QQ4_3
BCF REGEST2,3
GOTO QQ4_4
QQ4_3:
BSF REGEST2,3
QQ4_4:
RETURN
;***********************************
MANAGE5: ;查看防区5,通道AN4
BCF STATUS,RP0 ;BANK0
BSF PORTC,0 ;4051禁止
BSF PORTC,1 ;4051选择通道5
BCF PORTC,2 ;4051选择通道5
BCF PORTC,3 ;4051选择通道5
BCF PORTC,0 ;4051选通
CALL ADC
MOVF ADRESH,0
MOVWF SAMPLE ;防区5采样结果
CALL MANAGE
BTFSC FLAG,SENSOR_STATUS
GOTO QQ5_1
BCF REGEST1,4
GOTO QQ5_2
QQ5_1:
BSF REGEST1,4
QQ5_2:
BTFSC FLAG,TEMPER_STATUS
GOTO QQ5_3
BCF REGEST2,4
GOTO QQ5_4
QQ5_3:
BSF REGEST2,4
QQ5_4:
RETURN
;************************************
MANAGE6: ;查看防区6,通道AN4
BCF STATUS,RP0 ;BANK0
BSF PORTC,0 ;4051禁止
BSF PORTC,1 ;4051选择通道6
BCF PORTC,2 ;4051选择通道6
BSF PORTC,3 ;4051选择通道6
BCF PORTC,0 ;4051选通
CALL ADC
MOVF ADRESH,0
MOVWF SAMPLE ;防区6采样结果
CALL MANAGE
BTFSC FLAG,SENSOR_STATUS
GOTO QQ6_1
BCF REGEST1,5
GOTO QQ6_2
QQ6_1:
BSF REGEST1,5
QQ6_2:
BTFSC FLAG,TEMPER_STATUS
GOTO QQ6_3
BCF REGEST2,5
GOTO QQ6_4
QQ6_3:
BSF REGEST2,5
QQ6_4:
RETURN
;**************************************
MANAGE7: ;查看防区7,通道AN4
BCF STATUS,RP0 ;BANK0
BSF PORTC,0 ;4051禁止
BSF PORTC,1 ;4051选择通道7
BSF PORTC,2 ;4051选择通道7
BCF PORTC,3 ;4051选择通道7
BCF PORTC,0 ;4051选通
CALL ADC
MOVF ADRESH,0
MOVWF SAMPLE ;防区7采样结果
CALL MANAGE
BTFSC FLAG,SENSOR_STATUS
GOTO QQ7_1
BCF REGEST1,6
GOTO QQ7_2
QQ7_1:
BSF REGEST1,6
QQ7_2:
BTFSC FLAG,TEMPER_STATUS
GOTO QQ7_3
BCF REGEST2,6
GOTO QQ7_4
QQ7_3:
BSF REGEST2,6
QQ7_4:
RETURN
;*************************************
MANAGE8: ;查看防区8,通道AN4
BCF STATUS,RP0 ;BANK0
BSF PORTC,0 ;4051禁止
BSF PORTC,1 ;4051选择通道8
BSF PORTC,2 ;4051选择通道8
BSF PORTC,3 ;4051选择通道8
BCF PORTC,0 ;4051选通
CALL ADC
MOVF ADRESH,0
MOVWF SAMPLE ;防区8采样结果
CALL MANAGE
BTFSC FLAG,SENSOR_STATUS
GOTO QQ8_1
BCF REGEST1,7
GOTO QQ8_2
QQ8_1:
BSF REGEST1,7
QQ8_2:
BTFSC FLAG,TEMPER_STATUS
GOTO QQ8_3
BCF REGEST2,7
GOTO QQ8_4
QQ8_3:
BSF REGEST2,7
QQ8_4:
RETURN
;*******************************
MANAGE:
MOVLW 43
SUBWF SAMPLE,0
BTFSC STATUS,C
GOTO MM1
BSF FLAG,SENSOR_STATUS
BSF FLAG,TEMPER_STATUS ;SAMPLE < 43 ,short circuit alarm
GOTO MM4
MM1:
MOVLW 63
SUBWF SAMPLE,0
BTFSC STATUS,C
GOTO MM2
BSF FLAG,SENSOR_STATUS
BCF FLAG,TEMPER_STATUS ;43 < =SAMPLE < 63,the sensor is connected,not alarm
GOTO MM4
MM2:
MOVLW 97
SUBWF SAMPLE,0
BTFSC STATUS,C
GOTO MM3
BCF FLAG,SENSOR_STATUS
BCF FLAG,TEMPER_STATUS ;63 < =SAMPLE < 97,the sensor is unconnected,not alarm
GOTO MM4
MM3:
BCF FLAG,SENSOR_STATUS
BSF FLAG,TEMPER_STATUS ;SAMPLE >= 97 ,open circuit alarm
MM4:
RETURN
;*************SSP Process Function*************
SENDSYN:
NOP
NOP
BCF STATUS,RP0 ;Bank0
BCF RCSTA,CREN ;Disable UART receive
BSF STATUS,RP0 ;Bank1
BCF PIE1,RCIE ;Disable receive interrupts
BCF STATUS,RP0 ;Bank0
ALM_MSG_ENC:
MOVLW 0xAA
MOVWF FRAME_SYNCHAR1 ;FRAME_SYNCHAR1
MOVLW 0x55
MOVWF FRAME_SYNCHAR2 ;FRAME_SYNCHAR2
MOVLW 0x02
MOVWF SEND_LENGTH
MOVWF CHECKSUM
;Judge the quantity of packet
BTFSC FLAG,MSG_SEND
GOTO AME_NEXT1
MOVLW 0x01
MOVWF PACKET_COUNT
XORWF CHECKSUM,1
GOTO AME_NEXT3
AME_NEXT1:
MOVF RECE_LENGTH,0
SUBLW 0x2C ;0x2C = 44
BTFSC STATUS,C
GOTO AME_NEXT2
BSF FLAG,MSG_LONG ;Long message
MOVLW 0x03
MOVWF PACKET_COUNT
XORWF CHECKSUM,1
GOTO AME_NEXT3
AME_NEXT2:
BCF FLAG,MSG_LONG ;short message
MOVLW 0x02
MOVWF PACKET_COUNT
XORWF CHECKSUM,1
AME_NEXT3:
MOVLW 0x01
MOVWF PACKET_NUM
XORWF CHECKSUM,1
MOVLW 0x80
MOVWF SEND_COMD
XORWF CHECKSUM,1
MOVLW 0x56
MOVWF FSR ;Address 0x56
MOVF REGEST1,0
MOVWF INDF ;Data1
XORWF CHECKSUM,1
INCF FSR,1 ;Address 0x57
MOVF REGEST2,0
MOVWF INDF ;Data2
XORWF CHECKSUM,1
;Fill space
MOVLW 0x26
MOVWF TEMP_LENGTH
FILL_LOOP1:
INCF FSR,1
MOVLW 0x00
MOVWF INDF ;Fill value = 0x00
DECFSZ TEMP_LENGTH,1
GOTO FILL_LOOP1
MOVLW 0x7E
MOVWF FSR
MOVF CHECKSUM,0
MOVWF INDF ;CHECKSUM
INCF FSR,1
MOVLW 0xED
MOVWF INDF ;0xED
;Send alarm messages to dsp
SEND_FRAMEHEAD1:
BSF FLAG,FRAME_HEAD
MOVLW 0xAA
MOVWF SENDBUF
CALL SEND
NOP
NOP
NOP
BCF FLAG,FRAME_HEAD
MOVLW 0x2F
MOVWF TEMP_LENGTH
MOVLW 0x51
MOVWF FSR
SEND_LOOP1:
MOVF INDF,0
MOVWF SENDBUF
CALL SEND
INCF FSR
NOP
NOP
BCF FLAG,FRAME_HEAD
NOP
;CALL DELAY2
DECFSZ TEMP_LENGTH,1
GOTO SEND_LOOP1
JUDGE_MSG_SEND:
BTFSS FLAG,MSG_SEND
GOTO SENDSYN_END ;No messges to be sent,jump to SENDSYN_END
MSG_ENC1:
BTFSS FLAG,MSG_LONG
GOTO MSG_ENC2 ;The length 0f the Message is less than or equal to 40 bytes- short message
MOVLW 0x28 ;The length 0f the Message is beyond 40 bytes -long message
MOVWF SEND_LENGTH
MOVWF TEMP_LENGTH
MOVWF CHECKSUM
MOVLW 0x03
XORWF CHECKSUM,1
MOVLW 0x02
MOVWF PACKET_NUM
XORWF CHECKSUM,1
MOVLW 0x10
MOVWF SEND_COMD
XORWF CHECKSUM,1
;Checksum
MOVLW 0xA6
MOVWF FSR
CHECKSUM_LOOP1:
MOVF INDF,0
XORWF CHECKSUM,1
INCF FSR,1
DECFSZ TEMP_LENGTH,1
GOTO CHECKSUM_LOOP1
NOP
MOVF CHECKSUM,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -