?? usart 通過(guò)232通訊例程.txt
字號(hào):
232
RS232通信方式是常用的單片機(jī)與PC通信的方式,PIC16F87X系列芯片可以通過(guò)SCI(串行通信接口)來(lái)實(shí)現(xiàn)與PC的通信。以下我們將通過(guò)ICDDEMO演示實(shí)驗(yàn)板上的RS232通信電路來(lái)調(diào)試與PC的通信,其電路如下圖所示:
其中TX和RX分別為PIC16F877的發(fā)送和接收引腳,由于PC的串口輸出的是12V電壓,因此要實(shí)現(xiàn)PIC芯片和PC的通信,還需要進(jìn)行電平轉(zhuǎn)換,該板使用的電平轉(zhuǎn)換芯片是MAX232。在調(diào)試之前請(qǐng)將PC與ICDDEMO演示實(shí)驗(yàn)板用9芯串行電纜連接好并鎖緊,并且將DIP6(S10)的第2、4開(kāi)關(guān)撥至“ON”的位置上。調(diào)試時(shí)PC用的上位機(jī)程序可以采用WINDOWS帶的超級(jí)終端(啟動(dòng)方式:開(kāi)始-)程序-)附件-)通訊-)超級(jí)終端),或者使用網(wǎng)上很容易找到的串口調(diào)試軟件。
1、 串行通信的波特率設(shè)置:
要啟動(dòng)串口通訊首先要選擇合適的波特率,PIC的SCI接口有一個(gè)8位的波特率發(fā)生器,它根據(jù)SPBRG寄存器的值來(lái)決定周期;另外在異步通信的方式下波特率還和BRGH位的狀態(tài)有關(guān),當(dāng)BRGH=1時(shí)是高速方式。
異步方式下波特率的計(jì)算公式為:波特率=Fosc/[64(X+1)](低速方式)或波特率=Fosc/[16(X+1)](高速方式)。其中Fosc是芯片振蕩頻率,X是SPBRG寄存器的值。通過(guò)這個(gè)公式我們可以計(jì)算出在特定波特率下,需要寫(xiě)入SPBRG寄存器的初始值。例如如果我們采取高速的方式使用9600的波特率,那么當(dāng)芯片振蕩頻率是4MHz時(shí),SPBRG=4000000/(9600*16)-1=25(實(shí)際是25.042,取最接近的整數(shù)值)。
2、 異步方式下的數(shù)據(jù)發(fā)送:
異步發(fā)送時(shí),如果TSR和TXREG都為空,那么當(dāng)數(shù)據(jù)寫(xiě)入TXREG之后會(huì)馬上被轉(zhuǎn)移到TSR寄存器。這時(shí)TXREG為空,TXIF=1,表明可以再往TXREG中寫(xiě)數(shù)據(jù)。注意此時(shí)發(fā)送并未完成,如果要知道數(shù)據(jù)是否發(fā)送完成則需要查詢(xún)TRMT位。
3、 異步方式下數(shù)據(jù)的接收:
異步接收時(shí),當(dāng)接收到停止位時(shí)如果RCREG是空的,RSR就會(huì)將數(shù)據(jù)轉(zhuǎn)移至RCREG,傳送完成后,置RCIF為1。RCIF是只讀位,當(dāng)RCREG的數(shù)據(jù)被讀出后將由硬件清0。
RCREG寄存器實(shí)際上是2級(jí)的FIFO(先進(jìn)先出)存儲(chǔ)器,如果RSR中接收到了第3個(gè)數(shù)據(jù)的停止位,而RCREG寄存器2級(jí)都是滿的,那么將會(huì)導(dǎo)致數(shù)據(jù)溢出,硬件將置OERR為1。請(qǐng)注意必須清除OERR位之后才能重新接收數(shù)據(jù),用戶可以通過(guò)對(duì)CREN清0的方式來(lái)清除OERR位。
4、 異步通信的數(shù)據(jù)格式:
在異步工作方式下,串行通信接口采用的是標(biāo)準(zhǔn)不歸零(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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -