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