新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC16F877A控制DS18B20匯編程序

        PIC16F877A控制DS18B20匯編程序

        作者: 時間:2012-11-27 來源:網絡 收藏

        ;======================================================

        ;*******************************************************
        ;二進制轉BCD碼
        ;****************************************************
        _BCD CLRF SHI ;保存地址清零
        CLRF GE
        MOVF BIN_L,F ;組合碼自己給自己賦值,測試是否為0
        SKPNZ ;不為0則跳到下一步
        RETLW 00H
        SHI_ MOVLW D'10'
        SUBWF BIN_L,W ;BIN_L減10,結果存到W寄存器
        BTFSS STATUS,C ;執行減法后,如果無借位
        GOTO GE_
        MOVWF BIN_L
        INCF SHI
        GOTO SHI_
        GE_ MOVF BIN_L,W
        MOVWF GE
        RETLW 00H
        ;=================================================

        ;**********************************************************
        ;延時200ms
        ;************************************************************
        DELAY_MAX
        MOVLW 0FFH
        MOVWF Y1
        MOVLW 0FFH
        MOVWF Y2
        DECFSZ Y2
        GOTO $-1
        DECFSZ Y1
        GOTO $-5
        RETLW 00H
        ;==========================================

        ;***************************************************
        ;延時6ms
        ;*****************************************************
        DELAY
        MOVLW 03FH
        MOVWF Y1
        MOVLW 020H
        MOVWF Y2
        DECFSZ Y2
        GOTO $-1
        DECFSZ Y1
        GOTO $-5
        RETLW 00H
        ;==============================================

        ;********************************************
        ;延時750us子程序
        ;**********************************************************
        DELAY_750US
        MOVLW 09H
        MOVWF Y1
        MOVLW 01AH
        MOVWF Y2
        DECFSZ Y2
        GOTO $-1
        DECFSZ Y1
        GOTO $-5
        RETLW 00H
        ;=========================================

        ;*******************************************************
        ;查表子程序,用于顯示段碼數字
        ;數碼管為共陽數碼管
        ;********************************************************
        TABLE
        ADDWF PCL,F
        RETLW 0C0H ;"0"
        RETLW 0F9H ;"1"
        RETLW 0A4H ;"2"
        RETLW 0B0H ;"3"
        RETLW 99H ;"4"
        RETLW 92H ;"5"
        RETLW 82H ;"6"
        RETLW 0F8H ;"7"
        RETLW 80H ;"8"
        RETLW 90H ;"9"
        ;===============================================

        ;***********************************************************
        ;復位和應答子程序
        ;************************************************************
        RESET BSF STATUS,RP0 ;使當前體為體1
        BCF DIR ;使數據位為輸出
        BCF STATUS,RP0 ;使當前體為體0
        BSF DQ ;拉高數據位
        NOP ;空循環
        BCF DQ ;拉低數據位
        MOVLW D'200' ;延時600us
        MOVWF Y1
        DECFSZ Y1
        GOTO $-1
        BSF STATUS,RP0 ;使當前體為體1
        BSF DIR ;使數據位為輸入
        BCF STATUS,RP0 ;使當前體為體0
        MOVLW D'30' ;延時90us
        MOVWF Y1
        DECFSZ Y1
        GOTO $-1
        BTFSC DQ ;主機接收到低電平應答脈沖,跳轉到下一句
        GOTO RESET
        MOVLW D'80' ;延時240us
        MOVWF Y1
        DECFSZ Y1
        GOTO $-1
        BTFSS DQ ;主機接收到高電平應答脈沖,跳轉到下一句
        GOTO RESET
        RETLW 00H ;返回00H,復位應答結束
        ;=================================================

        ;***********************************************************
        ;寫子程序
        ;************************************************************
        WR18B20
        MOVWF COMD ;把要寫的數據寫到COMD內
        MOVLW D'8'
        MOVWF COUNT2 ;大循環8次
        WR0 BSF STATUS,RP0 ;使當前體為體1
        BCF DIR ;使數據位為輸出
        BCF STATUS,RP0 ;使當前體為體0
        BCF DQ ;拉低數據線
        NOP
        NOP
        MOVLW D'2'
        MOVWF COUNT1 ;延時9us
        WR1 DECFSZ COUNT1,1
        GOTO WR1
        BTFSC COMD,0 ;COMD最低位為0則跳轉到下一句
        BSF DQ ;拉高數據線
        BTFSC COMD,0 ;COMD最低位為0則跳轉到下一句
        NOP
        BCF STATUS,C ;進位位置0
        RRF COMD,1 ;帶進位位,COMD向右移一位
        MOVLW D'20' ;延時60us
        MOVWF COUNT1
        WR2 DECFSZ COUNT1,1
        GOTO WR2
        BSF DQ ;拉高數據線,空閑狀態
        BSF STATUS,RP0 ;使當前體為體1
        BSF DIR ;使數據位為輸入
        BCF STATUS,RP0 ;使當前體為體0
        DECFSZ COUNT2,1 ;8次循環到了則跳出
        GOTO WR0
        RETLW 00H
        ;====================================================

        ******************
        ;讀18B20子程序
        ;**********************************************************
        RE18B20
        MOVLW 8
        MOVWF COUNT2
        RE0 BSF STATUS,RP0 ;使當前體為體1
        BCF DIR ;使數據位為輸出
        BCF STATUS,RP0 ;使當前體為體0
        BCF DQ
        MOVLW 2
        MOVWF COUNT1
        RE1 DECFSZ COUNT1,1
        GOTO RE1
        BSF STATUS,RP0 ;使當前體為體1
        BSF DIR ;使數據位為輸入
        BCF STATUS,RP0 ;使當前體為體0
        NOP
        BTFSS DQ ;如果數據線為高電平,則C=1
        BCF STATUS,C
        BTFSC DQ ;如果數據線為低電平,則C=0
        BSF STATUS,C
        RRF DATE,1 ;數據依次存在DATE上
        MOVLW D'20' ;延時60us
        MOVWF COUNT1
        RE2 DECFSZ COUNT1,1
        GOTO RE2
        DECFSZ COUNT2,1
        GOTO RE0
        BSF DQ
        RETLW 00H
        ;======================================================

        ;==============================================
        END ;程序結束


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 都昌县| 遵义市| 莱芜市| 鄱阳县| 汉川市| 宜兴市| 大安市| 旅游| 满城县| 九江市| 老河口市| 北京市| 文安县| 安义县| 诏安县| 灵宝市| 伊春市| 连云港市| 永泰县| 霍山县| 门头沟区| 凭祥市| 新田县| 清水河县| 措美县| 清涧县| 栖霞市| 南木林县| 聂拉木县| 保靖县| 加查县| 沭阳县| 平塘县| 绥芬河市| 金川县| 裕民县| 三亚市| 望城县| 苍梧县| 临武县| 南昌市|