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