<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STC單片機(jī)波特率自適應(yīng)方法

          STC單片機(jī)波特率自適應(yīng)方法

          作者: 時(shí)間:2014-01-16 來(lái)源:網(wǎng)絡(luò) 收藏

            0 引言

            串口RS 232是工業(yè)控制、儀器儀表、計(jì)算機(jī)外設(shè)常用的一種通信協(xié)議。串口通信的一般都是選取標(biāo)準(zhǔn)系列值,并要求通信雙方嚴(yán)格遵循相同的,實(shí)際應(yīng)用中,一臺(tái)設(shè)備往往要與多種其他設(shè)備聯(lián)絡(luò),為適應(yīng)各種不同設(shè)備的通信速度,就要求該設(shè)備能適應(yīng)不同的,實(shí)現(xiàn)這種要求的常見方法有兩種,一是增加波特率選擇開關(guān),二是設(shè)計(jì)能自動(dòng)適應(yīng)各種常見通信速度的串口。第一種方法增加了硬件,同時(shí)針對(duì)不同對(duì)象需要重新設(shè)置開關(guān),在不清楚對(duì)方波特率的情況下還無(wú)法使用。第二種方法采用軟硬件結(jié)合,通過檢測(cè)、計(jì)算,自動(dòng)選擇正確的波特率,實(shí)際使用極其方便。

            自適應(yīng)波特率串口的實(shí)現(xiàn)方法通常有以下幾種:

            (1)協(xié)議約定通信開始時(shí)主機(jī)固定發(fā)送1 個(gè)字符,從機(jī)以不同的波特率試探接收,當(dāng)接收到的數(shù)據(jù)與約定相同時(shí),確定該波特率即是正確的通信波特率。

           ?。?)協(xié)議約定通信開始時(shí)主機(jī)發(fā)送1 串字符,從機(jī)以某固定波特率接收,然后通過軟件分析接收到的數(shù)據(jù),計(jì)算出接收數(shù)據(jù)與發(fā)送數(shù)據(jù)之間的倍數(shù)關(guān)系,從而確定正確的波特率。

           ?。?)協(xié)議約定通信開始時(shí)主機(jī)固定發(fā)送1 個(gè)字符,從機(jī)用單片機(jī)定時(shí)器檢測(cè)RXD 上的信號(hào)寬度,通過計(jì)算來(lái)確定主機(jī)的波特率。

            以上3 種方法,第一種由于需要多次試探,效率很低;第二種計(jì)算量過大,不適合單片機(jī)處理;第三種方式單片機(jī)有現(xiàn)成的定時(shí)器資源,計(jì)算也相對(duì)簡(jiǎn)單,所以優(yōu)選這種。

            要測(cè)量脈沖寬度,前提是單片機(jī)的時(shí)鐘信號(hào)必須穩(wěn)定。目前很多可選外接晶振時(shí)鐘或片內(nèi)RC振蕩時(shí)鐘,片內(nèi)RC振蕩時(shí)鐘省去了外部的晶振等元件,成本降低、電路板的體積也可以縮小,這對(duì)成本及體積敏感的應(yīng)用很具優(yōu)勢(shì)。但選用片內(nèi)RC振蕩時(shí),頻率會(huì)有±15%左右的誤差,頻率的穩(wěn)定性也比外接晶振要差,按理論計(jì)算值設(shè)置波特率參數(shù),無(wú)法保證可靠的通信,但按以上自適應(yīng)波特率串口的第三種方法,每次通信前實(shí)測(cè)、計(jì)算、確定波特率常數(shù),就可以實(shí)現(xiàn)穩(wěn)定可靠的通信,這樣充分利用了的優(yōu)勢(shì)。

            1 STC 單片機(jī)的特點(diǎn)

            標(biāo)準(zhǔn)51 芯片由于定時(shí)器最高分辨率只有1 μs,對(duì)于較高的通信波特率來(lái)說(shuō),測(cè)量精度不夠,導(dǎo)致計(jì)算值不準(zhǔn),無(wú)法正常工作。STC系列單片機(jī)是在標(biāo)準(zhǔn)51單片機(jī)基礎(chǔ)上發(fā)展起來(lái)的,它增加了很多實(shí)用的接口電路,擴(kuò)大了時(shí)鐘的頻率范圍,設(shè)計(jì)出了1T 時(shí)鐘的芯片,可以通過軟件對(duì)系統(tǒng)時(shí)鐘分頻,并提供了片內(nèi)RC振蕩時(shí)鐘,在目前51芯片的市場(chǎng)占有極大的份額。STC系列單片機(jī)采用片內(nèi)RC振蕩時(shí)鐘、自適應(yīng)波特率串口通信技術(shù),可以廣泛地應(yīng)用于分布式控制、智能儀表、通信等行業(yè)。

            2 自適應(yīng)工作原理

            STC 單片機(jī)采用異步通信,UART 工作于模式1(8位UART,波特率可變),用定時(shí)計(jì)數(shù)器2做波特率發(fā)生器,工作于模式2(8位自動(dòng)重裝模式),主從機(jī)按圖1方式連接,從機(jī)自適應(yīng)主機(jī)的波特率。

            

            自適應(yīng)過程由主機(jī)發(fā)送聯(lián)絡(luò)字符開始。為了使從機(jī)獲得最大的測(cè)量脈寬,提高測(cè)量精度,由主機(jī)發(fā)送二進(jìn)制“0”.如圖2所示,二進(jìn)制“0”由1位起始位,8位數(shù)據(jù)位(低位在先)及1位停止位構(gòu)成,其中1位起始位和8位數(shù)據(jù)位全為0,所以低電平的寬度為9 b.

            

            從機(jī)查詢RXD引腳的電平,檢測(cè)到低電平后就啟動(dòng)定時(shí)器0開始計(jì)時(shí),再檢測(cè)到高電平就停止定時(shí)器0計(jì)時(shí),根據(jù)定時(shí)器0的定時(shí)值就可以計(jì)算出主機(jī)的波特率。

            當(dāng)時(shí)鐘分頻寄存器CLK_DIV=0(不分頻),特殊功能寄存器AUXR=0xC0(T0 用1T 時(shí)鐘),則:

            

            而STC51 系列單片機(jī)在UART 模式1,時(shí)鐘模式為1T 時(shí),其波特率公式為:

            

            從機(jī)UART在模式1下,將式(4)或式(6)計(jì)算結(jié)果作為定時(shí)器1重裝值,設(shè)定通信參數(shù),通過串口回送應(yīng)答信號(hào)給主機(jī)。主機(jī)如正確接收到從機(jī)回送的信號(hào),就說(shuō)明從機(jī)已完成波特率自適應(yīng),可以開始正常通信了。

          51單片機(jī)相關(guān)文章:51單片機(jī)教程


          單片機(jī)相關(guān)文章:單片機(jī)教程


          單片機(jī)相關(guān)文章:單片機(jī)視頻教程


          單片機(jī)相關(guān)文章:單片機(jī)工作原理


          數(shù)字通信相關(guān)文章:數(shù)字通信原理


          通信相關(guān)文章:通信原理


          負(fù)離子發(fā)生器相關(guān)文章:負(fù)離子發(fā)生器原理
          塵埃粒子計(jì)數(shù)器相關(guān)文章:塵埃粒子計(jì)數(shù)器原理
          晶振相關(guān)文章:晶振原理
          離子色譜儀相關(guān)文章:離子色譜儀原理

          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();