最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

51單片機編程開發(fā)(八)之UART通信基礎(chǔ)

2022-08-01 14:29 作者:落木青云  | 我要投稿

通信概述

我們平時使用的電子設(shè)備,比如計算機,手機,電視機等這些大多數(shù)電子產(chǎn)品都不是由單一控制器芯片構(gòu)成。它們內(nèi)部除了MCU,CPU,GPU等控制芯片,還會包含眾多的附屬芯片,比如:RAM,ROM,信號處理芯片,傳感器芯片,電源管理芯片等等。這么多的芯片,它們之間是怎么配合的呢?這就涉及到芯片之間的通信知識了。通信是單片機應(yīng)用中的重要一環(huán),也是非常復(fù)雜的一部分,但是一般情況下我們掌握一些常見的通信方式后一些復(fù)雜的通信方式就可以類推很快就能掌握了,所以不要被嚇到了。

通信方式包含的種類很多,并且在我們?nèi)粘I铍S處可見,按通信介質(zhì)分類有有線通信也就有無線通信,按數(shù)據(jù)傳輸方向分為單工通信,半雙工通信,全雙工通信,按數(shù)據(jù)傳輸方式分為串行通信和并行通信,串口通信又分為同步通信和異步通信,至于通信協(xié)議那就更加豐富多樣了。比如我們可以通過手機上網(wǎng)就是因為手機可以接收到運營商基站或WIFI等設(shè)備發(fā)出的無線信號。我們手機通過數(shù)據(jù)線連接電腦拷貝文件,照片等就屬于有線通信,并且這種通信方式是串行通信方式,而計算機CPU與內(nèi)存卡之間的連接包含并行通信。通過我們?nèi)粘S蒙钪械倪@些應(yīng)用我們大概就能知道,一般情況下有線通信比較穩(wěn)定,而無線通信比較方便;并行通信優(yōu)勢在于近距離高速通信,串行通信在于相對成本低。

說明了以上知識之后,現(xiàn)在我來介紹51單片機的通信內(nèi)容待會你可能就會比較好理解它了。當(dāng)然51單片機也可以進行并行通信和串行通信,我們這一節(jié)內(nèi)容主要講解它的串行通信,并行通信后面的內(nèi)容進行講解。以下兩圖就是這它的兩種通信方式的基本示意圖:

并行通信
串行通信

在并行通信中,有多個數(shù)據(jù)位同時在兩個設(shè)備間傳輸,發(fā)送方將這些數(shù)據(jù)位通過對應(yīng)的數(shù)據(jù)線傳輸給接收方,接收方接收到這些數(shù)據(jù)后不需要任何處理就可以直接使用。并行通信的特點是傳送速度快、效率高、處理簡單,但通信成本高,只適用于短距離傳送數(shù)據(jù)。并行通信使用8位數(shù)據(jù)線同時傳送數(shù)據(jù),一字節(jié)(8位)的數(shù)據(jù),可以一次性地傳輸完畢。

并行通信演示

在串行通信中,數(shù)據(jù)一位一位地按順序傳送。發(fā)送方首先將數(shù)據(jù)由并行轉(zhuǎn)為串行后,逐位傳送到接收方,接收方將接收到的串行數(shù)據(jù)再次恢復(fù)成并行數(shù)據(jù)。串行通信的特點是通信速度慢,但線路簡單、成本低,非常適用于長距離的數(shù)據(jù)傳送。串行通信僅使用一位數(shù)據(jù)線進行數(shù)據(jù)傳送,一字節(jié)(8位)的數(shù)據(jù),要分8次才能傳輸完畢。由此可見,串行通信在速度上較并行通信會慢很多。

串行通信演示

51系列單片機內(nèi)部集成有一個通用異步收發(fā)器(Universal Asynchronous Receiver Transmitter),簡稱UART或串行口。單片機通過串行通信接口,可以與其他芯片構(gòu)成同步通信系統(tǒng),也可以與PC或其他設(shè)備組建起異步通信系統(tǒng),實現(xiàn)與外部設(shè)備的信息交換。本節(jié)內(nèi)容我們將介紹的是51系列單片機串行通信接口的原理和使用方法。

51單片機串口通信原理

UART內(nèi)部結(jié)構(gòu)

