專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應(yīng)用測(cè)試 完善的開發(fā)代碼案例庫(kù)分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!
十年專注單片機(jī)方案開發(fā)的方案公司英銳恩,分享一個(gè)簡(jiǎn)單的利用PC機(jī)的串口讀取ICD1板上AD0電壓的程序。英銳恩現(xiàn)提供服務(wù)產(chǎn)品涉及主控芯片:8位單片機(jī)、16位單片機(jī)、32位單片機(jī)及各類運(yùn)算放大器等。
用的是PIC16F877A單片機(jī)來調(diào)試的,下面是PIC的ASM文件,由于是用于其它的目的,用在這里有些代碼是多余的!
;
;用于串口實(shí)驗(yàn)的程序,主要的是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的數(shù)值到W中,同時(shí)RCIF變?yōu)榱?br/> MOVWF TEMP2 ;暫時(shí)保存W中的數(shù)值用于下個(gè)轉(zhuǎn)換時(shí)用A
SUBLW 41H ;是否為回車,這個(gè)指令是取電壓指令,對(duì)應(yīng)鍵盤上的回車
BTFSS STATUS,Z ;
GOTO FEEDBACK;NEXT1 ;不是;目前的處理是出錯(cuò)時(shí)返回原來的數(shù)值
CALL DYZH ;是CALL 電壓轉(zhuǎn)換
RETFIE
; GOTO FEEDBACK ;
; BTFSS FEIFA,0 ;
; GOTO CALL1;
; GOTO CALL2;
NEXT1;
MOVF TEMP2,0 ;
SUBLW 44H ;溫度1的判斷,對(duì)應(yīng)鍵盤上的D
BTFSS STATUS,Z ;
RETFIE ;也不是那就中斷返回
CALL WDZH1 ;
RETFIE ;轉(zhuǎn)換完成就返回中斷
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 ;設(shè)置RA口為輸入
MOVLW B'10000010' ;設(shè)置為AD0進(jìn)入轉(zhuǎn)換,基準(zhǔn)電壓為VDDANDVSS,右對(duì)齊方式,結(jié)果是ADRESH 高.ADRESL 低,
MOVWF ADCON1 ;RA0,1,2,3,4,是AD口,RE2,1,0是數(shù)字口
BANK0 ;恢復(fù)體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 ;
;*******************************************************************
;這個(gè)是電壓轉(zhuǎn)換
DYZH;電壓轉(zhuǎn)換程序
MOVLW B'01000001' ;SELECT AD0,OPEN AD;
MOVWF ADCON0 ;
BSF ADCON0,GO ;GO Bit是自動(dòng)清零
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 ;已經(jīng)是轉(zhuǎn)換完成
CALL BCDTX ;CALL BCD碼發(fā)送
RETURN ;
WDZH1;溫度1的轉(zhuǎn)換
MOVLW B'01001001' ;
MOVWF ADCON0 ;
BSF ADCON0,GO ;
BTFSS PIR1,ADIF ;
GOTO $-1 ;
CALL DBTBCD ;
CALL BCDTX ;
RETURN;
;
;********************DBTBCD********************
;本程序?qū)崿F(xiàn)雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)化為3字節(jié)壓縮BCD碼。
;入口參數(shù):原二進(jìn)制數(shù)在SOUH:SOU中。
;出口參數(shù):結(jié)果在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 ;整個(gè)子程序結(jié)束
ADJDEC1 MOVLW SOU
MOVWF FSR
CALL ADJBCD1 ;調(diào)整RLT
MOVLW SOUH
MOVWF FSR
CALL ADJBCD1 ;調(diào)整RLTH
MOVLW RLT
MOVWF FSR
CALL ADJBCD1 ;調(diào)整TEMP1
GOTO LOOPC1
;********************調(diào)整BCD********************
ADJBCD1 MOVLW 03H
ADDWF INDF,W ;低四位加3
MOVWF TEMP1 ;暫存
BTFSC TEMP1,3 ;結(jié)果大于7,
MOVWF INDF ;則存起來
MOVLW 30H
ADDWF INDF,W ;高四位加3
MOVWF TEMP1
BTFSC TEMP1,7 ;結(jié)果大于7,
MOVWF INDF ;則存起來
RETURN
;**********************************
;結(jié)果的順序是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 ;這個(gè)是發(fā)送完RLT字節(jié)
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 ;這個(gè)是發(fā)送完SOUH字節(jié)
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 ;這個(gè)是發(fā)送完SOU字節(jié)
BTFSS PIR1,TXIF ;
GOTO $-1 ;
; MOVLW A'\N';
; MOVWF TXREG;
; BTFSS PIR1,TXIF;
; GOTO $-1;
; MOVLW A'\R';
; MOVWF TXREG;
; MOVLW 00H ;這個(gè)是用來?yè)Q行的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;
實(shí)驗(yàn)時(shí),串口配置波特率要選擇19200,數(shù)據(jù)位是8位,校驗(yàn)位是N,停止位是1.就可以,調(diào)節(jié)ICD1板上的電壓就可以在程序中顯示出來,分辨率是10位.