?? usart 通過232通訊例程.txt
字號:
232
RS232通信方式是常用的單片機與PC通信的方式,PIC16F87X系列芯片可以通過SCI(串行通信接口)來實現(xiàn)與PC的通信。以下我們將通過ICDDEMO演示實驗板上的RS232通信電路來調(diào)試與PC的通信,其電路如下圖所示:
其中TX和RX分別為PIC16F877的發(fā)送和接收引腳,由于PC的串口輸出的是12V電壓,因此要實現(xiàn)PIC芯片和PC的通信,還需要進行電平轉(zhuǎn)換,該板使用的電平轉(zhuǎn)換芯片是MAX232。在調(diào)試之前請將PC與ICDDEMO演示實驗板用9芯串行電纜連接好并鎖緊,并且將DIP6(S10)的第2、4開關(guān)撥至“ON”的位置上。調(diào)試時PC用的上位機程序可以采用WINDOWS帶的超級終端(啟動方式:開始-)程序-)附件-)通訊-)超級終端),或者使用網(wǎng)上很容易找到的串口調(diào)試軟件。
1、 串行通信的波特率設(shè)置:
要啟動串口通訊首先要選擇合適的波特率,PIC的SCI接口有一個8位的波特率發(fā)生器,它根據(jù)SPBRG寄存器的值來決定周期;另外在異步通信的方式下波特率還和BRGH位的狀態(tài)有關(guān),當BRGH=1時是高速方式。
異步方式下波特率的計算公式為:波特率=Fosc/[64(X+1)](低速方式)或波特率=Fosc/[16(X+1)](高速方式)。其中Fosc是芯片振蕩頻率,X是SPBRG寄存器的值。通過這個公式我們可以計算出在特定波特率下,需要寫入SPBRG寄存器的初始值。例如如果我們采取高速的方式使用9600的波特率,那么當芯片振蕩頻率是4MHz時,SPBRG=4000000/(9600*16)-1=25(實際是25.042,取最接近的整數(shù)值)。
2、 異步方式下的數(shù)據(jù)發(fā)送:
異步發(fā)送時,如果TSR和TXREG都為空,那么當數(shù)據(jù)寫入TXREG之后會馬上被轉(zhuǎn)移到TSR寄存器。這時TXREG為空,TXIF=1,表明可以再往TXREG中寫數(shù)據(jù)。注意此時發(fā)送并未完成,如果要知道數(shù)據(jù)是否發(fā)送完成則需要查詢TRMT位。
3、 異步方式下數(shù)據(jù)的接收:
異步接收時,當接收到停止位時如果RCREG是空的,RSR就會將數(shù)據(jù)轉(zhuǎn)移至RCREG,傳送完成后,置RCIF為1。RCIF是只讀位,當RCREG的數(shù)據(jù)被讀出后將由硬件清0。
RCREG寄存器實際上是2級的FIFO(先進先出)存儲器,如果RSR中接收到了第3個數(shù)據(jù)的停止位,而RCREG寄存器2級都是滿的,那么將會導致數(shù)據(jù)溢出,硬件將置OERR為1。請注意必須清除OERR位之后才能重新接收數(shù)據(jù),用戶可以通過對CREN清0的方式來清除OERR位。
4、 異步通信的數(shù)據(jù)格式:
在異步工作方式下,串行通信接口采用的是標準不歸零(NRZ)格式,即1位起始位、8位或9位的數(shù)據(jù)位和1位停止位。最常用的是8位數(shù)據(jù)的格式。
RCDATA EQU 30H
RCFLAG EQU 31H
RCOneSIGN EQU 0
RCWrong EQU 5
#INCLUDE <P16877.INC>
org 0
nop
goto start
org 4
intentr
goto intsever
;____________________________
org 9
start
clrf RCFLAG
clrf RCDATA
InitUart
bsf STATUS,RP0
bcf RCFLAG,RCOneSIGN
movlw b'10111111' ;TX=output
movwf TRISC
movlw b'10100110'
movwf TXSTA
movlw 19h
movwf SPBRG ;9600,high speed mode
bsf STATUS,RP0
movlw b'00100000'
movwf PIE1
movlw b'11000000'
movwf INTCON
bcf STATUS,RP0
movlw b'10010000'
movwf RCSTA
main
btfsc RCFLAG,RCOneSIGN
goto TXLoop
;btfss RCFLAG,RCWrong
goto main
TXLoop
bcf STATUS,RP0
movf RCDATA,w
movwf TXREG
bsf STATUS,RP0
btfss TXSTA,TRMT
goto $-2
bcf STATUS,RP0
bcf RCFLAG,RCOneSIGN
goto main
;*****************************
intsever
movf STATUS,w
btfsc STATUS,RP0
bcf STATUS,RP0
movwf RCFLAG
btfsc RCSTA,OERR
goto RCerror
movf RCREG,w
movwf RCDATA
bsf RCFLAG,RCOneSIGN
retfie
RCerror
bcf STATUS,RP0
bcf RCSTA,CREN
movf RCREG,w
movf RCREG,w
movlw b'10010000'
movwf RCSTA
btfsc RCFLAG,RCWrong
bsf STATUS,RP0
clrf RCFLAG
retfie
;----------------
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -