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

📄 20077912523418107.asm

📁 PIC压力测量程序 适用于各种压力测量场合 可用于工业测量
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;********************************************************
;
;                 ULTRASONIC RANGE METER
;
;                                 DEVICE : PIC16F873
;                                 AUTHOR : SEIICHI INOUE
;********************************************************

        LIST            P=PIC16F873
        INCLUDE         P16F873.INC
       __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF
        ERRORLEVEL      -302    ;SUPPRESS BANK WARNING

;****************  LABEL DEFINITION  ********************
        CBLOCK  H'20'
S_COUNT                         ;SEND-OUT PULSE COUNT ADR
S_ADJ                           ;ADJUSTMENT DATA ADDRESS
S_ADJ_COUNT                     ;ROTATE VALUE SAVE ADR
S_DIGIT                         ;DIGIT CONT WORK ADDRESS
G_TIME1                         ;GUARD TIMER ADDRESS 1
G_TIME2                         ;GUARD TIMER ADDRESS 2
P_COUNTL                        ;PROPAGATION L CNT ADR
P_COUNTH                        ;PROPAGATION H CNT ADR
DIGIT_CNT                       ;DIGIT COUNTER HEAD ADR
DISP_HA                         ;DIGIT HEAD ADDRESS
DISP_U                          ;1ST DIGIT ADDRESS
DISP_T                          ;10TH DIGIT ADDRESS
DISP_H                          ;100TH DIGIT ADDRESS
SEG7_HA                         ;7 SEGLED TABLE HEAD ADR
SEG70                           ;PATTERN 0 SET ADR
SEG71                           ;PATTERN 1 SET ADR
SEG72                           ;PATTERN 2 SET ADR
SEG73                           ;PATTERN 3 SET ADR
SEG74                           ;PATTERN 4 SET ADR
SEG75                           ;PATTERN 5 SET ADR
SEG76                           ;PATTERN 6 SET ADR
SEG77                           ;PATTERN 7 SET ADR
SEG78                           ;PATTERN 8 SET ADR
SEG79                           ;PATTERN 9 SET ADR
SEG7A                           ;PATTERN A SET ADR
SEG7B                           ;PATTERN B SET ADR
        ENDC

RA1     EQU     H'01'           ;RA1 PORT DESIGNATION
RA2     EQU     H'02'           ;RA2 PORT DESIGNATION
RA3     EQU     H'03'           ;RA3 PORT DESIGNATION
RA5     EQU     H'05'           ;RA5 PORT DESIGNATION

CCP1    EQU     H'02'           ;CCP1(RC2) DESIGNATION

SEG7_0  EQU     B'01000000'     ;-GFEDCBA PATTERN 0
SEG7_1  EQU     B'01111001'     ;         PATTERN 1
SEG7_2  EQU     B'00100100'     ;         PATTERN 2
SEG7_3  EQU     B'00110000'     ;         PATTERN 3
SEG7_4  EQU     B'00011001'     ;         PATTERN 4
SEG7_5  EQU     B'00010010'     ;         PATTERN 5
SEG7_6  EQU     B'00000010'     ;         PATTERN 6
SEG7_7  EQU     B'01111000'     ;         PATTERN 7
SEG7_8  EQU     B'00000000'     ;         PATTERN 8
SEG7_9  EQU     B'00010000'     ;         PATTERN 9
SEG7_A  EQU     B'01111111'     ;         DETECT ERROR
SEG7_B  EQU     B'00100011'     ;         ILLEGAL INT

;****************  PROGRAM START  ***********************
        ORG     0               ;RESET VECTOR
        GOTO    INIT
        ORG     4               ;INTERRUPT VECTOR
        GOTO    INT

;****************  INITIAL PROCESS  *********************
INIT

;*** PORT INITIALIZATION
        BSF     STATUS,RP0      ;CHANGE TO BANK1
        MOVLW   B'00000001'     ;AN0 TO INPUT MODE
        MOVWF   TRISA           ;SET TRISA REGISTER
        CLRF    TRISB           ;RB PORT TO OUTPUT MODE
        MOVLW   B'00000100'     ;RC2/CCP1 TO INPUT MODE
        MOVWF   TRISC           ;SET TRISC REGISTER

