色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 關(guān)于模擬串口的波特率的分析研究

          關(guān)于模擬串口的波特率的分析研究

          作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
          (聲明:本程序是以網(wǎng)上下載程序?yàn)榛A(chǔ),并根據(jù)需要做了適當(dāng)修改得來的)
          在用單片機(jī)開發(fā)各種嵌入式應(yīng)用系統(tǒng)中,由于異步串行通訊連接簡(jiǎn)單,因而成為經(jīng)常用到的一種通信模式,很多應(yīng)用中還要求實(shí)現(xiàn)多路異步串行通信。為了提高系統(tǒng)的性能價(jià)格比,就要求設(shè)計(jì)工程師用軟件增加實(shí)現(xiàn)一路或多路異步串行通信。本文即是對(duì)模擬串口波特率做出的一點(diǎn)分析。
          首先簡(jiǎn)單的介紹一下串行異步通訊的數(shù)據(jù)格式定義,發(fā)送或接收一個(gè)完整的字節(jié)信息,必須有“起始位”、“若干數(shù)據(jù)位”、“奇偶校驗(yàn)位”和“停止位”;定義每位信息的時(shí)間寬度——每秒發(fā)送的信息位個(gè)數(shù),即為“波特率”。本文附帶的模擬串口源程序采用數(shù)據(jù)幀的格式為 1位起始位(低電平),8位數(shù)據(jù)位(先低位在高位),1位停止位(高電平),且在線路空閑狀態(tài)時(shí)總是保持為高電平。當(dāng)在11M晶振時(shí)鐘頻率下,采用波特率為9600或19200時(shí)。該模擬串口都可以無誤差的進(jìn)行傳輸,具體分析后面進(jìn)行。
          參照源程序,我們知道,在這個(gè)模擬串口設(shè)計(jì)中,模擬的是單片機(jī)串行異步通訊方式1,由P1^0做接收端,P1^1做發(fā)送端,通過定時(shí)器1定時(shí)溢出中斷來確定每位數(shù)據(jù)的時(shí)間,由StartBitOn()函數(shù)不斷查詢接收端的狀態(tài),當(dāng)出現(xiàn)低電平(即起始位)的時(shí)候,調(diào)用接收程序,接收發(fā)送的數(shù)據(jù)。
          針對(duì)以下附帶的源程序分析知,PGetChar(),PSendChar()都是通過移位方式來接收數(shù)據(jù),每接收一位數(shù)據(jù),需要定時(shí)器溢出產(chǎn)生中斷一次,故要得到一幀的數(shù)據(jù),就必須經(jīng)過10個(gè)數(shù)據(jù)位的時(shí)間才能完成,同樣的,在模擬串口的發(fā)送端,要完整的發(fā)送一幀數(shù)據(jù)也要經(jīng)過10個(gè)數(shù)據(jù)位的時(shí)間。因而在如下連接時(shí),引出了以下的問題。
          當(dāng)RS232單次發(fā)送一個(gè)字符時(shí),可以正常接收和發(fā)送回RS232。
          當(dāng)RS232連續(xù)發(fā)送一串字符時(shí),通過模擬串口返回給RS232的字符只有原來的一半。如發(fā)送1234567890這樣一個(gè)字符串時(shí),接收的字符為13579。
          那為什么在單獨(dú)發(fā)送一個(gè)字符是不會(huì)丟失,而連續(xù)發(fā)送時(shí)就只有原來的一半了呢!
          __________________________________________
          ||||
          ||||
          | PC|---------->| PGetChar()|
          |RS232|||MCU|
          |||V|
          ||<----------| PSendChar()|
          --------------------------------------------
          源程序:
          /**********************************************
          IO 口模擬232串行異步通訊程序

          **********************************************/
          #include
          sbit BT_SND =P1^1;
          sbit BT_REC =P1^0;

          #define F_TM F0//自定義標(biāo)志位,作為中斷標(biāo)志位
          #define TIMER0_ENABLETL0=TH0; TR0=1;//TR0 = 1,啟動(dòng)T
          #define TIMER0_DISABLE TR0=0;

          // Acc 累加器做發(fā)送的移位寄存器
          sbit ACC0 = ACC^0;
          sbit ACC1 = ACC^1;
          sbit ACC2 = ACC^2;
          sbit ACC3 = ACC^3;
          sbit ACC4 = ACC^4;
          sbit ACC5 = ACC^5;
          sbit ACC6 = ACC^6;
          sbit ACC7 = ACC^7;

          //定時(shí)器計(jì)數(shù)器0的中斷
          void IntTimer0() interrupt 1
          {
          F_TM=1;
          }
          //發(fā)送一個(gè)字符
          //數(shù)據(jù)格式一個(gè)啟動(dòng)位(0),8數(shù)據(jù)位,一個(gè)停止位(1)
          void PSendChar(unsignedCHARGetch)
          {
          ACC=Getch;
          F_TM=0;
          BT_SND=0; //啟動(dòng)位
          TIMER0_ENABLE; //記數(shù)器0啟動(dòng)
          while(!F_TM) ;
          BT_SND=ACC0; //先送出低位
          F_TM=0;
          while(!F_TM) ;
          BT_SND=ACC1;
          F_TM=0;
          while(!F_TM);
          BT_SND=ACC2;
          F_TM=0;
          while(!F_TM);
          BT_SND=ACC3;
          F_TM=0;
          while(!F_TM);
          BT_SND=ACC4;
          F_TM=0;
          while(!F_TM);
          BT_SND=ACC5;
          F_TM=0;
          while(!F_TM);
          BT_SND=ACC6;
          F_TM=0;
          while(!F_TM);
          BT_SND=ACC7;
          F_TM=0;
          while(!F_TM);
          BT_SND=1;
          F_TM=0;
          while(!F_TM);
          TIMER0_DISABLE; //停止timer
          }
          //接收一個(gè)字符
          unsignedCHARPGetChar()
          {
          unsignedCHARrch,ii;
          TIMER0_ENABLE;
          F_TM=0;
          ii=0;
          rch=0;
          while(!F_TM); //等過起始位

          while(ii<8)
          {
          rch>>=1;
          if(BT_REC)
          {
          rch|=0x80;
          }
          ii++;
          F_TM=0;
          while(!F_TM);

          }
          F_TM=0;
          while(!F_TM)
          {
          if(BT_REC)
          {
          break;
          }
          }
          TIMER0_DISABLE; //停止timer
          return rch;

          }
          //檢查是不是有起始位
          bit StartBitOn()
          {
          return(BT_REC==0);

          }
          void main()
          {
          unsignedCHARGetch;

          TMOD=0x22; /*定時(shí)器1為工作模式2(8位自動(dòng)重裝),0為模式2(8位
          自動(dòng)重裝) */
          PCON=00;
          TR0=0; //在發(fā)送或接收才開始使用
          TF0=0;
          TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 執(zhí)行的
          //時(shí)間是104.167*11.0592/12= 96
          TL0=TH0;
          ET0=1;//定時(shí)器/記數(shù)器T0的溢出中斷允許位,ET,允 許中斷
          EA=1;
          while(1)
          {

          if(StartBitOn())
          {
          Getch=PGetChar();
          PSendChar(Getch);
          }
          }
          }
          實(shí)驗(yàn)環(huán)境:
          串口調(diào)試助手軟件
          AT89S51單片機(jī)及相應(yīng)的硬件設(shè)備


          關(guān)鍵詞: 模擬串口波特

          評(píng)論


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

          關(guān)閉