51系列單片機的通用異步收發(fā)器內(nèi)部結(jié)構(gòu)如上圖所示,UART與單片機內(nèi)部8位數(shù)據(jù)總線相連,SBUF是收發(fā)緩沖器,由接收緩沖器和發(fā)送緩沖器兩部分構(gòu)成,二者具有同一地址(99H),但他們之間是相互獨立的,即發(fā)送緩沖器只能寫入而不能讀出數(shù)據(jù),而接收緩沖器則只能讀出而不能寫入數(shù)據(jù)。實際使用時通過不同的讀緩沖器和寫緩沖器指令來區(qū)分對哪個緩沖器操作。所以51系列單片機的串行數(shù)據(jù)通信的啟動方法很簡單,只要將數(shù)據(jù)寫入發(fā)送緩沖器就能啟動數(shù)據(jù)的發(fā)送,而在接收數(shù)據(jù)時,只要讀取保存在接收緩沖器中的內(nèi)容即可。單片機會按照讀或?qū)懙姆绞讲煌?,自動分配要訪問的目標(biāo)寄存器是發(fā)送SBUF還是接收SBUF。

UART工作時,定時器用于產(chǎn)生通信需要的時鐘,控制寄存器用于對串行口的工作狀態(tài)進行相應(yīng)的監(jiān)控和設(shè)置。當(dāng)數(shù)據(jù)寫入發(fā)送SBUF后,數(shù)據(jù)在發(fā)送控制器的控制下,按位從TXD引腳移出;外部數(shù)據(jù)在接收控制器的控制下,從RXD引腳移入移位寄存器并對串行數(shù)據(jù)進行恢復(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ù)時單片機是主動的,不存在數(shù)據(jù)過載的問題。

51單片機串口通信相關(guān)寄存器

51系列單片機的串行接口有兩個特殊功能寄存器SCON和PCON。其中,SCON用于存放串行接口的控制和狀態(tài)信息,PCON用于改變串行接口的波特率。另外,51系列單片機的串行口共有4種工作模式,對應(yīng)有3種波特率。其中,模式0和模式2具有固定的波特率;而模式1和模式3的波特率是可變的,一般由定時器的溢出率來決定。當(dāng)然除了以兩個基本的寄存器,還會用到其他幾個寄存器控制,下面分別介紹一下這些寄存器。

電源控制寄存器PCON:

PCON寄存器

電源控制寄存器PCON的高2位作為串行口通信的控制使用,

SMOD:波特率選擇位,當(dāng)串行口工作在方式1、2、3時,如果SMOD = 0,波特率正常。如果SMOD = 1,則波特率加倍。

SMOD0:(這位是STC單片機設(shè)定的,普通51單片機沒有這位,需參考數(shù)據(jù)手冊)幀錯誤檢測位,當(dāng)SMOD0 = 0時,SCON寄存器中的SM0/FE位用于SM0功能,當(dāng)SMOD0 = 1時,SCON寄存器中的SM0/FE位用于FE(幀錯誤檢測)功能。

串行口控制寄存器SCON:

SCON寄存器

SM0/FE:當(dāng)PCON寄存器中的SMOD0 = 1時,該位用于幀錯誤檢測,當(dāng)檢測到無效停止位時,由硬件將該位置位,該位必須由軟件清零(PCON沒有SMOD0位普通51單片機,則沒有FE功能,默認(rèn)就是SM0)。當(dāng)SMOD0 = 0時,該位和SM1一起用來設(shè)置串行口通信的方式。

SM1:SM1和SM0一起用來設(shè)置串行口通信的方式,配置結(jié)果如下:

串口模式

至于這幾種模式下的波特率的計算方法我們在具體應(yīng)用部分再做介紹。

SM2:允許方式2或方式3多機通信位。如果SM2 = 1,REN = 1,則從機只有接收到RB8位為1時才將中斷請求位RI置位,并向系統(tǒng)申請中斷。如果SM2 = 0,則無論RB8收到什么數(shù)據(jù)都會將RI位置位,請求中斷。通過設(shè)置SM2的值,可以區(qū)分主機和從機,實現(xiàn)多機通信。在方式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單片機的SBUF寄存器在單片機內(nèi)部的地址是0x99H。但應(yīng)該要注意的是,上一節(jié)中我們說過發(fā)送和接收是獨立的,所以SBUF實際上是包含寄存器,分別是數(shù)據(jù)接收寄存器和數(shù)據(jù)發(fā)送寄存器。當(dāng)我們對SBUF進行讀操作時,它就是接收寄存器;當(dāng)我們對SBUF進行寫操作時,它就是發(fā)送寄存器,他們之間的數(shù)據(jù)互不干擾。

當(dāng)單片機從串行口接收數(shù)據(jù)時,并不是直接將數(shù)據(jù)保存到接收寄存器SBUF,而是先接收到一個輸入移位寄存中當(dāng)中,當(dāng)一幀數(shù)據(jù)接受完成后,再從輸入移位寄存器裝入SBUF。這時,單片機可以開始接收下一幀數(shù)據(jù),同時,用戶可以取走SBUF接收寄存器中的數(shù)據(jù)。