;*** ULTRASONIC SENDING PERIOD INITIALIZATION (TIMER0)
        MOVLW   B'11010111'     ;T0CS=0,PSA=0,PS=1:256
        MOVWF   OPTION_REG      ;SET OPTION_REG REGISTER
        BCF     STATUS,RP0      ;CHANGE TO BANK0
        CLRF    TMR0            ;CLEAR TMR0 REGISTER

;*** CAPTURE MODE INITIALIZATION (TIMER1)
        MOVLW   B'00000001'     ;PRE=1:1 TMR1=INT TMR1=ON
        MOVWF   T1CON           ;SET T1CON REGISTER
        CLRF    CCP1CON         ;CCP1 OFF

;*** A/D CONVERTER INITIALIZATION
        MOVLW   B'01000001'     ;ADCS=01 CHS=AN0 ADON=ON
        MOVWF   ADCON0          ;SET ADCON0 REGISTER
        BSF     STATUS,RP0      ;CHANGE TO BANK1
        MOVLW   B'00001110'     ;ADFM=0 PCFG=1110
        MOVWF   ADCON1          ;SET ADCON1 REGISTER
        BCF     STATUS,RP0      ;CHANGE TO BANK0

;*** DISPLAY INITIALIZATION (TIMER2)
        MOVLW   DISP_U          ;SET DIGIT HEAD ADDRESS
        MOVWF   DISP_HA         ;SAVE DIGIT HEAD SDDRESS
        MOVLW   H'0A'           ;"DETECT ERROR" DATA
        MOVWF   DISP_U          ;SET 1ST DIGIT
        MOVWF   DISP_T          ;SET 10TH DIGIT
        MOVWF   DISP_H          ;SET 100TH DIGIT
        MOVLW   D'3'            ;DIGIT COUNTER
        MOVWF   DIGIT_CNT       ;SET DIGIT COUNTER
        MOVLW   SEG70           ;SET 7SEG HEAD ADDRESS
        MOVWF   SEG7_HA         ;SAVE 7SEG HEAD ADDRESS
        MOVLW   SEG7_0          ;SET 7SEGMENT PATTERN 0
        MOVWF   SEG70           ;SAVE PATTERN 0
        MOVLW   SEG7_1          ;SET 7SEGMENT PATTERN 1
        MOVWF   SEG71           ;SAVE PATTERN 1
        MOVLW   SEG7_2          ;SET 7SEGMENT PATTERN 2
        MOVWF   SEG72           ;SAVE PATTERN 2
        MOVLW   SEG7_3          ;SET 7SEGMENT PATTERN 3
        MOVWF   SEG73           ;SAVE PATTERN 3
        MOVLW   SEG7_4          ;SET 7SEGMENT PATTERN 4
        MOVWF   SEG74           ;SAVE PATTERN 4
        MOVLW   SEG7_5          ;SET 7SEGMENT PATTERN 5
        MOVWF   SEG75           ;SAVE PATTERN 5
        MOVLW   SEG7_6          ;SET 7SEGMENT PATTERN 6
        MOVWF   SEG76           ;SAVE PATTERN 6
        MOVLW   SEG7_7          ;SET 7SEGMENT PATTERN 7
        MOVWF   SEG77           ;SAVE PATTERN 7
        MOVLW   SEG7_8          ;SET 7SEGMENT PATTERN 8
        MOVWF   SEG78           ;SAVE PATTERN 8
        MOVLW   SEG7_9          ;SET 7SEGMENT PATTERN 9
        MOVWF   SEG79           ;SAVE PATTERN 9
        MOVLW   SEG7_A          ;SET 7SEGMENT PATTERN A
        MOVWF   SEG7A           ;SAVE PATTERN A
        MOVLW   SEG7_B          ;SET 7SEGMENT PATTERN B
        MOVWF   SEG7B           ;SAVE PATTERN B
        MOVLW   B'00011110'     ;OPS=1:4,T2=ON,EPS=1:16
        MOVWF   T2CON           ;SET T2CON REGISTER
        BSF     STATUS,RP0      ;CHANGE TO BANK1
        MOVLW   D'157'          ;157X64=10048USEC
        MOVWF   PR2             ;SET PR2 REGISTER
        BSF     PIE1,TMR2IE     ;TMR2IE=ON
        BCF     STATUS,RP0      ;CHANGE TO BANK0


