新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC單片機(jī)AD轉(zhuǎn)換匯編程序

        PIC單片機(jī)AD轉(zhuǎn)換匯編程序

        作者: 時(shí)間:2012-12-11 來源:網(wǎng)絡(luò) 收藏

        ;*********軟件延時(shí)子程序****************
        DELAY
        MOVLW 0XFF
        MOVWF DEYH
        AGAIN1 MOVLW 0XFF
        MOVWF DEYL
        AGAIN2 NOP
        DECFSZ DEYL
        GOTO AGAIN2
        DECFSZ DEYH
        GOTO AGAIN1
        RETURN

        ;*************** A/D中斷服務(wù)子程序*****************
        INTSERVE
        BCF PIR1,ADIF ;清除A/D轉(zhuǎn)換標(biāo)志
        MOVF ADRESH,W
        MOVWF INDF0 ;讀取并存儲A/D轉(zhuǎn)換結(jié)果的高兩位
        INCF FSR0L
        MOVF ADRESL,W
        MOVWF INDF0
        INCF FSR0L ;讀取并存儲A/D轉(zhuǎn)換結(jié)果的低8位
        DECF TIMES,1 ;A/D轉(zhuǎn)換次數(shù)減1
        MOVLW 0X02
        MOVWF DEY
        LOOP13 DECFSZ DEY,1
        GOTO LOOP13 ;給予一定的延時(shí),保證兩次A/D轉(zhuǎn)換期間
        ;2Tad的間隔時(shí)間和電容的采樣時(shí)間
        BSF ADCON0,2 ;啟動下一次A/D轉(zhuǎn)換
        RETFIE ;中斷返回

        ;********** LED閃爍報(bào)警子程序*************
        ALARM
        MOVLW 0X01
        XORWF FLAG,1
        BTFSS FLAG,0
        CALL DISPLAY0 ;調(diào)用顯“0”子程序
        NOP
        BTFSC FLAG,0
        CALL DISPDARK ;調(diào)用顯“DARK”子程序
        RETURN

        ;**********顯全0子程序*************
        DISPLAY0
        TRANSMIT ;SPI發(fā)送顯示子模塊
        CLRF PORTA ;LACK送低電平,為鎖存做準(zhǔn)備
        MOVLW 0X08
        MOVWF TIMES
        LOOP80 MOVLW 0XC0 ;顯示值為0,C0H為0的段碼
        MOVWF SSPBUF ;啟動發(fā)送
        WAIT
        BTFSS PIR1,SSPIF
        GOTO WAIT ;等待發(fā)送結(jié)束
        BCF PIR1,SSPIF ;清除中斷標(biāo)志
        DECFSZ TIMES
        GOTO LOOP80 ;一次要發(fā)送完8個(gè)數(shù)據(jù)
        BSF PORTA,5 ;最后給一個(gè)鎖存信號,代表一次顯示任務(wù)完成
        RETURN

        ;**********顯示全DARK子程序*************
        DISPDARK
        TRANSMIT1 ;SPI發(fā)送顯示子模塊
        CLRF PORTA ;LACK送低電平,為鎖存做準(zhǔn)備
        MOVLW 0X08
        MOVWF TIMES
        LOOP8D MOVLW 0XFF ;顯示值為0,F(xiàn)FH為DARK的段碼
        MOVWF SSPBUF ;啟動發(fā)送
        WAIT1
        BTFSS PIR1,SSPIF
        GOTO WAIT1 ;等待發(fā)送結(jié)束
        BCF PIR1,SSPIF ;清除中斷標(biāo)志
        DECFSZ TIMES
        GOTO LOOP8D ;一次要發(fā)送完8個(gè)數(shù)據(jù)
        BSF PORTA,5 ;最后給一個(gè)鎖存信號,代表一次顯示任務(wù)完成
        RETURN

        ;*********A/D轉(zhuǎn)換主程序************
        ;轉(zhuǎn)載請保留文章原始出處http://www.51hei.com 單片機(jī)網(wǎng)
        MAIN NOP
        CALL INITIAL ;初始化
        LOOP
        MOVLW 0X80 ;轉(zhuǎn)換結(jié)果右移,及ADRESH寄存器的高6位為"0"
        ;且把RA2口設(shè)置為模擬量輸入式(注意后面要把
        ; RA5改成數(shù)據(jù)I/O方式,以輸出顯示瑣存信號)
        MOVWF ADCON1
        MOVLW BEGFSR
        MOVWF FSR0L ;給出間接尋址時(shí)FSR的初值
        MOVLW 0X0A
        MOVWF TIMES ;每一輪A/D連續(xù)采樣10次
        BSF INTCON,GIE ;總中斷打開,及可以進(jìn)行A/D轉(zhuǎn)換中斷
        BSF ADCON0,2 ;啟動A/D轉(zhuǎn)換
        LOOP1 MOVF TIMES,W
        BTFSS STATUS,Z
        GOTO LOOP1 ;等待A/D轉(zhuǎn)換中斷
        BCF INTCON,GIE ;A/D轉(zhuǎn)換次數(shù)到10次,關(guān)閉中斷
        NOP
        CLRF ACCBHI
        CLRF ACCBLO ;雙精度加法的結(jié)果寄存器清0,為后面準(zhǔn)備
        MOVLW 0X0A
        MOVWF TIMES
        MOVLW BEGFSR
        MOVWF FSR0L
        LOOP15 MOVF INDF0,W
        MOVWF ACCAHI
        INCF FSR0L
        MOVF INDF0,W
        MOVWF ACCALO
        INCF FSR0L
        CALL D_ADD
        DECFSZ TIMES
        GOTO LOOP15
        NOP ;計(jì)算得到10次A/D轉(zhuǎn)換的和
        MOVLW 0X84
        MOVWF ADCON1 ;把RA5設(shè)成數(shù)字I/O,以輸出顯示鎖存信號
        MOVLW 0X14
        MOVWF ACCAHI
        CLRF ACCALO
        CALL D_SUB ;通過雙精度減判斷模擬量是否達(dá)到報(bào)警限
        ;度(1400H=200H*0AH,200H與2.5V對應(yīng))
        BTFSS ACCBHI,7
        CALL ALARM ;若ACCBHI的最高位為1,則證明減法結(jié)
        ;果為負(fù),即直流電壓值超過2.5V,則報(bào)警
        NOP
        BTFSC ACCBHI,7
        CALL DISPLAY0 ;若沒有超過2.5V,則不報(bào)警,8個(gè)LED
        ;同時(shí)顯示0
        CALL DELAY ;軟件延時(shí),使電壓檢測不要過于頻繁
        GOTO LOOP ;重復(fù)檢測輸入的直流電壓值
        END

        單片機(jī)相關(guān)文章:單片機(jī)教程


        單片機(jī)相關(guān)文章:單片機(jī)視頻教程


        單片機(jī)相關(guān)文章:單片機(jī)工作原理



        上一頁 1 2 下一頁

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 巫山县| 鄂伦春自治旗| 永靖县| 卢龙县| 东丰县| 新田县| 湖口县| 孙吴县| 瑞丽市| 扶沟县| 原平市| 玉田县| 个旧市| 磴口县| 南丹县| 元江| 营口市| 五河县| 临澧县| 丘北县| 临桂县| 华亭县| 定州市| 平凉市| 类乌齐县| 梁河县| 峡江县| 阳谷县| 龙井市| 额济纳旗| 那曲县| 大英县| 将乐县| 班玛县| 永寿县| 莫力| 周宁县| 定兴县| 溧阳市| 峨眉山市| 渑池县|