×
单片机 > 单片机程序设计 > 详情

pic16c711测温程序

发布时间:2020-06-08 发布时间:
|

; 振荡器    1MHz R/C   
; 命令时钟    250kHz 

    include                


page1    macro 
    bsf     STATUS,RP0      ; page1 
    endm 

page0    macro 
    bcf     STATUS,RP0      ; page0 
    endm 

    cbLOCk    0ch         
    time1, temp          
    lo_val, hi_val, msn, lsn 
    digit1, digit2         
    count, read         
    ssave, wsave         
    flags 
    endc 

;================================== 
        org     00         
    goto    init   
    org    04         
    btfss    INTCON,T0IF         
    goto    end_int 

    MOVwf    wsave         
    swapf    STATUS,w     
    MOVwf    ssave        ;中断保护 

    decf    count,f         
    decfsz    read,f         
    goto    int2         
    call    adconv        ;  A/D  
    MOVlw    .16        ;  
    MOVwf    read 

int2    MOVf     count,0         
    btfsc    STATUS,Z         
    bsf    flags,0        ; eot 
    bcf    INTCON,T0IF     

end_int    swapf    ssave,w 
    MOVwf    STATUS        ; 
    swapf    wsave,f        ; 
    swapf    wsave,w 
    retfie            ;  

;========== 查表 =============== 
table    addwf    PCL        ; port b 
    retlw    b’01110111’    ; 0 
    retlw    b’00010100’    ; 1 
    retlw    b’00111011’    ; 2 
    retlw    b’00111110’    ; 3 
    retlw    b’01011100’    ; 4 
    retlw    b’01101110’    ; 5 
    retlw    b’01101111’    ; 6 
    retlw    b’00110100’    ; 7 
    retlw    b’01111111’    ; 8 
    retlw    b’01111100’    ; 9 
    retlw    0 
    retlw    0 
    retlw    0 
    retlw    0         
    retlw    0 
    retlw    0 
    retlw    0 

; ********************* 温度 转变****************** 
lookup    addwf    PCL         
    retlw    .99        ; 00    
    retlw    .99        ; 01    
    retlw    .99        ; 02  
    retlw    .99        ; 03 
    retlw    .91        ; 04 
    retlw    .81        ; 05 
    retlw    .73        ; 06 
    retlw    .66        ; 07 
    retlw    .59        ; 08 
    retlw    .52        ; 09 
    retlw    .45        ; 0A 
    retlw    .39        ; 0B 
    retlw    .31        ; 0C 
    retlw    .23        ; 0D 
    retlw    .13        ; 0E 
    retlw    .0        ; 0F 
    retlw    .0        ; catch for >f0h 

; ========== a/d转变 值存到 temp ========== 
interp    MOVf     lsn,0        ; 初值 
    swapf    lsn,w        ; swap & save 
    MOVwf    msn        ; into w 
    MOVlw    0fh 
    andwf    lsn,f        ; strip off upper rubbish 
    andwf    msn,f        ; strip off upper rubbish 
    MOVf     msn,0        ; reload 
    call    lookup        ; get value 
    MOVwf    lo_val        ; save it 
    incf    msn,w        ; increment pointer 
    call    lookup        ; get next value 
    subwf    lo_val,w    ; get difference & save 
    MOVwf    hi_val     

mult    addwf    hi_val,f    ; add to current 
    decfsz    lsn,f        ; count down on multiply loop 
    goto    mult 
    swapf    hi_val,w    ; divide by 16 
    andlw    0fh        ; extract upper nibble 
    subwf    lo_val,w    ; add lo value to lo value to get result 
    return 

adconv  bsf    ADCON0,GO         ; start conversion 
        MOVlw   .5        ; wait delay 10uS 
        MOVwf   temp 
    decfsz  temp,f        ; loop for a while 
        goto    $-1 
    btfsc   ADCON0,GO         ; test for end of conversion 
        goto    $-1 
        retlw    0 

bin_bcd MOVwf   digit1          ; first digit 
        clrf    digit2          ; second digit 
      
tenlop  MOVlw   .10 
        subwf   digit1,w    ; find out how many 10’s 
        btfsc   STATUS,C 
        incf    digit2,f 
        btfsc   STATUS,C 
        MOVwf   digit1        ; remainder 1’s left 
        btfsc   STATUS,C 
        goto    tenlop 
    return  

; ======================================= 
init    clrf    PORTB         
    clrf    PORTA 
        clrf    ADCON0         
    clrf    flags         
    page1 
    MOVlw    b’11110011’ 
    MOVwf    TRISA 
    MOVlw    b’10000000’    ;  
        MOVwf    TRISB             ; set up port b 
    MOVlw    b’00000100’    ; /32 
    MOVwf    OPTION_REG 
    MOVlw    b’00000010’ 
    MOVwf    ADCON1 
    page0 
    MOVlw    b’00001000’    ; set up change of state on portb 
    MOVwf    INTCON        ; to wake up 
    sleep            ; shut down 

        MOVlw   b’11000001’     ; set a/d internal rc clock 
                                ; channel 0, a/d running 
        MOVwf   ADCON0          ; do it 
    MOVlw    .153        ; timeout value 
    MOVwf    count 
    MOVlw    .16        ; interval timer reload 
    MOVwf    read 
    MOVlw    b’10100000’    ; set up change of state on portb 
    MOVwf    INTCON        ; to wake up 
    call    adconv        ; perform A/D conversion 

; ================== main ==================== 
main    btfsc    flags,0        ; test for timeout 
    goto    init        ; yes so shut down 
    MOVf     ADRES,0        ; load value 

    MOVwf    lsn        ; store for conversion     
    call    interp        ; using interpolation method 
         
    call    bin_bcd        ; convert into 2 digits 

    MOVf     digit1,0    ; load msb 
    call    table        ; convert into 7 segment format 
    MOVwf    PORTB        ; send to display 
    bsf    PORTA,2        ; enable character 
    btfss    TMR0,6        ; test bit 
    goto    $-1        ; loop 
    bcf    PORTA,2 

    MOVf     digit2,0    ; load lsb 
    call    table        ; convert into 7 segment format 
    MOVwf    PORTB        ; send to display 
    bsf    PORTA,3        ; enable character 
    btfsc    TMR0,6        ; test bit 
    goto    $-1        ; loop 
    bcf    PORTA,3 

    goto    main 

        end 





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法