另外需要特別提出的是,當(dāng)單片機接收完一幀數(shù)據(jù)之后,用戶應(yīng)該及時取走SBUF緩沖區(qū)中的數(shù)據(jù)。因為串行口接收數(shù)據(jù)往往是一個連續(xù)的過程,如果沒有及時取出數(shù)據(jù),那么下一幀接收到的數(shù)據(jù)就會覆蓋當(dāng)前SBUF中的內(nèi)容,這樣就會造成數(shù)據(jù)丟失,實際使用時需要特別注意!

中斷允許寄存器IE:

ES位用來控制單片機串行口的使能。當(dāng)ES = 0時,不允許串口中斷,當(dāng)ES = 1時,則允許串口產(chǎn)生中斷。

注意,串口的中斷同時還受到單片機的總中斷控制位EA的控制。當(dāng)EA=0時,單片機屏蔽所有的中斷請求,只有當(dāng)EA=1,且ES=1時才允許產(chǎn)生串口中斷。

以上就是51單片機串口應(yīng)用時需要使用的寄存器詳細信息,使用時一定要對照單片機數(shù)據(jù)手冊看看是否與這里的信息相符,信息以你的單片機為準(zhǔn)!

51單片機串口通信模式

上面內(nèi)容中我們提到了51單片機有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ā)模式,不同點是模式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,檢測電路檢測到這一條件時,控制電路進行最后一次移位并置TI=1,向CPU請求中斷。示意圖如下:

接收時,數(shù)據(jù)從右邊移入輸入移位寄存器,在起始位0移到最左邊時,控制電路進行最后一次移位。當(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引腳的負跳變。示意圖如下:


計算波特率:

數(shù)據(jù)傳送的速率稱為波特率(Band Rate),即每秒鐘傳送二進制代碼的位數(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),其計算波特率的表達式為:波特率 = (fosc × 2SMOD ) / 64。

模式1和模式3的波特率是可變的,由定時器1的溢出率決定,波特率 = (溢出率 × 2SMOD ) / 32。定時器1作為波特率發(fā)生器,需要以方式2,8位自動重裝模式運行,它的溢出率 = 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單片機的應(yīng)用中,常用的晶振頻率為12 MHz和11.0592 MHz。所以,選用的波特率也相對固定。常用的串行口波特率以及各參數(shù)是可以確定的。串行口工作之前應(yīng)對串口通信進行初始化,主要是設(shè)置產(chǎn)生波特率的定時器1、串行口控制和中斷控制。具體步驟如下:

① 確定T1的工作方式(編程TMOD寄存器)。

② 計算T1的初值,裝載TH1、TL1。

③ 啟動T1(編程TCON中的TR1位)。

④ 確定串行口控制(編程SCON寄存器)。

串行口在中斷方式工作時,要進行中斷設(shè)置(編程IE、IP寄存器)。常用串口波特率與定時初值參考下圖:

波特率數(shù)據(jù)

結(jié)語:

到此,我們將串口通信的基礎(chǔ)部分內(nèi)容就簡單的介紹完了,因為前幾篇文章都寫得比較長,有幾個初學(xué)者反饋內(nèi)容太長容易看迷糊,所以我還是將這些內(nèi)容分成幾個部分來寫吧。當(dāng)然看電子設(shè)備本來就容易犯困,我寫這些內(nèi)容是希望能夠抓住各個部分的關(guān)鍵知識點或易出問題的地方寫出來,更多詳細的內(nèi)容肯定在課本或芯片數(shù)據(jù)手冊上,所以遇到不懂的問題多問的同時也要多看看資料熟悉。這樣會幫助你更快更好的掌握知識點,而且這個過程也會無形的培養(yǎng)你的自學(xué)能力,同時也可以鍛煉你分析,解決問題的思維。希望看到此處的朋友早日學(xué)成,更上一層樓。如發(fā)現(xiàn)錯誤歡迎指出,如果覺得還不錯也歡迎轉(zhuǎn)發(fā)!

51單片機編程開發(fā)(八)之UART通信基礎(chǔ)的評論 (共 條)

分享到微博請遵守國家法律
邹平县| 宜兴市| 柘荣县| 红桥区| 松桃| 扬州市| 邹平县| 微博| 巧家县| 龙里县| 延寿县| 威宁| 东兰县| 麻城市| 方正县| 永福县| 玉山县| 林口县| 新和县| 自治县| 福州市| 道真| 巴彦县| 万安县| 苍南县| 交城县| 民勤县| 晋中市| 江油市| 田东县| 独山县| 重庆市| 自贡市| 宜良县| 汾西县| 乐陵市| 三原县| 德格县| 青神县| 彰武县| 遵义县|