串行接口 8051單片機的通訊方式有兩種: 并行通訊:數據的各位同時發送或接收。 串行通訊:數據一位一位順序發送或接收。 |
|||||||||||||||||||||||||||||||||||||
串行通訊的方式:
在一幀格式中,先是一個起始位0,然后是8個數據位,規定低位在前,高位在后,接下來是奇偶校驗位(可以省略),最后是停止位1。用這種格式表示字符,則字符可以一個接一個地傳送。 在異步通訊中,CPU與外設之間必須有兩項規定,即字符格式和波特率。字符格式的規定是雙方能夠在對同一種0和1的串理解成同一種意義。原則上字符格式可以由通訊的雙方自由制定,但從通用、方便的角度出發,一般還是使用一些標準為好,如采用ASCII標準。 波特率即數據傳送的速率,其定義是每秒鐘傳送的二進制數的位數。例如,數據傳送的速率是120字符/s,而每個字符如上述規定包含10數位,則傳送波特率為1200波特。
8051單片機的串行接口結構 8051串行接口是一個可編程的全雙工串行通訊接口。它可用作異步通訊方式(UART),與串行傳送信息的外部設備相連接,或用于通過標準異步通訊協議進行全雙工的8051多機系統也可以通過同步方式,使用TTL或CMOS移位寄存器來擴充I/O口。 8051單片機通過引腳RXD(P3.0,串行數據接收端)和引腳TXD(P3.1,串行數據發送端)與外界通訊。SBUF是串行口緩沖寄存器,包括發送寄存器和接收寄存器。它們有相同名字和地址空間,但不會出現沖突,因為它們兩個一個只能被CPU讀出數據,一個只能被CPU寫入數據。 串行口控制寄存器SCON 它用于定義串行口的工作方式及實施接收和發送控制。字節地址為98H,其各位定義如下表:
SM0、SM1:串行口工作方式選擇位,其定義如下:
其中fosc為晶振頻率 SM2:多機通訊控制位。在方式0時,SM2一定要等于0。在方式1中,當(SM2)=1則只有接收到有效停止位時,RI才置1。在方式2或方式3當(SM2)=1且接收到的第九位數據RB8=0時,RI才置1。 REN:接收允許控制位。由軟件置位以允許接收,又由軟件清0來禁止接收。 TB8: 是要發送數據的第9位。在方式2或方式3中,要發送的第9位數據,根據需要由軟件置1或清0。例如,可約定作為奇偶校驗位,或在多機通訊中作為區別地址幀或數據幀的標志位。 RB8:接收到的數據的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=0,RB8為接收到的停止位。在方式2或方式3中,RB8為接收到的第9位數據。 TI: 發送中斷標志。在方式0中,第8位發送結束時,由硬件置位。在其它方式的發送停止位前,由硬件置位。TI置位既表示一幀信息發送結束,同時也是申請中斷,可根據需要,用軟件查詢的方法獲得數據已發送完畢的信息,或用中斷的方式來發送下一個數據。TI必須用軟件清0。 RI: 接收中斷標志位。在方式0,當接收完第8位數據后,由硬件置位。在其它方式中,在接收到停止位的中間時刻由硬件置位(例外情況見于SM2的說明)。RI置位表示一幀數據接收完畢,可用查詢的方法獲知或者用中斷的方法獲知。RI也必須用軟件清0。 |
|||||||||||||||||||||||||||||||||||||
串行口的工作方式 8051單片機的全雙工串行口可編程為4種工作方式,現分述如下: 一.方式0: 方式0為移位寄存器輸入/輸出方式。可外接移位寄存器以擴展I/O口,也可以外接同步輸入/輸出設備。8位串行數據者是從RXD輸入或輸出,TXD用來輸出同步脈沖。
二.方式1 方式1為波特率可變的10位異步通訊接口方式。發送或接收一幀信息,包括1個起始位0,8個數據位和1個停止位1。
三.方式2 方式二為固定波特率的11位UART方式。它比方式1增加了一位可程控位1或0的第9位數據。
四.方式3 方式3為波特率可變的11位UART方式。除波特率外,其余與方式2相同。 波特率選擇 如前所述,在串行通訊中,收發雙方的數據傳送率(波特率)要有一定的約定。在8051串行口的四種工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可變的,由定時器T1的溢出率控制。
方式0的波特率固定為主振頻率的1/12。
方式2的波特率由PCON中的選擇位SMOD來決定,可由下式表示: 波特率=2的SMOD次方除以64再乘一個fosc,也就是當SMOD=1時,波特率為1/32fosc,當SMOD=0時,波特率為1/64fosc 3.方式1和方式3 定時器T1作為波特率發生器,其公式如下: 波特率= T1溢出率= T1計數率/產生溢出所需的周期數 式中T1計數率取決于它工作在定時器狀態還是計數器狀態。當工作于定時器狀態時,T1計數率為fosc/12;當工作于計數器狀態時,T1計數率為外部輸入頻率,此頻率應小于fosc/24。產生溢出所需周期與定時器T1的工作方式、T1的預置值有關。 定時器T1工作于方式0:溢出所需周期數=8192-x 定時器T1工作于方式1:溢出所需周期數=65536-x 定時器T1工作于方式2:溢出所需周期數=256-x 因為方式2為自動重裝入初值的8位定時器/計數器模式,所以用它來做波特率發生器最恰當。 當時鐘頻率選用11.0592MHZ時,取易獲得標準的波特率,所以很多單片機系統選用這個看起來“怪”的晶振就是這個道理。
串行口應用編程實例 1. 串口方式0應用編程 8051單片機串行口方式0為移位寄存器方式,外接一個串入并出的移位寄存器,就可以擴展一個并行口。 例:用8051串行口外接CD4094擴展8位并行輸出口,如圖所示,8位并行口的各位都接一個發光二極管,要求發光管呈流水燈狀態。串行口方式0的數據傳送可采用中斷方式,也可采用查詢方式,無論哪種方式,都要借助于TI或RI標志。串行發送時,可以靠TI置位(發完一幀數據后)引起中斷申請,在中斷服務程序中發送下一幀數據,或者通過查詢TI的狀態,只要TI為0就繼續查詢,TI為1就結束查詢,發送下一幀數據。在串行接收時,則由RI引起中斷或對RI查詢來確定何時接收下一幀數據。無論采用什么方式,在開始通訊之前,都要先對控制寄存器SCON進行初始化。在方式0中將,將00H送SCON就可以了。 ORG 2000H START: MOV SCON,#00H ;置串行口工作方式0 MOV A,#80H ;最高位燈先亮 CLR P1.0 ;關閉并行輸出(避象傳輸過程中,各LED的"暗紅"現象) OUT0: MOV SBUF,A ;開始串行輸出 OUT1: JNB TI,OUT1 ;輸出完否 CLR TI ;完了,清TI標志,以備下次發送 SETB P1.0 ;打開并行口輸出 ACALL DELAY ;延時一段時間 RR A ;循環右移 CLR P1.0 ;關閉并行輸出 JMP OUT0 ;循環 說明:DELAY延時子程序可以用前面我們講P1口流水燈時用的延時子程序,這里就不給出了。 二、異步通訊 org 0000H AJMP START ORG 30H START: mov SP,#5fh ; mov TMOD,#20h ;T1: 工作模式2 mov PCON,#80h ;SMOD=1 mov TH1,#0FDH ;初始化波特率(參見表) mov SCON,#50h ;Standard UART settings MOV R0,#0AAH ;準備送出的數 SETB REN ;允許接收 SETB TR1 ;T1開始工作 WAIT: MOV A,R0 CPL A MOV R0,A MOV SBUF,A LCALL DELAY JBC TI,WAIT1 ;如果TI等于1,則清TI并轉WAIT1 AJMP WAIT WAIT1: JBC RI,READ ;如果RI等于1,則清RI并轉READ AJMP WAIT1 READ: MOV A,SBUF ;將取得的數送P1口 MOV P1,A LJMP WAIT DELAY: ;延時子程序 MOV R7,#0ffH DJNZ R7,$ RET END 將程序編譯通過,寫入芯片,插入實驗板,用通讀電纜將實驗板與主機的串口相連就可以實驗了。上面的程序功能很簡單,就是每隔一段時間向主機輪流送數55H和AAH,并把主機送去的數送到P1口。可以在PC端用串口精靈來做實驗。串口精靈在我主頁上有下載。運行串口精靈后,按主界面上的“設置參數”按鈕進入“設置參數”對話框,按下面的參數進行設置。注意,我的機器上用的是串口2,如果你不是串口2,請自行更改串口的設置。 設置完后,按確定返回主界面,注意右邊有一個下拉列表,應當選中“按16進制”。然后按“開始發送”、“開始接收”就可以了。按此設置,實驗板上應當有兩只燈亮,6只燈滅。大家可以自行更改設置參數中的發送字符如55,00,FF等等,觀察燈的亮滅,并分析原因,也可以在主界面上更改下拉列表中的“按16進制”為“按10進制”或“按ASCII字符”來觀察現象,并仔細分析。這對于大家理解16進制、10進制、ASCII字符也是很有好處的。程序本身很簡單,又有注釋,這里就不詳加說明了。 三、上述程序的中斷版本 org 0000H AJMP START org 0023h AJMP SERIAL ; ORG 30H START: mov SP,#5fh ; mov TMOD,#20h ;T1: 工作模式2 mov PCON,#80h ;SMOD=1 mov TH1,#0FDH ;初始化波特率(參見表) mov SCON,#50h ;Standard UART settings MOV R0,#0AAH ;準備送出的數 SETB REN ;允許接收 SETB TR1 ;T1開始工作 SETB EA ;開總中斷 SETB ES ;開串口中斷 SJMP $ SERIAL: MOV A,SBUF MOV P1,A CLR RI RETI END 本程序沒有寫入發送程序,大家可以自行添加。 |