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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51 單片機(jī)UART 串口通信 方式1 實(shí)現(xiàn)

          51 單片機(jī)UART 串口通信 方式1 實(shí)現(xiàn)

          作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
          1 51串行口結(jié)構(gòu)

          51單片機(jī)UART串行通信是基于其串行口的可編程硬件結(jié)構(gòu),只要用正確的程序代碼通過(guò)初始化串行口對(duì)應(yīng)寄存器的形式將其串行硬件結(jié)構(gòu)初始化,再編寫(xiě)符合此串行口通信的程序代碼便能夠?qū)崿F(xiàn)串行通信,其硬件結(jié)構(gòu)決定了編程機(jī)制( 當(dāng)然還要靠51芯片內(nèi)CPU等機(jī)制 )。此結(jié)構(gòu)具有UART( 通用異步收發(fā)器 )的全部功能,能同時(shí)進(jìn)行數(shù)據(jù)的發(fā)送和接收,也可作為同步移位寄存器使用。此結(jié)構(gòu)集成于單片機(jī)內(nèi)部。

          本文引用地址:http://www.ex-cimer.com/article/201611/318608.htm

          Figure1:51串行口結(jié)構(gòu)

          2 51串行口通信編程機(jī)制

          決定編程機(jī)制的先決條件是51單片機(jī)的硬件結(jié)構(gòu)及51芯片內(nèi)部CPU的執(zhí)行機(jī)制。根據(jù)串行通信口硬件結(jié)構(gòu),實(shí)現(xiàn)UART通信可以分為兩步:

          (1)初始化串行通信口( UART )

          • 配置SCON:設(shè)定串口方式( SM0及SM1位配置4種方式);串口是否要接收數(shù)據(jù)(REN位)
          • 設(shè)定PCON寄存器的SMOD位(若非串口方式0 )
          • 若串口為方式1和方式3,則需要配置TMOD:選擇定時(shí)器1并配置其初值裝載方式(MI M0位),并設(shè)置TH1,TL0的初值以確定通信的波特率(由波特率的計(jì)算公式),然后配置TCON:開(kāi)啟定時(shí)器1( TR1 )。
          • 允許使用中斷( ES ),開(kāi)啟UART中斷( EA )

          可以這些寄存器的配置含義可以查看相應(yīng)的知識(shí)點(diǎn):中斷配置IE寄存器、定時(shí)/計(jì)數(shù)方式配置寄存器TMOD、定時(shí)/計(jì)數(shù)控制寄存器及通信寄存器SCON寄存器筆記。

          (2)程序?qū)崿F(xiàn):編寫(xiě)發(fā)送/接收數(shù)據(jù)代碼及中斷服務(wù)程序

          注:TI及RI的置位可查看SCON寄存器TI RI被置位的條件

          [1]發(fā)送的數(shù)據(jù)需要通過(guò)程序指令“SBUF =數(shù)據(jù);”來(lái)將數(shù)據(jù)送往串行發(fā)送緩沖寄存器中,在此條語(yǔ)句后,要用循環(huán)判斷SCON寄存器中的TI位是否被硬件置位1(表示發(fā)送完畢),等待發(fā)送完畢,TI置位被置為1時(shí)會(huì)進(jìn)入串行中斷服務(wù)程序[由此不能在串行中斷服務(wù)程序里面將TI置0,因?yàn)閺难h(huán)里面進(jìn)入中斷后會(huì)返回到循環(huán)語(yǔ)句中來(lái),所以要在串行中斷服務(wù)程序之外將TI置0,置0的目的是提供下一次數(shù)據(jù)發(fā)送成功的依據(jù)或進(jìn)入中斷服務(wù)器程序],需要用程序代碼將TI重新置為0;然后再由CPU控制的時(shí)序?qū)?shù)據(jù)從TXD( P3.1 )腳發(fā)出,經(jīng)過(guò)連接的串口線到從設(shè)備(接收數(shù)據(jù)的設(shè)備)。

          [2]獲取接收到數(shù)據(jù)時(shí)需要通過(guò)程序指令“存數(shù)據(jù)變量=SBUF;”將串行接收緩沖寄存器接收到的數(shù)據(jù)讀取到程序中來(lái),當(dāng)接收到數(shù)據(jù)完畢后,RI會(huì)被硬件置位1,此時(shí)也會(huì)進(jìn)入串行中斷服務(wù)程序,需要用程序指令將RI重新置位0。當(dāng)然接收數(shù)據(jù)是由RXD( P3.0 )引腳完成。

          [3]串行中斷服務(wù)程序的中斷號(hào)為4,所以編寫(xiě)串行中斷服務(wù)程序時(shí)需要有以下格式:

          void函數(shù)名()interrupt 4

          {

          中斷服務(wù)程序內(nèi)容

          }

          串行中斷服務(wù)函數(shù)當(dāng)TI或RI被硬件置位1時(shí)才被系統(tǒng)調(diào)用。TI被硬件置1的情況是,當(dāng)串行發(fā)送緩沖寄存器內(nèi)的數(shù)據(jù)被通過(guò)TXD( P3.1 )發(fā)送完畢時(shí)(不同的串口方式置1條件不同)不是指將數(shù)據(jù)存入串行發(fā)送緩沖器中時(shí)TI會(huì)被置1,同理RI被置1的情況是當(dāng)RXD( P3.0 )接收到數(shù)據(jù)將此數(shù)據(jù)按位存入串行接收緩沖寄存器內(nèi)完畢時(shí)(不同串口方式置1的條件不同)不是指從串行接收緩沖寄存器讀完數(shù)據(jù)時(shí)RI會(huì)被置1。這個(gè)數(shù)據(jù)的長(zhǎng)度和TI( RI )被置位1根據(jù)串行通信方式不同而不同。

          對(duì)于用程序來(lái)實(shí)現(xiàn)51單片機(jī)中的串行通信還需要明確兩點(diǎn)(與其它部分的聯(lián)系):

          (1)在51單片機(jī)串行通信的方式1和方式3中,波特率由定時(shí)器1的溢出率決定。

          (2)SBUF為特殊功能寄存器,它在程序中的兩種不同的指令形式表示不同的含義,當(dāng)在程序中用寫(xiě)指令“SBUF=a;”時(shí),表示將a存入串行數(shù)據(jù)發(fā)送緩沖寄存器中;當(dāng)在程序中使用讀指令“a=SBUF;”時(shí),表示向串行數(shù)據(jù)接收緩沖寄存器讀數(shù)據(jù)并將得到數(shù)據(jù)賦值于a。接收器具有雙緩沖結(jié)構(gòu),即在從接收寄存器中前一個(gè)已經(jīng)收到的字節(jié)之前,便能接收第二個(gè)字節(jié),如果第二個(gè)字節(jié)已經(jīng)接收完畢,第一個(gè)字節(jié)還沒(méi)有被讀出,則第一個(gè)字節(jié)就損失( 被覆蓋 )。而發(fā)送器中的數(shù)據(jù)是由CPU控制的,所以不必程序用戶擔(dān)憂。

          3 程序?qū)崿F(xiàn)串行通信

          程序的大體框架為main主函數(shù)、串行中斷服務(wù)程序、子函數(shù)(初始化串口、延時(shí)函數(shù),字符串處理函數(shù)等)

          (1)首先是用程序?qū)崿F(xiàn)串行通信的初始化

          //串口初始化

          void UART_Init(void)

          {

          SCON = 0x40; //串口方式1

          PCON = 0; //SMOD=0

          REN = 1; //允許接收

          TMOD = 0x20; //定時(shí)器1定時(shí)方式2

          TR1 = 1; //啟動(dòng)定時(shí)器

          ES = 1; //UART中斷

          EA = 1; //中斷使能

          }

          (2)用程序?qū)崿F(xiàn)發(fā)數(shù)據(jù)

          將要發(fā)送的數(shù)據(jù)賦值給SBUF即可。

          SBUF = aChar;

          while(TI == 0);//等待,直到發(fā)送成功

          TI = 0;

          這是發(fā)送一次數(shù)據(jù)(如一個(gè)字符,在串口發(fā)送方式1下占10個(gè)位)的代碼,可單獨(dú)寫(xiě)成函數(shù)。此種寫(xiě)法不可以將“TI = 0;”寫(xiě)在中斷函數(shù)中,不然會(huì)造成死循環(huán)。

          (3)在中斷函數(shù)中接受數(shù)據(jù)

          不管發(fā)送數(shù)據(jù)成功還是接受到數(shù)據(jù)都會(huì)進(jìn)入到中斷程序中,故而在中斷程序中判斷是否RI被置位為1,如是則表示收到了數(shù)據(jù)。

          void UART_Receive_Int() interrupt 4

          {

          if( RI == 1)

          {

          RI = 0;

          if( index < 1 )

          {

          Receive[index] = SBUF;

          index++;

          }else{

          index = 0;

          }

          }

          }

          然后只需要在主程序main函數(shù)中調(diào)用串行口初始化函數(shù)及用一定的邏輯調(diào)用數(shù)據(jù)發(fā)送函數(shù)即可。

          (4)通過(guò)串口調(diào)試助手來(lái)觀察程序執(zhí)行效果

          發(fā)數(shù)據(jù)顯示

          設(shè)置串口調(diào)試助手:

          Figure2:向調(diào)試助手發(fā)數(shù)據(jù)顯示

          在串口調(diào)試助手中按照下劃線部分設(shè)置后,結(jié)果顯示區(qū)域就會(huì)顯示由程序發(fā)將上來(lái)的數(shù)據(jù)。

          串口調(diào)試助手往單片機(jī)發(fā)送數(shù)據(jù)并再顯示到串口調(diào)試界面之上

          Figure3:調(diào)試助手向單片機(jī)發(fā)送數(shù)據(jù)顯示界面

          對(duì)串口調(diào)試助手的設(shè)置除了發(fā)送數(shù)據(jù)之上的設(shè)置之外還需要在表格中填入字符串,然后點(diǎn)擊表格下畫(huà)圈使之為“停止循環(huán)發(fā)送”,然后就可以將收到的數(shù)據(jù)同將要發(fā)送的數(shù)據(jù)一起發(fā)送到串口調(diào)試界面之上來(lái)。

          此次筆記記錄完畢。



          關(guān)鍵詞: 51單片機(jī)UART串口通

          評(píng)論


          技術(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); })();