十年專注單片機方案開發的方案公司英銳恩,分享一個簡單的利用PC機的串口讀取ICD1板上AD0電壓的程序。英銳恩現提供服務產品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。
用的是PIC16F877A單片機來調試的,下面是PIC的ASM文件,由于是用于其它的目的,用在這里有些代碼是多余的!
;
;用于串口實驗的程序,主要的是10位
;
INCLUDE
LIST P=16F877
BANK3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1 ;體3
ENDM
BANK2 MACRO
BCF STATUS,RP0;
BSF STATUS,RP1 ;
ENDM ;
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1 ;
ENDM
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1 ;體0
ENDM
READCUNT EQU 70H ;
COUNT1 EQU 72H ;
TEMP EQU 73H ;
FEIFA EQU 74H ;
TEMP1 EQU 75H ;
TEMP2 EQU 76H ;
CNT EQU 77H ;
SOU EQU 78H ;
SOUH EQU 79H ;
RLT EQU 7AH ;
TEMP3 EQU 7BH;
ORG 0000H ;
NOP ;
GOTO STATUP ;主要程序的入口
ORG 004H ;中斷的入口
HIGHISR
BTFSS PIR1,RCIF ;判斷是否為USART中斷
RETFIE ;不是中斷返回
MOVF RCREG,0 ;取RCREG的數值到W中,同時RCIF變為零
MOVWF TEMP2 ;暫時保存W中的數值用于下個轉換時用A
SUBLW 41H ;是否為回車,這個指令是取電壓指令,對應鍵盤上的回車
BTFSS STATUS,Z ;
GOTO FEEDBACK;NEXT1 ;不是;目前的處理是出錯時返回原來的數值
CALL DYZH ;是CALL 電壓轉換
RETFIE
; GOTO FEEDBACK ;
; BTFSS FEIFA,0 ;
; GOTO CALL1;
; GOTO CALL2;
NEXT1;
MOVF TEMP2,0 ;
SUBLW 44H ;溫度1的判斷,對應鍵盤上的D
BTFSS STATUS,Z ;
RETFIE ;也不是那就中斷返回
CALL WDZH1 ;
RETFIE ;轉換完成就返回中斷
CALL1
CLRF COUNT1;
CALL TABLE
GOTO EXIT;
CALL2
MOVLW D'26';
MOVWF COUNT1;
CALL TABLE;
EXIT
CLRF READCUNT;
CLRF FEIFA;
RETFIE;
FEEDBACK
MOVF RCREG,0;
BTFSS PIR1,TXIF;
GOTO $-1;
MOVWF TXREG;
RETFIE;;;
MOVF READCUNT,0;
CALL READ2;
INCF READCUNT,1;
SUBWF RCREG,0;
BTFSC STATUS,Z;
RETFIE;
BSF FEIFA,0;
RETFIE;
;
TABLE
LOOP
MOVF COUNT1,0
CALL READ1;
MOVWF TEMP;
GETDATA
BTFSS PIR1,TXIF;
GOTO GETDATA;
MOVWF TXREG;
INCF COUNT1,1;
MOVF TEMP,0;
BTFSS STATUS,Z;
GOTO LOOP;
RETURN;
READ1
ADDWF PCL,1;
RETLW A'\N';
RETLW A'\R';
RETLW A'M';
RETLW A'Y';
RETLW A' ';
RETLW A'N';
RETLW A'A';
RETLW A'M';
RETLW A'E';
RETLW A' ';
RETLW A'I';
RETLW A'S';
RETLW A' ';
RETLW A'P';
RETLW A'I';
RETLW A'C';
RETLW A'1';
RETLW A'6';
RETLW A'F';
RETLW A'8';
RETLW A'7';
RETLW A'7';
RETLW A'.';
RETLW A'\N';
RETLW A'\R';
RETLW 0
READ
RETLW A'N';
RETLW A'R';
RETLW A'E';
RETLW A'R';
RETLW A'R';
RETLW A'O';
RETLW A'R';
RETLW A'!';
RETLW A'\N';
RETLW A'\R';
RETLW 0
READ2
ADDWF PCL,1;
RETLW A'W';
RETLW A'H';
RETLW A'A';
RETLW A'T';
RETLW A' ';
RETLW A'I';
RETLW A'S';
RETLW A' ';
RETLW A'Y'
RETLW A'O';
RETLW A'U';
RETLW A'R';
RETLW A' ';
RETLW A'N';
RETLW A'A';
RETLW A'M';
RETLW A'E';
RETLW A'?';
STATUP ;這邊是程序的初始化
BANK1 ;選體1
BSF TRISC,6 ;
BSF TRISC,7 ;
BCF TRISC,0 ;
MOVLW D'12' ;
MOVWF SPBRG ;
MOVLW B'00100100' ;24H
MOVWF TXSTA ;
BSF PIE1,RCIE ;
MOVLW 0FFH ;
MOVWF TRISA ;設置RA口為輸入
MOVLW B'10000010' ;設置為AD0進入轉換,基準電壓為VDDANDVSS,右對齊方式,結果是ADRESH 高.ADRESL 低,
MOVWF ADCON1 ;RA0,1,2,3,4,是AD口,RE2,1,0是數字口
BANK0 ;恢復體0
MOVLW 35H ;
MOVWF T1CON ;
MOVLW B'10010000' ;
MOVWF RCSTA ;
BSF INTCON,GIE ;
BSF INTCON,PEIE ;
CLRF READCUNT ;
CLRF FEIFA ;
MAIN
;
; call dyzh
; goto $
CLRWDT ;
BTFSS PIR1,TMR1IF ;
GOTO MAIN ;
BCF PIR1,TMR1IF ;
MOVLW B'00000001' ;
XORWF PORTC,1 ;
GOTO MAIN ;
;*******************************************************************
;這個是電壓轉換
DYZH;電壓轉換程序
MOVLW B'01000001' ;SELECT AD0,OPEN AD;
MOVWF ADCON0 ;
BSF ADCON0,GO ;GO Bit是自動清零
BTFSS PIR1,ADIF ;
GOTO $-1 ;
MOVF ADRESH,0 ;
MOVWF SOUH ;
BANK1 ;
MOVF ADRESL,0 ;
MOVWF SOU ;
BANK0 ;
; MOVLW 32H;
; MOVWF SOU;
; MOVLW 48H;
; MOVWF SOUH;
CALL DBTBCD ;已經是轉換完成
CALL BCDTX ;CALL BCD碼發送
RETURN ;
WDZH1;溫度1的轉換
MOVLW B'01001001' ;
MOVWF ADCON0 ;
BSF ADCON0,GO ;
BTFSS PIR1,ADIF ;
GOTO $-1 ;
CALL DBTBCD ;
CALL BCDTX ;
RETURN;
;
;********************DBTBCD********************
;本程序實現雙字節二進制數轉化為3字節壓縮BCD碼。
;入口參數:原二進制數在SOUH:SOU中。
;出口參數:結果在RLT:SOUH:SOU中。
;占用資源:W,STATUS,FSR,023H,024H,025H,026H,028H,029,02AH,兩重堆棧。
DBTBCD MOVF SOU,W
MOVWF TEMP2
MOVF SOUH,W
MOVWF TEMP3
CLRF SOU
CLRF SOUH
CLRF RLT
BCF STATUS,C
MOVLW .16
MOVWF CNT
LOOPC1 RLF TEMP2,F
RLF TEMP3,F
RLF SOU,F
RLF SOUH,F
RLF RLT,F
DECFSZ CNT,F
GOTO ADJDEC1
RETURN ;整個子程序結束
ADJDEC1 MOVLW SOU
MOVWF FSR
CALL ADJBCD1 ;調整RLT
MOVLW SOUH
MOVWF FSR
CALL ADJBCD1 ;調整RLTH
MOVLW RLT
MOVWF FSR
CALL ADJBCD1 ;調整TEMP1
GOTO LOOPC1
;********************調整BCD********************
ADJBCD1 MOVLW 03H
ADDWF INDF,W ;低四位加3
MOVWF TEMP1 ;暫存
BTFSC TEMP1,3 ;結果大于7,
MOVWF INDF ;則存起來
MOVLW 30H
ADDWF INDF,W ;高四位加3
MOVWF TEMP1
BTFSC TEMP1,7 ;結果大于7,
MOVWF INDF ;則存起來
RETURN
;**********************************
;結果的順序是RLT SOUH SOU
BCDTX;
SWAPF RLT,0;
ANDLW 0FH;
BTFSS PIR1,TXIF;
GOTO $-1;
CALL READASC;
MOVWF TXREG;
MOVF RLT,0;
ANDLW 0FH;
BTFSS PIR1,TXIF;
GOTO $-1;
CALL READASC;
MOVWF TXREG ;這個是發送完RLT字節
SWAPF SOUH,0;
ANDLW 0FH;
BTFSS PIR1,TXIF;
GOTO $-1;
CALL READASC;
MOVWF TXREG;
MOVF SOUH,0;
ANDLW 0FH;
BTFSS PIR1,TXIF;
GOTO $-1;
CALL READASC;
MOVWF TXREG ;這個是發送完SOUH字節
SWAPF SOU,0;
ANDLW 0FH;
BTFSS PIR1,TXIF;
GOTO $-1;
CALL READASC;
MOVWF TXREG;
MOVF SOU,0;
ANDLW 0FH;
BTFSS PIR1,TXIF;
GOTO $-1;
CALL READASC;
MOVWF TXREG ;這個是發送完SOU字節
BTFSS PIR1,TXIF ;
GOTO $-1 ;
; MOVLW A'\N';
; MOVWF TXREG;
; BTFSS PIR1,TXIF;
; GOTO $-1;
; MOVLW A'\R';
; MOVWF TXREG;
; MOVLW 00H ;這個是用來換行的00H
; CALL READ3 ;
; MOVWF TXREG ;
; BTFSS PIR1,TXIF ;
; GOTO $-1 ;
; MOVLW 01H ;01H
; CALL READ3 ;
; MOVWF TXREG ;
RETURN ;返回
READASC
ADDWF PCL,1;
RETLW A'0';
RETLW A'1';
RETLW A'2';
RETLW A'3';
RETLW A'4';
RETLW A'5';
RETLW A'6';
RETLW A'7';
RETLW A'8';
RETLW A'9';
READ3 ;
ADDWF PCL,1 ;
RETLW A'\n' ;
RETLW A'\r' ;
END;
實驗時,串口配置波特率要選擇19200,數據位是8位,校驗位是N,停止位是1.就可以,調節ICD1板上的電壓就可以在程序中顯示出來,分辨率是10位.