在微型計算機數字系統里,數據傳輸可分為并行傳輸與串行傳輸兩種,并行式傳輸一次傳輸多個位(通常是8位)。因此,連接兩個系統之間的傳輸線必須有多條,當然一次傳輸多個位,傳輸的速度比較快,但是傳輸用到的線數也多,線路費用相對會高,線路噪聲,阻抗匹配等問題也多,所以并行式傳輸不適合長距離通訊。
串行式傳輸每次傳輸一個位,數據傳輸的速度表面上不怎么快,但連接兩個系統之間,只要兩條傳輸線即可,適合長距離的通信。實際上,目前串行端口傳輸速率已比并行端口輸出傳輸速率快。
實際中考慮使用并行式傳輸還是串行式傳輸要根據數據量與環境而定。若要將8051系統的數據傳至另一8051系統,則可以使用串行式數據傳輸。
最典型的串行式數據傳輸接口是RS232C,例如個人計算機的COM1、COM2接口就是屬于RS232接口。
在串行式數據傳輸里有單工及雙工之分
單工就是一條線只能有一種用途,例如輸出線就只能將數據傳出,輸入線就只能將數據傳入。
而雙工就是一條線有兩種用途,可傳入數據也可傳出數據。
若系統上只有一條線,且在同一時刻中不是進行傳入數據就傳出數據,則稱之為“半雙工”。
若在系統上有兩條傳輸線,這兩條傳輸線可同時進行數據輸入與傳出,則稱之為“全雙工”。
認識8051串行口
通常以每秒傳輸多少位(bit per second,簡稱bit/s)表示串行式數據傳輸的速率,又稱為比特率(baud rate)。
通常,微控制器里的數據處理屬于并行式處理。對8051而言,一次處理一個字節,也就是8個位,不管怎樣,串行式數據與并行式數據之間的轉換是無法避免的。
在8051里,若要把8位的并行數據傳出去,只要把數據放入并行寄存器(SBUF)即可,8051就會幫我們把這些數據一個位一個位送出去。
接收串行數據也是一樣,8051會把外面傳入的數據,一個位一個位放入SBUF,當SBUF存滿后,產生中斷,即為并行數據,再將SBUF里的8位數據移做他用。
不論是接收還是發送,很明顯SBUF扮演了關鍵性的角色,在8051中接收用的SBUF與傳送用的SBUF雖然都叫做SBUF,但是它們分別是兩個不同的8位寄存器。
8051串行工作模式
8051提供一個全雙工的萬用異步串行端口(Universal Asynchronous Receiver-Transmitter,簡稱UART),這個串行端口有4種工作模式(mode),使用不同工作模式其比特率各有不同,說明如下:
mode 0:
mode0工作模式是一固定比特率的位移式數據傳輸,其比特率為8051系統時鐘脈沖的1/12,即OSC/12。若在時鐘脈沖為12MHz,則其比特率為1M bit/s。
在此模式下,不管是接收還是發送,CPU的RxD引腳(P3.0)連接串行數據線,TxD引腳(P3.1)連接位移脈沖線。執行數據接收時,由TxD引腳送出位移脈沖,而由RxD引腳收下串行數據,如下圖:
執行數據傳送時,也是依據TxD引腳所送出的位移脈沖,由RxD引腳發送串行數據:
mode 1:
mode 1工作模式是以可變的比特率進行串行數據的傳輸,其比特率可由Timer 1來控制(若是8052還可以使用Timer 2控制比特率)。在此模式下,8051的RxD引腳連接數據源的TxD引腳,8051的TxD引腳連接目的地的RxD引腳。
在mode 1下,每個數據是由10位組成,包括起始位(start bit)、8個位的數據以及停止位(stop bit),其中第一個位就是低電平的起始位,緊接著是8位數據的bit0(LSB),bit7(MSB)之后是高電平的停止位,如下圖:
mode 2:
mode 2工作模式是以OSC/32或OSC/64的比特率進行串行數據的傳輸,而其線路的連接,也是8051的RxD引腳連接數據源的TxD引腳,8051的TxD引腳連接目的地的RxD引腳。在mode 2下,每筆數據是由11位組成,包括起始位(start bit)、8個位的數據、奇偶位(parity bit)以及停止位(stop bit),其中第一個位就是低電平的起始位,緊接著是8位數據的bit0(即LSB),而bit7之后的是奇偶位,最后則是高電平的停止位:
當進行數據傳出時,第9個位TB8(即SCON寄存器的TB8)為奇偶位,可取自程序狀態字組寄存器PSW中的P位,以達到奇偶校驗的目的。當收到數據時,第9個位將直接移入SCON寄存器中RB8,而不必管停止位。
mode3:
mode3工作模式是以可變的比特率進行串行數據的傳輸,其比特率可由Timer 1來控制(若是8052則還可使用Timer 2控制比特率)。除此之外,mode 3與 mode 2幾乎完全一樣。
認識SCON串行口控制寄存器
串行端口控制寄存器(serial port control register,簡稱SCON)是一個8位、可位尋址的寄存器,如上圖其功能是設定與控制串行端口。下面是SCON各位的說明:
SM0和SM1
這兩個位的功能是設定串行端口的模式:
SM2
本位為多重處理器通信啟用位:
mode 0時,Sm2=0;
mode 1時,若SM2=1,且收到有效的停止位,則RI=1(產生RI中斷),否則RI=0;
mode 2或 mode 3時,若SM2=1,且收到的第9位為1,則RI=1(產生RI中斷),若第9位為1,則RI=0。
REN
本位為串行接收啟用位,說明:
REN=1,開始接收;
REN=0,停止接收;
TB8
mode 2或mode 3傳送數據時,本位為第9傳送位,可用軟件來設置或清除。
RB8
mode 2或mode 3接收數據時,本位為第9個接收位;
mode 1時,若SM2=0,則本位為停止位;
mode 0時,本位無作用。
TI
本位為中斷標識位,當中斷結束時,本位并不會恢復為0,必須由軟件清除。
mode 1、mode 2或mode 3時,若完成傳送停止位,則本位自動設定為1,并產生TI中斷。
mode 0時,若完成傳送第8位,則本位自動設定為1,并產生TI中斷。
RI
本位為接收中斷標志位,當中斷結束時,本位并不會恢復為0,必須由軟件置0。
mode 1、mode2或mode 3時,若完成接收到停止位,則本位自動設定為1,并產生RI中斷。
mode 0時,若完成接收第8位,則本位自動設定為1,并產生RI中斷。
比特率設定
8051串行口的比特率設定方式有如下幾種:
一
在mode 0下,比特率固定為OSC/12,不需要進行設定!完全是依照系統的時鐘脈沖而定,不是軟件所能改變的。
二
在mode 2下,其比特率可為OSC/32或OSC/64,即:
其中SMOD為PCON寄存器中的bit 7:
若將SMOD設定為0,則設定采用的比特率OSC/64;
若將SMOD設定為1,則設定采用的比特率OSC/32。
以12MHz的系統為例:
三
在mode 1或mode3下,比特率可由Timer 1(8052則還可以選擇Timer 2)的溢出脈沖控制,以Timer 1采用具有自動加載功能的mode 2為例,產生的比特率為:
如在11.0592MHz的系統下,若要產生19.2Kbit/s的比特率,且SMOD=1,則:
得出TH1= 253 = 0xfd;
下表使用Timer 1時常用的比特率設定:
8051串口應用
把8051的串行工作模式設定為mode 1,REN=1;SCON寄存器為0101 000;
在OSC=11.0952MHz下,把比特率設定為9600bit/s,根據前文所述,mode 1比特率設定由Timer 1控制,表格中也給出了TH1的值,所以SMOD=0,TH1 = 0xfd。
void uart_init(){//初始化
TMOD = 0x20; // 定時器1,模式2(8位自動裝載)
TR1=1;//啟用Timer 1
TH1 = 0xfd; // 在Timer 1,mode 2, 11.0952MHz下,設定9600比特率
SCON = 0x50; //uart mode1,接收使能
}
unsigned char rData;
void uart_read() // 接收
{
// 等到收到字節
while(RI==0);
rData = SBUF; //把接收到的字節放到rData
RI=0; //清除RI以接收下一個字節
}
void uart_send(unsigned char sData){//發送
SBUF=sData;
while(TI == 0);
TI=0;
}
評論
查看更多