?? ad.asm
字號:
;程序名: AD轉化實驗小程序(練習)
;創建人: 魏鴻林
;創建時間:2003/11/18
;修改人:
;描 述: 使用實驗板上PORTD上的八個LED 表示數據采集輸入端的電壓值,電壓值越大,顯示的LED數越多,且按順序遞增.
; AD參考電壓為單片機工作電源
; 光線越強,點亮的LED數越多
LIST P=16F877
#INCLUDE<P16F877.INC>
;;;;;;;;;;;;;;;;;;;;;;;;;變量定義;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADH EQU 20H ;保存AD轉化高字節數據
ADL EQU 21H ;保存AD轉化低字節數據
W_TEMP EQU 22H ;中斷暫存W
STATUS_TEMP EQU 23H ;中斷暫存STATUS
COUNT EQU 24H ;記錄中斷次數
;;;;;;;;;;;;;;;;;;;;;;;;;程序體;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H
NOP
GOTO MAIN
ORG 04H
GOTO INTSVR
ORG 10
MAIN:
LCALL SYSCONFIG_FOR_PORT ;調用I/O口設置配置
LCALL SYSCONFIG_FOR_AD ;調用AD模塊配置
MOVLW 64 ;初始化濾波參數
MOVWF COUNT ;64意味著對AD轉化得到的連繼的64個數據取平均值
CLRF ADL ;初始化AD轉化數據的高低字節
CLRF ADH
LOOP_M ;等待中斷
NOP
GOTO LOOP_M
;;;;;;;;;;;;;;;;;;;;;;;中斷服務程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTSVR:
BCF INTCON,GIE
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
LCALL ADSVR ;因為在本練習中只可能產生一種中斷,,故不作判斷,直接進入中斷數據處理序
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
BSF ADCON0,GO
BSF INTCON,GIE
RETFIE
;AD轉化模塊配置
SYSCONFIG_FOR_AD:
BCF ADCON0,ADCS1 ;選擇時鐘源的頻率(一般是越快越好)
BCF ADCON0,ADCS0
BCF ADCON0,CHS2 ;通道選擇(選擇通道 2)
BSF ADCON0,CHS1 ;(RA0是滑變輸出端,RA1是溫度傳感器輸出端,RA2是光傳感器輸出端)
BCF ADCON0,CHS0 ;這里選用光傳感器
BSF ADCON0,ADON ;打開AD模塊
BSF STATUS,RP0
MOVLW 80H ;AD轉化的結果靠左存放,所有PORTA通道都設置為模擬信號通道
MOVWF ADCON1 ;參考電壓使用Vdd Vss
BCF STATUS,RP0
BCF PIR1,ADIF ;清除AD中斷標志位,,
BSF STATUS,RP0
BSF PIE1,ADIE ;AD中斷使能打開
BSF INTCON,PEIE ;外圍總中斷使能打開
BSF INTCON,GIE ;總中斷使能打開
BCF STATUS,RP0
BSF ADCON0,GO ;發出轉化指令(當轉化完成時,會被硬件自動清零,在查詢法中可用)
RETURN
;I/O口配置
SYSCONFIG_FOR_PORT:
BSF STATUS,RP0 ;在設置端口時注意選擇BANK1
CLRF TRISD ;D口作為輸出端口
MOVLW 0FFH ;A口作為輸出口
MOVWF TRISA
BCF STATUS,RP0
RETURN
;;;;;;;;;;;;;;;;;;AD數據處理子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADSVR:
BCF PIR1,ADIF ;如果總是出現堆棧溢出,,,這里可能是原因之一哦,,,
BSF STATUS,RP0 ;AD低字節保存在BANK1
MOVF ADRESL,0 ;把AD轉化結果 低位數據累加
BCF STATUS,RP0
ADDWF ADL,F
BTFSC STATUS,C ;如果有出現進位,向高字節加1
INCF ADH,F
MOVF ADRESH,0 ;把AD轉化結果 高位數據累加
ADDWF ADH,F
DECFSZ COUNT ;這里使用了 軟件平均值濾波
GOTO AD_EXIT ;在沒有達到采樣次數時,不把轉化結果反映到LED輸出
;只是簡單地進行數據堆積
NOP
;SWAPF ADH,F ;AD轉化結果數據處理 (這段代碼具體解釋,請見說明)
RRF ADH,F
;RRF ADH,F
MOVLW B'00000111'
ANDWF ADH,F
MOVF ADH,0
LCALL TAB
MOVWF PORTD
;存儲區復原,準備下一次AD數據處理
CLRF ADH
CLRF ADL
MOVLW 64
MOVWF COUNT
AD_EXIT:
RETURN
;LED顯示表
TAB:
ADDWF PCL,F
;RETLW 00H
RETLW 01H
RETLW 03H
RETLW 07H
RETLW 0FH
RETLW 1FH
RETLW 3FH
RETLW 7FH
RETLW 0FFH
RETLW 0FFH ;表中共有九行,,,多余的行,,,是為了防止程序跑到意料之外的地方去
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -