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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機不適合做數(shù)據(jù)采集嗎

          51單片機不適合做數(shù)據(jù)采集嗎

          作者: 時間:2016-11-22 來源:網(wǎng)絡(luò) 收藏
          想做一個簡易數(shù)據(jù)采集卡。包含一個TLC1543(10位串行AD轉(zhuǎn)換),一個51單片機以及其他一些小零件。關(guān)鍵是使用串行通信發(fā)送給計算機。由于我沒有基礎(chǔ),是通過做這個設(shè)計來學習單片機的,所以對結(jié)果的預料不足。在我花費了很長時間做,到現(xiàn)在接近尾聲時發(fā)現(xiàn),要走自定協(xié)議的話51串行通信的速度跟不上??!

          以下是我做過的兩個通信測試實驗:
          (1)不使用協(xié)議
          我正確地把AD轉(zhuǎn)換器與單片機相連,采集一個電壓(例如3.2V)。我的程序大概如下:
          while(1)
          {
          TLC1543(); //進行AD轉(zhuǎn)換
          sent(); //把轉(zhuǎn)換結(jié)果發(fā)送給計算機
          }
          TLC1543是10位轉(zhuǎn)換器,所以要用2個字節(jié)來保存。但我只發(fā)送高8位給計算機。
          通過LabVIEW做的小程序把轉(zhuǎn)換的十六進制經(jīng)過一定算法轉(zhuǎn)化為相應(yīng)電壓值后發(fā)現(xiàn)基本保持一條直線(如采集3.2V時,在3.0~3.4間波動)。
          這個結(jié)果讓我相當滿意,心想只要把協(xié)議加上就大功告成。

          (2)使用協(xié)議。
          我自己定義了一些握手信號,設(shè)計了一個不太嚴謹?shù)膮f(xié)議。
          假設(shè):
          發(fā)A,返回數(shù)據(jù)a
          發(fā)B,返回數(shù)據(jù)b
          發(fā)C,返回數(shù)據(jù)c
          這次實驗就連AD轉(zhuǎn)換也沒用,直接定義單片機接收一個值(A),返回對應(yīng)值(a)。
          可是我在使用串口助手調(diào)試時卻發(fā)現(xiàn)這樣一個問題:我使用“自動發(fā)送”給單片機發(fā)A,單片機根本無法及時返回(沒有AD轉(zhuǎn)換,我的程序已足夠精簡)。舉個例子,串口助手提示發(fā)送500個數(shù)據(jù)時,可能只收到300個數(shù)據(jù)。我嘗試把發(fā)送周期改大,丟失的數(shù)據(jù)少了,但依然無法做到一發(fā)一收!況且,在50ms的發(fā)送周期依然有數(shù)據(jù)丟失的情況下,即使能正確收發(fā),如此低的采樣頻率實用價值也不大。
          這樣的結(jié)果導致我無法添加通信協(xié)議,只能用while循環(huán)不斷給計算機發(fā)送數(shù)據(jù)。雖然一定情況下也能夠顯示出大概的波形,但這樣一來,根本無從得知,也無從設(shè)置采樣頻率。而過低的采樣頻率就只能測一些與時間關(guān)系不大的對象。

          因為基礎(chǔ)差,我不很自信,我懷疑是不是有哪一個步驟出錯了,所以上來發(fā)帖請教各位老師,望指點。以下貼出我第2個實驗的代碼:

          #include
          unsigned char flag;
          unsigned char RX;
          uint i,j;
          void preset();
          void sent(uint TX);
          void main()
          {
          preset(); //預設(shè)
          flag=0;
          while(1)
          {
          switch(RX)
          {
          case 0x24: sent(0x00);
          break;
          case 0x3C: sent(0x30);
          break;
          case 0xC3: sent(0x2C);
          break;
          }

          }

          }


          //串口通信預設(shè)
          void preset()
          {
          //設(shè)置計時器
          TMOD=0x20; //設(shè)置Timer 1在方式2的計時模式
          TR1=1; //啟動Timer 1
          TH1=0xfd;
          TL1=0xfd; //根據(jù)波特率9600計算得出TH1和TL1值
          EA=1; //開總中斷

          //設(shè)置通信模式
          SM0=0;
          SM1=1; //模式1
          REN=1; //允許接收
          ES=1; //開串行口中斷
          }

          //發(fā)送串口值
          void sent(uint TX)
          {

          if(flag==1)
          {
          ES=0; //關(guān)串行中斷
          flag=0;
          SBUF=TX;
          while(!TI); //確保TI置位
          TI=0;
          ES=1; //開串行中斷
          }
          }

          //串口接收
          void receive() interrupt 4
          {

          flag=1;
          RX=SBUF;
          RI=0; //RI由硬件置位,軟件復位
          }


          關(guān)鍵詞: 51單片機數(shù)據(jù)采

          評論


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