;此匯編程序?qū)崿F(xiàn)A/D轉(zhuǎn)換功能,應(yīng)用于pic單片機(jī)上,A/D采用中斷方式。該程序通過(guò)單片機(jī)的RA2模擬通道送入
;一直流電壓,當(dāng)送入的直流電壓大于2.5V時(shí),8個(gè)LED閃動(dòng),當(dāng)直流電壓恢復(fù)到2.5V以下
;時(shí),LED停止閃動(dòng)。為了防止干擾,本程序?qū)χ绷麟妷翰蓸?0次后再作判斷,中間的采樣結(jié)
;果用間接尋址的方式存取。
LIST P=18F458
INCLUDE "P18F458.INC"
TIMES EQU 0X20
DEY EQU TIMES+1
ACCALO EQU TIMES+2 ;ACCA為雙精度加數(shù)寄存器
ACCAHI EQU TIMES+3
ACCBLO EQU TIMES+4 ;ACCB為雙精度加法的結(jié)果寄存器
ACCBHI EQU TIMES+5
FLAG EQU TIMES+6
DEYH EQU TIMES+7
DEYL EQU TIMES+9
BEGFSR EQU 0X30 ;間接尋址FSR的起始值(宏定義方式給出)
ORG 0X0000
GOTO MAIN
ORG 0X0008
GOTO INTSERVE ;轉(zhuǎn)向中斷服務(wù)子程序
ORG 0X30
;***雙字節(jié)減法子程序,入口地址ACCB-ACCA,出口地址ACCB***
D_SUB
CALL NEG_A ;求ACCA的補(bǔ)碼
;***雙字節(jié)加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
D_ADD
MOVF ACCALO,0 ;ACCB和ACCA低半字節(jié)相加
ADDWF ACCBLO
BTFSC STATUS,C ;有進(jìn)位否?
INCF ACCBHI ;有,ACCB高字節(jié)加1,再加ACCAHI
MOVF ACCAHI,0 ;ACCA、ACCB高半字節(jié)相加
ADDWF ACCBHI
RETURN ;子程序返回
;************** ACCA取補(bǔ)子程序*****************
NEG_A
COMF ACCALO ;ACCALO取反加1
INCF ACCALO
BTFSC STATUS,Z ;低8位有進(jìn)位嗎?
DECF ACCAHI ;有,ACCAHI減1,再取反
COMF ACCAHI ;否則ACCAHI直接取反
RETURN ;子程序返回
;*********初始化子程序***************
INITIAL
CLRF INTCON ;禁止總中斷和外圍中斷
MOVLW 0X51
MOVWF ADCON0 ;選擇AD通道為RA2,且打開(kāi)A/D轉(zhuǎn)換器
;在工作狀態(tài),且使AD轉(zhuǎn)換時(shí)鐘為8Tosc
MOVLW 0X80
MOVWF ADCON1 ;轉(zhuǎn)換結(jié)果右移,即ADRESH寄存器的高6
;位為"0",且把RA2口設(shè)置為模擬量輸入式
;(注意后面要把RA5改成數(shù)據(jù)I/O方式,以
;輸出顯示瑣存信號(hào))
BCF PIR1,ADIF ;清除A/D轉(zhuǎn)換標(biāo)志
BSF PIE1,ADIE ;A/D轉(zhuǎn)換中斷允許
BSF INTCON,PEIE ;外圍中斷允許
BSF IPR1,ADIP ;B口變位中斷高優(yōu)先級(jí)
BSF RCON,7 ;使能中斷優(yōu)先級(jí)
BSF TRISA,2 ;設(shè)置RA2為輸入方式
BCF TRISA,5 ;置RA5為輸出方式,以輸出鎖存信號(hào)
BCF TRISC,5
BCF TRISC,3 ;設(shè)置SCK與SDO為輸出方式
MOVLW 0XC0
MOVWF SSPSTAT ;設(shè)置SSPSTAT寄存器
MOVLW 0X30
MOVWF SSPCON1 ;設(shè)置SPI的控制方式,允許SSP方式,并
;且時(shí)鐘下降沿發(fā)送,與"74HC595當(dāng)其
;SCLK從低到高電平跳變時(shí),串行輸入數(shù)據(jù)
;(DI)移入寄存器"的特點(diǎn)相應(yīng)
CLRF FLAG
RETURN
;*********軟件延時(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 ;讀取并存儲(chǔ)A/D轉(zhuǎn)換結(jié)果的高兩位
INCF FSR0L
MOVF ADRESL,W
MOVWF INDF0
INCF FSR0L ;讀取并存儲(chǔ)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 ;啟動(dòng)下一次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 ;啟動(dòng)發(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è)鎖存信號(hào),代表一次顯示任務(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 ;啟動(dòng)發(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è)鎖存信號(hào),代表一次顯示任務(wù)完成
RETURN
;*********PIC單片機(jī)A/D轉(zhuǎn)換匯編程序主程序************
;轉(zhuǎn)載請(qǐng)保留文章原始出處http://www.zg4o1577.cn 單片機(jī)網(wǎng)
MAIN NOP
CALL INITIAL ;初始化
LOOP
MOVLW 0X80 ;轉(zhuǎn)換結(jié)果右移,及ADRESH寄存器的高6位為"0"
;且把RA2口設(shè)置為模擬量輸入式(注意后面要把
; RA5改成數(shù)據(jù)I/O方式,以輸出顯示瑣存信號(hào))
MOVWF ADCON1
MOVLW BEGFSR
MOVWF FSR0L ;給出間接尋址時(shí)FSR的初值
MOVLW 0X0A
MOVWF TIMES ;每一輪A/D連續(xù)采樣10次
BSF INTCON,GIE ;總中斷打開(kāi),及可以進(jìn)行A/D轉(zhuǎn)換中斷
BSF ADCON0,2 ;啟動(dòng)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,以輸出顯示鎖存信號(hào)
MOVLW 0X14
MOVWF ACCAHI
CLRF ACCALO
CALL D_SUB ;通過(guò)雙精度減判斷模擬量是否達(dá)到報(bào)警限
;度(1400H=200H*0AH,200H與2.5V對(duì)應(yīng))
BTFSS ACCBHI,7
CALL ALARM ;若ACCBHI的最高位為1,則證明減法結(jié)
;果為負(fù),即直流電壓值超過(guò)2.5V,則報(bào)警
NOP
BTFSC ACCBHI,7
CALL DISPLAY0 ;若沒(méi)有超過(guò)2.5V,則不報(bào)警,8個(gè)LED
;同時(shí)顯示0
CALL DELAY ;軟件延時(shí),使電壓檢測(cè)不要過(guò)于頻繁
GOTO LOOP ;重復(fù)檢測(cè)輸入的直流電壓值
END