我們平時使用的電子設(shè)備,比如計算機(jī),手機(jī),電視機(jī)等這些大多數(shù)電子產(chǎn)品都不是由單一控制器芯片構(gòu)成。它們內(nèi)部除了MCU,CPU,GPU等控制芯片,還會包含眾多的附屬芯片,比如:RAM,ROM,信號處理芯片,傳感器芯片,電源管理芯片等等。這么多的芯片,它們之間是怎么配合的呢?這就涉及到芯片之間的通信知識了。通信是單片機(jī)應(yīng)用中的重要一環(huán),也是非常復(fù)雜的一部分,但是一般情況下我們掌握一些常見的通信方式后一些復(fù)雜的通信方式就可以類推很快就能掌握了,所以不要被嚇到了。
通信方式包含的種類很多,并且在我們?nèi)粘I铍S處可見,按通信介質(zhì)分類有有線通信也就有無線通信,按數(shù)據(jù)傳輸方向分為單工通信,半雙工通信,全雙工通信,按數(shù)據(jù)傳輸方式分為串行通信和并行通信,串口通信又分為同步通信和異步通信,至于通信協(xié)議那就更加豐富多樣了。比如我們可以通過手機(jī)上網(wǎng)就是因為手機(jī)可以接收到運(yùn)營商基站或WIFI等設(shè)備發(fā)出的無線信號。我們手機(jī)通過數(shù)據(jù)線連接電腦拷貝文件,照片等就屬于有線通信,并且這種通信方式是串行通信方式,而計算機(jī)CPU與內(nèi)存卡之間的連接包含并行通信。通過我們?nèi)粘S蒙钪械倪@些應(yīng)用我們大概就能知道,一般情況下有線通信比較穩(wěn)定,而無線通信比較方便;并行通信優(yōu)勢在于近距離高速通信,串行通信在于相對成本低。
說明了以上知識之后,現(xiàn)在我來介紹51單片機(jī)的通信內(nèi)容待會你可能就會比較好理解它了。當(dāng)然51單片機(jī)也可以進(jìn)行并行通信和串行通信,我們這一節(jié)內(nèi)容主要講解它的串行通信,并行通信后面的內(nèi)容進(jìn)行講解。以下兩圖就是這它的兩種通信方式的基本示意圖:
在并行通信中,有多個數(shù)據(jù)位同時在兩個設(shè)備間傳輸,發(fā)送方將這些數(shù)據(jù)位通過對應(yīng)的數(shù)據(jù)線傳輸給接收方,接收方接收到這些數(shù)據(jù)后不需要任何處理就可以直接使用。并行通信的特點(diǎn)是傳送速度快、效率高、處理簡單,但通信成本高,只適用于短距離傳送數(shù)據(jù)。并行通信使用8位數(shù)據(jù)線同時傳送數(shù)據(jù),一字節(jié)(8位)的數(shù)據(jù),可以一次性地傳輸完畢。
在串行通信中,數(shù)據(jù)一位一位地按順序傳送。發(fā)送方首先將數(shù)據(jù)由并行轉(zhuǎn)為串行后,逐位傳送到接收方,接收方將接收到的串行數(shù)據(jù)再次恢復(fù)成并行數(shù)據(jù)。串行通信的特點(diǎn)是通信速度慢,但線路簡單、成本低,非常適用于長距離的數(shù)據(jù)傳送。串行通信僅使用一位數(shù)據(jù)線進(jìn)行數(shù)據(jù)傳送,一字節(jié)(8位)的數(shù)據(jù),要分8次才能傳輸完畢。由此可見,串行通信在速度上較并行通信會慢很多。
51系列單片機(jī)內(nèi)部集成有一個通用異步收發(fā)器(Universal Asynchronous Receiver Transmitter),簡稱UART或串行口。單片機(jī)通過串行通信接口,可以與其他芯片構(gòu)成同步通信系統(tǒng),也可以與PC或其他設(shè)備組建起異步通信系統(tǒng),實現(xiàn)與外部設(shè)備的信息交換。本節(jié)內(nèi)容我們將介紹的是51系列單片機(jī)串行通信接口的原理和使用方法。
51單片機(jī)串口通信原理
51系列單片機(jī)的通用異步收發(fā)器內(nèi)部結(jié)構(gòu)如上圖所示,UART與單片機(jī)內(nèi)部8位數(shù)據(jù)總線相連,SBUF是收發(fā)緩沖器,由接收緩沖器和發(fā)送緩沖器兩部分構(gòu)成,二者具有同一地址(99H),但他們之間是相互獨(dú)立的,即發(fā)送緩沖器只能寫入而不能讀出數(shù)據(jù),而接收緩沖器則只能讀出而不能寫入數(shù)據(jù)。實際使用時通過不同的讀緩沖器和寫緩沖器指令來區(qū)分對哪個緩沖器操作。所以51系列單片機(jī)的串行數(shù)據(jù)通信的啟動方法很簡單,只要將數(shù)據(jù)寫入發(fā)送緩沖器就能啟動數(shù)據(jù)的發(fā)送,而在接收數(shù)據(jù)時,只要讀取保存在接收緩沖器中的內(nèi)容即可。單片機(jī)會按照讀或?qū)懙姆绞讲煌?,自動分配要訪問的目標(biāo)寄存器是發(fā)送SBUF還是接收SBUF。
UART工作時,定時器用于產(chǎn)生通信需要的時鐘,控制寄存器用于對串行口的工作狀態(tài)進(jìn)行相應(yīng)的監(jiān)控和設(shè)置。當(dāng)數(shù)據(jù)寫入發(fā)送SBUF后,數(shù)據(jù)在發(fā)送控制器的控制下,按位從TXD引腳移出;外部數(shù)據(jù)在接收控制器的控制下,從RXD引腳移入移位寄存器并對串行數(shù)據(jù)進(jìn)行恢復(fù),恢復(fù)后的數(shù)據(jù)保存至接收SBUF中供軟件讀取。
當(dāng)接收SBUF中的數(shù)據(jù)沒有被軟件讀取時,移位寄存器還可以暫時接收并保存下一個新數(shù)據(jù),從而避免發(fā)生數(shù)據(jù)溢出,這種結(jié)構(gòu)也是串行口特有的接收雙緩沖結(jié)構(gòu)。發(fā)送器則沒有類似的數(shù)據(jù)緩沖結(jié)構(gòu),因為在發(fā)送數(shù)據(jù)時單片機(jī)是主動的,不存在數(shù)據(jù)過載的問題。
接下來
51單片機(jī)串口通信相關(guān)寄存器
51系列單片機(jī)的串行接口有兩個特殊功能寄存器SCON和PCON。其中,SCON用于存放串行接口的控制和狀態(tài)信息,PCON用于改變串行接口的波特率。另外,51系列單片機(jī)的串行口共有4種工作模式,對應(yīng)有3種波特率。其中,模式0和模式2具有固定的波特率;而模式1和模式3的波特率是可變的,一般由定時器的溢出率來決定。當(dāng)然除了以兩個基本的寄存器,還會用到其他幾個寄存器控制,下面分別介紹一下這些寄存器。
電源控制寄存器PCON:
電源控制寄存器PCON的高2位作為串行口通信的控制使用,
SMOD:波特率選擇位,當(dāng)串行口工作在方式1、2、3時,如果SMOD = 0,波特率正常。如果SMOD = 1,則波特率加倍。
SMOD0:(這位是STC單片機(jī)設(shè)定的,普通51單片機(jī)沒有這位,需參考數(shù)據(jù)手冊)幀錯誤檢測位,當(dāng)SMOD0 = 0時,SCON寄存器中的SM0/FE位用于SM0功能,當(dāng)SMOD0 = 1時,SCON寄存器中的SM0/FE位用于FE(幀錯誤檢測)功能。
串行口控制寄存器SCON:
SM0/FE:當(dāng)PCON寄存器中的SMOD0 = 1時,該位用于幀錯誤檢測,當(dāng)檢測到無效停止位時,由硬件將該位置位,該位必須由軟件清零(PCON沒有SMOD0位普通51單片機(jī),則沒有FE功能,默認(rèn)就是SM0)。當(dāng)SMOD0 = 0時,該位和SM1一起用來設(shè)置串行口通信的方式。
SM1:SM1和SM0一起用來設(shè)置串行口通信的方式,配置結(jié)果如下:
至于這幾種模式下的波特率的計算方法我們在具體應(yīng)用部分再做介紹。
SM2:允許方式2或方式3多機(jī)通信位。如果SM2 = 1,REN = 1,則從機(jī)只有接收到RB8位為1時才將中斷請求位RI置位,并向系統(tǒng)申請中斷。如果SM2 = 0,則無論RB8收到什么數(shù)據(jù)都會將RI位置位,請求中斷。通過設(shè)置SM2的值,可以區(qū)分主機(jī)和從機(jī),實現(xiàn)多機(jī)通信。在方式0時,SM2必須為0,在方式1時,只有收到有效停止位,就將RI置位。
REN:允許串行口接收位。當(dāng)REN = 1時,允許串行口接收數(shù)據(jù);當(dāng)REN = 0時,禁止串行口接收數(shù)據(jù)。
TB8:在方式2和方式3,TB8作為發(fā)送數(shù)據(jù)的第9位,其值由軟件修改。
RB8:在方式2和方式3,RB8保存接收到的第9位數(shù)據(jù)。在方式0,不用RB8。在方式1,如果SM2 = 0,則RB8是接收到的停止位。
TI:發(fā)送完成中斷標(biāo)志位。當(dāng)1幀數(shù)據(jù)發(fā)送完成時,由硬件將該位置位,請求中斷,響應(yīng)中斷后,用軟件清零。
RI:接收完成標(biāo)志位。當(dāng)接收完1幀數(shù)據(jù)時,由硬件將該位置位,請求中斷,響應(yīng)中斷后,用軟件清零。
數(shù)據(jù)緩存寄存器SBUF:
51單片機(jī)的SBUF寄存器在單片機(jī)內(nèi)部的地址是0x99H。但應(yīng)該要注意的是,上一節(jié)中我們說過發(fā)送和接收是獨(dú)立的,所以SBUF實際上是包含寄存器,分別是數(shù)據(jù)接收寄存器和數(shù)據(jù)發(fā)送寄存器。當(dāng)我們對SBUF進(jìn)行讀操作時,它就是接收寄存器;當(dāng)我們對SBUF進(jìn)行寫操作時,它就是發(fā)送寄存器,他們之間的數(shù)據(jù)互不干擾。
當(dāng)單片機(jī)從串行口接收數(shù)據(jù)時,并不是直接將數(shù)據(jù)保存到接收寄存器SBUF,而是先接收到一個輸入移位寄存中當(dāng)中,當(dāng)一幀數(shù)據(jù)接受完成后,再從輸入移位寄存器裝入SBUF。這時,單片機(jī)可以開始接收下一幀數(shù)據(jù),同時,用戶可以取走SBUF接收寄存器中的數(shù)據(jù)。
另外需要特別提出的是,當(dāng)單片機(jī)接收完一幀數(shù)據(jù)之后,用戶應(yīng)該及時取走SBUF緩沖區(qū)中的數(shù)據(jù)。因為串行口接收數(shù)據(jù)往往是一個連續(xù)的過程,如果沒有及時取出數(shù)據(jù),那么下一幀接收到的數(shù)據(jù)就會覆蓋當(dāng)前SBUF中的內(nèi)容,這樣就會造成數(shù)據(jù)丟失,實際使用時需要特別注意!
中斷允許寄存器IE:
ES位用來控制單片機(jī)串行口的使能。當(dāng)ES = 0時,不允許串口中斷,當(dāng)ES = 1時,則允許串口產(chǎn)生中斷。
注意,串口的中斷同時還受到單片機(jī)的總中斷控制位EA的控制。當(dāng)EA=0時,單片機(jī)屏蔽所有的中斷請求,只有當(dāng)EA=1,且ES=1時才允許產(chǎn)生串口中斷。
以上就是51單片機(jī)串口應(yīng)用時需要使用的寄存器詳細(xì)信息,使用時一定要對照單片機(jī)數(shù)據(jù)手冊看看是否與這里的信息相符,信息以你的單片機(jī)為準(zhǔn)!
51單片機(jī)串口通信模式
上面內(nèi)容中我們提到了51單片機(jī)有4種串口通信模式,現(xiàn)在什么一起來看看他們具體的內(nèi)容。
模式0:8位同步移位寄存器模式。
方式0時,UART作為一個8位的移位寄存器使用,波特率為Fosc /12。數(shù)據(jù)由RXD從低位開始收發(fā),TXD用來發(fā)送同步移位脈沖。因此,方式0不支持全雙工。這種方式可用來和某些具有8位串行口的EEPROM器件通信。
當(dāng)向SBUF寫入字節(jié)時,開始發(fā)送數(shù)據(jù)。數(shù)據(jù)發(fā)送完畢時,TI位置位。置位REN時,將開始接收數(shù)據(jù);接收完8位數(shù)據(jù)時,RI位將置位。時序示意圖如下:
模式0輸出
模式0輸入
模式1:波特率可變的8位數(shù)據(jù)異步收發(fā)。
方式1是10位數(shù)據(jù)的異步通信口。TXD為數(shù)據(jù)發(fā)送引腳,RXD為數(shù)據(jù)接收引腳。其中,1位起始位,8位數(shù)據(jù)位,1位停止位。時序示意圖如下:
模式1數(shù)據(jù)串格式
模式1輸出
模式1輸入
模式2:波特率固定的9位數(shù)據(jù)異步收發(fā)。
模式3:波特率可變的9位數(shù)據(jù)異步收發(fā)。
模式2和模式3都是9位異步收發(fā)模式,不同點(diǎn)是模式3可以設(shè)置波特率,所以可以放在以前說明。
方式2和方式3時起始位1位,數(shù)據(jù)9位(含1位附加的第9位,發(fā)送時為SCON中的TB8,接收時為RB8),停止位1位,一幀數(shù)據(jù)為11位。方式2的波特率固定為晶振頻率的1/64或1/32,方式3的波特率由定時器的溢出率決定。
發(fā)送開始時,先把起始位0輸出到TXD引腳,然后發(fā)送移位寄存器的輸出位(D0)到TXD引腳。每一個移位脈沖都使輸出移位寄存器的各位右移一位,并由TXD引腳輸出。
第一次移位時,停止位“1”移入輸出移位寄存器的第9位上,以后每次移位左邊都移入0。當(dāng)停止位移至輸出位時,左邊其余位全為0,檢測電路檢測到這一條件時,控制電路進(jìn)行最后一次移位并置TI=1,向CPU請求中斷。示意圖如下:
接收時,數(shù)據(jù)從右邊移入輸入移位寄存器,在起始位0移到最左邊時,控制電路進(jìn)行最后一次移位。當(dāng)RI=0且SM2=0(或接收到的第9位數(shù)據(jù)為1)時,接收到的數(shù)據(jù)裝入接收緩沖器SBUF和RB8(接收數(shù)據(jù)的第9位),置RI=1,向CPU請求中斷。如果條件不滿足,則數(shù)據(jù)丟失且不置位RI,繼續(xù)搜索RXD引腳的負(fù)跳變。示意圖如下:
計算波特率:
數(shù)據(jù)傳送的速率稱為波特率(Band Rate),即每秒鐘傳送二進(jìn)制代碼的位數(shù),也稱為比特數(shù),單位為bit/s(bit per second),即位/秒。波特率是串行通信中的一個重要性能指標(biāo),用于表示數(shù)據(jù)傳輸?shù)乃俣?。波特率越高,?shù)據(jù)傳輸速度越快。波特率和字符實際的傳輸速率不同,字符的實際傳輸速率是指每秒鐘內(nèi)所傳字符幀的幀數(shù),它與字符幀格式有關(guān)。
要保證串行口通信雙方能夠正確收發(fā)數(shù)據(jù),就要讓它們使用同樣的波特率來傳輸。
模式0和模式2的波特率是固定的,由系統(tǒng)時鐘頻率fosc 決定。在模式0下,波特率為fosc / 12。
在模式2下,波特率還與PCON寄存器中的SMOD位有關(guān),其計算波特率的表達(dá)式為:波特率 = (fosc × 2SMOD ) / 64。
模式1和模式3的波特率是可變的,由定時器1的溢出率決定,波特率 = (溢出率 × 2SMOD ) / 32。定時器1作為波特率發(fā)生器,需要以方式2,8位自動重裝模式運(yùn)行,它的溢出率 = fosc / 12 / (256 – TH1)。
以我們常用的9600bps波特率,11.0592MHz晶振為例,計算TH1的值。
定時器每計256 – TH1個數(shù)溢出一次,計一個數(shù)的時間是12T,也就是12 / fosc ,那么定時器溢出一次的時間是(256 – TH1)×(12 / fosc ),溢出率是其倒數(shù)fosc / (12 × (256 – TH))。
把以上結(jié)果帶入波特率計算公式:
9600 = ( (fosc / (12 × (256 – TH1)) ) × 20 ) / 32,得到TH1 = 253,即0XFD。
其實在51單片機(jī)的應(yīng)用中,常用的晶振頻率為12 MHz和11.0592 MHz。所以,選用的波特率也相對固定。常用的串行口波特率以及各參數(shù)是可以確定的。串行口工作之前應(yīng)對串口通信進(jìn)行初始化,主要是設(shè)置產(chǎn)生波特率的定時器1、串行口控制和中斷控制。具體步驟如下:
① 確定T1的工作方式(編程TMOD寄存器)。
② 計算T1的初值,裝載TH1、TL1。
③ 啟動T1(編程TCON中的TR1位)。
④ 確定串行口控制(編程SCON寄存器)。
串行口在中斷方式工作時,要進(jìn)行中斷設(shè)置(編程IE、IP寄存器)。常用串口波特率與定時初值參考下圖:
評論
查看更多