您当前的位置:深圳单片机开发网 -> 8位单片机专栏 -> PIC单片机 -> 文章内容
PIC子程序库-AD转换(PIC16C54)
作者:本站  来源:本站整理  发布时间:2008-4-12 23:17:37  发布人:admin

减小字体 增大字体

TITLE  'VOLTMETER/AD CONVERTER PROGRAM REV 3-29-90'
        LIST   P=16C54,F=inhx16

ACCA     EQU     8
ACCB     EQU     0A
ACCC     EQU     0C
ACCD     EQU     0E
ACCE     EQU     10
TMEAS    EQU     12
TEMP     EQU     14

VCALMS   EQU     60              ;VCAL MSB VALUE IN HEX
VCALLS   EQU     0A4             ;VCAL LSB VALUE IN HEX

         ORG 1FF
         GOTO    VOLTS           ;PROGRAM CODE
         ORG     0               ;SUBROUTINES

MADD     MOVF    ACCA+1,W
         ADDWF   ACCB+1          ;ADD LSB
         BTFSC   3,0             ;ADD IN CARRY
         INCF    ACCB
         MOVF    ACCA,W
         ADDWF   ACCB            ;ADD MSB
         RETLW   0
         NOP

MPY      CALL    SETUP           ;RESULTS IN B(16 MSB'S) AND C(16 LSB'S)
MLOOP    RRF     ACCD            ;ROTATE D RIGHT
         RRF     ACCD+1
         SKPNC                   ;NEED TO ADD?
         CALL    MADD
         RRF     ACCB
         RRF     ACCB+1
         RRF     ACCC
         RRF     ACCC+1
         DECFSZ  TEMP            ;LOOP UNTIL ALL BITS CHECKED
         GOTO    MLOOP
         RETLW   0

         NOP
SETUP    MOVLW   10
         MOVWF   TEMP
         MOVF    ACCB,W          ;MOVE B TO D
         MOVWF   ACCD
         MOVF    ACCB+1,W
         MOVWF   ACCD+1
         MOVF    ACCC,W
         MOVWF   ACCE
         MOVF    ACCC+1,W
         MOVWF   ACCE+1
         CLRF    ACCB
         CLRF    ACCB+1
         RETLW   0

         NOP
DIV      CALL    SETUP
         MOVLW   20
         MOVWF   TEMP
         CLRF    ACCC
         CLRF    ACCC+1
DLOOP    CLRC
         RLF     ACCE+1
         RLF     ACCE
         RLF     ACCD+1
         RLF     ACCD
         RLF     ACCC+1
         RLF     ACCC
         MOVF    ACCA,W
         SUBWF   ACCC,W          ;CHECK IF A>C
         SKPZ
         GOTO    NOCHK
         MOVF    ACCA+1,W
         SUBWF   ACCC+1,W        ;IF MSB EQUAL THEN CHECK LSB
NOCHK    SKPC                    ;CARRY SET IF C>A
         GOTO    NOGO
         MOVF    ACCA+1,W        ;C-A INTO C
         SUBWF   ACCC+1
         BTFSS   3,0
         DECF    ACCC
         MOVF    ACCA,W
         SUBWF   ACCC
         SETC                    ;SHIFT A 1 INTO B (RESULT)
NOGO     RLF     ACCB+1
         RLF     ACCB
         DECFSZ  TEMP            ;LOOP UNTILL ALL BITS CHECKED
         GOTO    DLOOP
         RETLW   0

DSCHRG   MOVLW   B'00001110'     ;DISCHARGE C (RA0 ON)
         TRIS    5
         MOVLW   0FF
         MOVWF   TEMP
LOOP     DECFSZ  TEMP            ;WAIT
         GOTO    LOOP
         MOVLW   B'00001111'     ;ALL RA HIGH Z
         TRIS    5
         RETLW   0

M_TIME   CLRF    1               ;CLEAR RTCC REGISTER
         CLRF    ACCA+1          ;CLEAR 16 BIT COUNTER
         CLRF    ACCA
TLOOP    INCFSZ  ACCA+1
         GOTO    ENDCHK
         INCFSZ  ACCA
         GOTO    ENDCHK
         GOTO    END_M
ENDCHK   BTFSS   1,0             ;CHECK FOR RTCC TRIP
         GOTO    TLOOP
END_M    MOVF    1,W
         RETLW   0

VOLTS    MOVLW   B'00000110'     ;SET S2 AND S3 HIGH(ON WHEN ACTIVATED)
         MOVWF   6
         MOVLW   B'11110000'     ;ACTIVATE SWITCHES S1-S4
         TRIS    6
         MOVLW   B'00101000'     ;SELECT POSITIVE EDGE FOR RTCC
         OPTION
         MOVLW   B'00000000'
         MOVWF   5               ;SET RA0 LOW (ON WHEN ACTIVATED)

MEAS     CALL    DSCHRG          ;CHARGE CAPACITOR TO VIN
         MOVLW   B'00001010'     ;S2 AND S4 ON
         MOVWF   6
         CALL    M_TIME          ;MEASURE TIME
         MOVF    ACCA+1,W
         MOVWF   TMEAS+1         ;STORE LSB
         MOVF    ACCA,W
         MOVWF   TMEAS           ;STORE MSB

CAL      MOVLW   B'00000101'     ;S1 AND S3 ON
         MOVWF   6
         CALL    DSCHRG          ;CHARGE CAPACITOR TO VREF
         MOVLW   B'00001001'     ;S1 AND S4 ON
         MOVWF   6
         CALL    M_TIME          ;MEASURE TIME

         MOVLW   VCALLS
         MOVWF   ACCB+1
         MOVLW   VCALMS
         MOVWF   ACCB

         CALL    MPY             ;MULTIPLY ACCA(TCAL) * ACCB(VREF)
         MOVF    TMEAS+1,W
         MOVWF   ACCA+1
         MOVF    TMEAS,W
         MOVWF   ACCA

         CALL    DIV             ;DIVIDE ACCB(TCAL * V) BY ACCA(TMEAS)

         GOTO VOLTS

         END

[] [返回上一页] [打 印]
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 联系我们 - 友情连接

Copyright © 2006 深圳单片机开发网 版权所有
网站维护:深圳智昌电子
业务咨询电话:13128783790(钟工)  在线QQ:10135055
E_mail:edumcu#126.com(将#替换为@)

培训上课地址:深圳市南山区南新路南山市场156号  乘车路线>>>
备案序号:粤ICP备06113577号