;*** INTERRUPTION CONTROL
        MOVLW   B'11100000'     ;GIE=ON,PEIE=ON,T0IE=ON
        MOVWF   INTCON          ;SET INTCON REGISTER

WAIT
        GOTO    $               ;INTERRUPTION WAIT

;***************  INTERRUPTION PROCESS  *****************
INT
        MOVFW   PIR1            ;READ PIR1 REGISTER
        BTFSC   PIR1,CCP1IF     ;CAPTURE OCCURRED ?
        GOTO    CAPTURE         ;YES. "CAPTURE"
        BTFSC   PIR1,TMR2IF     ;TMR2 TIME OUT ?
        GOTO    LED_CONT        ;YES. "LED DISPLAY"
        MOVFW   INTCON          ;READ INTCON REGISTER
        BTFSC   INTCON,T0IF     ;TMR0 TIME OUT ?
        GOTO    SEND            ;YES. "PULSE SEND"

;***************  ILLEGAL INTERRUPTION  *****************
ILLEGAL
        MOVLW   H'0B'           ;SET ILLEGAL DISP DIGIT
        ADDWF   SEG7_HA,W       ;SEG7 H.ADR + DIGIT
        MOVWF   FSR             ;SET FSR REGISTER
        MOVFW   INDF            ;READ SEG7 DATA
        MOVWF   PORTB           ;WRITE LED DATA
        BCF     PORTA,RA1       ;RA1=ON
        BCF     PORTA,RA2       ;RA2=ON
        BCF     PORTA,RA3       ;RA3=ON
        GOTO    $               ;STOP

;************  END OF INTERRUPTION PROCESS **************
INT_END
        RETFIE

;***************  PULSE SEND-OUT PROCESS ****************
SEND
        BCF     INTCON,T0IF     ;CLEAR TMR0 INT FLAG
        CLRF    TMR0            ;TIMER0 CLEAR

;*** RECEIVED PULSE DETECTION CHECK
        MOVFW   PORTC           ;READ PORTC REGISTER
        BTFSC   PORTC,CCP1      ;DETECTED ?
        GOTO    DETECT_OFF      ;YES. DETECTED
        MOVLW   H'0A'           ;"DETECT ERROR" DATA
        MOVWF   DISP_U          ;SET 1ST DIGIT
        MOVWF   DISP_T          ;SET 10TH DIGIT
        MOVWF   DISP_H          ;SET 100TH DIGIT

;*** RECEIVE PULSE DETECTOR OFF
DETECT_OFF
        BCF     PORTA,RA5       ;SET DETECTOR OFF

;*** CAPTURE START
        CLRF    TMR1H           ;CLEAR TMR1H REGISTER
        CLRF    TMR1L           ;CLEAR TMR1L REGISTER
        CLRF    CCPR1H          ;CLEAR CCPR1H REGISTER
        CLRF    CCPR1L          ;CLEAR CCPR1L REGISTER
        MOVLW   B'00000101'     ;CCP1M=0101(CAPTURE)
        MOVWF   CCP1CON         ;SET CCP1CON REGISTER
        BSF     STATUS,RP0      ;CHANGE TO BANK1
        BSF     PIE1,CCP1IE     ;CCP1 INTERRUPTIN ENABLE
        BCF     STATUS,RP0      ;CHANGE TO BANK0
        BCF     PIR1,CCP1IF     ;CLEAR CCP1 INT FLAG

;*** 40KHZ PULSE SEND ( 0.5 MSEC )
        MOVLW   D'20'           ;SEND-OUT PULSE COUNT
        MOVWF   S_COUNT         ;SET COUNT
S_LOOP
        CALL    PULSE           ;CALL PULSE SEND SUB
        DECFSZ  S_COUNT,F       ;END ?
        GOTO    S_LOOP          ;NO. CONTINUE

;*** GET ADJUSTMENT DATA
        BSF     ADCON0,GO       ;START A/D CONVERT
AD_CHECK
        BTFSC   ADCON0,GO       ;A/D CONVERT END ?
        GOTO    AD_CHECK        ;NO. AGAIN
        MOVFW   ADRESH          ;READ ADRESH REGISTER
        MOVWF   S_ADJ           ;SAVE CONVERTED DATA

        MOVLW   D'5'            ;SET ROTATE VALUE
        MOVWF   S_ADJ_COUNT     ;SAVE ROTATE VALUE

⌨️ 快捷键说明

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