十年專注單片機方案開發的方案公司英銳恩,分享采集11路AD\2路頻率由串口送PC。英銳恩現提供服務產品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。
877A只有8路AD通過外加CD4053完成13路.以下為程序,多謝大家指教!
;************************************************************************************* ;波特率設為9600,數據位8位, ;停止位1位,無校驗位,數組15組.第一個數組為0X55最后一個為0XAA,PC接收時校驗用.
;DATE:2005-07-01 ;VERSION:1.0 ;************************************************************************************** LIST P=16F877 INCLUDE "P16F877.INC"
TXSTART EQU 20 ;累加校驗高位 AD0 EQU 21 ;采樣發送模擬數組 AD1 EQU 22 AD2 EQU 23 AD3 EQU 24 AD4 EQU 25 AD5 EQU 26 AD6 EQU 27 AD7 EQU 28 AD8 EQU 29 AD9 EQU 2A AD10 EQU 2B CK0 EQU 2C ;采樣發送頻率數組 CK1 EQU 2D TXEND EQU 2E ;累加校驗低位
COUNTER EQU 2F ;ADC計數器 COUNT1 EQU 30 ;定時計數器1 COUNT2 EQU 31 ;定時計數器2 ADBUFF1 EQU 32 ;AD采樣緩沖數組 ADBUFF2 EQU 33 ADBUFF3 EQU 34 ADBUFF4 EQU 35 ADBUFF5 EQU 36 ADBUFF6 EQU 37 TXPTR EQU 38 ;發送指針 TXCOUNT EQU 39 ;發送計數器 T2COUNT EQU 3A ;T2計數器 W_TEMP EQU 70H ;備份寄存器 S_TEMP EQU 71H F_TEMP EQU 72H
;********************************************************* ORG 0X00 GOTO MAIN
;********************************************************* ORG 0X04 GOTO INT ORG 0X05
;*********************************************************************************** INT ;*********************************************************************************** MOVWF W_TEMP SWAPF STATUS,W CLRF STATUS MOVWF S_TEMP MOVFW FSR MOVWF F_TEMP
CHKTXINT BTFSC PIR1,TMR2IF GOTO T2 CHTX BANKSEL PIE1 BTFSS PIE1,TXIE GOTO ENDINT CLRF STATUS BTFSS PIR1,TXIF GOTO ENDINT
MOVLW TXSTART MOVWF FSR MOVF TXPTR,W ADDWF FSR,F MOVF INDF,W MOVWF TXREG INCF TXPTR,F DECFSZ TXCOUNT GOTO ENDINT BANKSEL PIE1 BCF PIE1,TXIE GOTO ENDINT
T2 CLRF STATUS BCF PIR1,TMR2IF INCF T2COUNT MOVLW .10 SUBWF T2COUNT,W BTFSS STATUS,Z GOTO ENDINT MOVF TMR0,W MOVWF CK0 MOVF TMR1L,W MOVWF CK1 CLRF TMR0 CLRF TMR1L CLRF T2COUNT ENDINT CLRF STATUS MOVFW F_TEMP MOVWF FSR SWAPF S_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W
RETFIE ;*********************************************************************************** INITIAL ;*********************************************************************************** BSF STATUS,RP0 ;設置寄存器體1 CLRF ADCON1 ;轉換結果左對齊,A/D通道全選 MOVLW 0FFH ;RA0為模擬輸入 MOVWF TRISA ;RA4=CK1,RA0~5=AD MOVWF TRISE ;RE0~2=AD MOVLW 00H ;不用設為輸出 MOVWF TRISB MOVWF TRISD MOVLW B'10000001' ;RC7=RX,RC6=TX,RC2=選擇輸入,RC0=CK2, MOVWF TRISC MOVLW B'11111111' ;上拉+中斷NO ;外部時鐘//上升沿計數 MOVWF OPTION_REG ;預分頻分給WDT;分頻比為1:128 MOVLW B'00100100' ;8位數據/發送使能/異步方式 MOVWF TXSTA ;高速波特率/ MOVLW .25 ;9600// 51 (4800) MOVWF SPBRG ; MOVLW 0C3H ;設定每50MS中斷一次 MOVWF PR2 CLRF PIE1 BSF PIE1,TMR2IE
BCF STATUS,RP0 ;恢復寄存器體0 MOVLW B'10010000' MOVWF RCSTA MOVLW B'01000001' ;選擇:時鐘時鐘源為FOSC/8,允許ADC工作 MOVWF ADCON0 ;通道AN0,暫時不啟動轉換過程 MOVLW B'00000010' ;外部計數/分頻1:1/暫不啟動 MOVWF T1CON MOVLW B'01111111' ;預后分頻1:16,計數暫停 MOVWF T2CON CLRF TMR0
CLRF PORTC MOVLW 0x20 MOVWF FSR RE CLRF INDF INCF FSR,F MOVLW 0x3B XORWF FSR,W BTFSS STATUS,Z GOTO RE CLRF INTCON BSF INTCON,PEIE BSF INTCON,GIE RETURN ;*********************************************************************************** MAIN ;*********************************************************************************** CALL INITIAL LOOP CLRWDT BCF PORTC,2 ;RE通道1 CALL DELAY NOP CALL ADC MOVLW B'01001001' ;選擇通道1 MOVWF ADCON0 CALL LEACH MOVWF AD0
CALL ADC MOVLW B'01010001' ;選擇通道2 MOVWF ADCON0 CALL LEACH MOVWF AD1
CALL ADC MOVLW B'01011001' ;選擇通道3 MOVWF ADCON0 CALL LEACH MOVWF AD2
CALL ADC MOVLW B'01100001' ;選擇通道4 MOVWF ADCON0 CALL LEACH MOVWF AD3
CALL ADC MOVLW B'01101001' ;選擇通道5 MOVWF ADCON0 CALL LEACH MOVWF AD4
CALL ADC MOVLW B'01110001' ;選擇通道6 MOVWF ADCON0 CALL LEACH MOVWF AD5
CALL ADC MOVLW B'01111001' ;選擇通道7 MOVWF ADCON0 CALL LEACH MOVWF AD6
CALL ADC MOVLW B'01101001' ;選擇通道5 MOVWF ADCON0 CALL LEACH MOVWF AD7
BSF PORTC,2 ;RE通道2 CALL DELAY
CALL ADC MOVLW B'01110001' ;選擇通道6 MOVWF ADCON0 CALL LEACH MOVWF AD8
CALL ADC MOVLW B'01111001' ;選擇通道7 MOVWF ADCON0 CALL LEACH MOVWF AD9
CALL ADC MOVLW B'01000001' ;選擇通道0 MOVWF ADCON0 CALL LEACH MOVWF AD10
MOVLW 55H MOVWF TXSTART MOVLW 0AAH MOVWF TXEND CLRF TXPTR MOVLW .15 MOVWF TXCOUNT BANKSEL PIE1 BSF PIE1,TXIE CLRF STATUS GOTO
LOOP ;************************************************************************ ;*********************************************************************************** ADC ;*********************************************************************************** MOVLW ADBUFF1 MOVWF FSR MOVLW 6H MOVWF COUNTER ADCLOOP BSF ADCON0,GO ;開啟A/D轉換過程 WAIT BTFSC ADCON0,GO ;等待A/D轉換過程結束,檢測ADC中斷標志位 GOTO WAIT ;如果沒有轉換結束,則返回循環檢測 MOVF ADRESH,W ;僅取高8位,把A/D結果讀到W MOVWF INDF INCF FSR DECFSZ COUNTER,F GOTO ADCLOOP RETURN ;***********************************************************************************
LEACH ;過濾 (采用6駔數據去掉最高最低數,中間四位取平均) ;***********************************************************************************
MOVF ADBUFF1,W SUBWF ADBUFF6,W BTFSS STATUS,C GOTO CHANGE1 BUFF2 MOVF ADBUFF2,W SUBWF ADBUFF6,W BTFSS STATUS,C GOTO CHANGE2 MOVF ADBUFF2,W SUBWF ADBUFF1,W BTFSC STATUS,C GOTO CHANGE3 BUFF3 MOVF ADBUFF3,W SUBWF ADBUFF6,W BTFSS STATUS,C GOTO CHANGE4 MOVF ADBUFF3,W SUBWF ADBUFF1,W BTFSC STATUS,C GOTO CHANGE5 BUFF4 MOVF ADBUFF4,W SUBWF ADBUFF6,W BTFSS STATUS,C GOTO CHANGE6 MOVF ADBUFF4,W SUBWF ADBUFF1,W BTFSC STATUS,C GOTO CHANGE7 BUFF5 MOVF ADBUFF5,W SUBWF ADBUFF6,W BTFSS STATUS,C GOTO CHANGE8 MOVF ADBUFF5,W SUBWF ADBUFF1,W BTFSC STATUS,C GOTO CHANGE9 ;****************************************************************************************** AVERAGE ;平均 ;********************************************************************
CLRF ADBUFF1 MOVF ADBUFF2,W ADDWF ADBUFF3,F BTFSC STATUS,C INCF ADBUFF1 MOVF ADBUFF4,W ADDWF ADBUFF3,F BTFSC STATUS,C INCF ADBUFF1 MOVF ADBUFF5,W ADDWF ADBUFF3,F BTFSC STATUS,C INCF ADBUFF1 RRF ADBUFF1 RRF ADBUFF3 RRF ADBUFF1 RRF ADBUFF3 MOVF ADBUFF3,W RETURN ;*********************************************************************************** CHANGE1 ;互換 ;************************************************************************
ADDWF
ADBUFF1,F SUBWF ADBUFF6,F GOTO BUFF2 CHANGE2 ADDWF ADBUFF2,F SUBWF
ADBUFF6,F GOTO BUFF3 CHANGE3 ADDWF ADBUFF2,F SUBWF ADBUFF1,F GOTO BUFF3
CHANGE4 ADDWF ADBUFF3,F SUBWF ADBUFF6,F GOTO BUFF4 CHANGE5 ADDWF
ADBUFF3,F SUBWF ADBUFF1,F GOTO BUFF4 CHANGE6 ADDWF ADBUFF4,F SUBWF
ADBUFF6,F GOTO BUFF5 CHANGE7 ADDWF ADBUFF4,F SUBWF ADBUFF1,F GOTO BUFF5
CHANGE8 ADDWF ADBUFF5,F SUBWF ADBUFF6,F GOTO AVERAGE CHANGE9 ADDWF
ADBUFF5,F SUBWF ADBUFF1,F GOTO AVERAGE
;******************************************************************************************
DELAY ;顯示廷時常數,廷時時間為3*255*65+6us+4us=50ms
MOVLW 41H MOVWF COUNT1 L2 CLRWDT MOVLW 0FFH MOVWF COUNT2 L3 DECFSZ
COUNT2,1 GOTO L3 DECFSZ COUNT1,1 GOTO L2 RETLW 0
;*************************************************************************************
END