新聞中心

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

51單片機不適合做數據采集嗎

作者: 時間:2016-11-22 來源:網絡 收藏
想做一個簡易數據采集卡。包含一個TLC1543(10位串行AD轉換),一個51單片機以及其他一些小零件。關鍵是使用串行通信發(fā)送給計算機。由于我沒有基礎,是通過做這個設計來學習單片機的,所以對結果的預料不足。在我花費了很長時間做,到現在接近尾聲時發(fā)現,要走自定協議的話51串行通信的速度跟不上?。?br />
以下是我做過的兩個通信測試實驗:
(1)不使用協議
我正確地把AD轉換器與單片機相連,采集一個電壓(例如3.2V)。我的程序大概如下:
while(1)
{
TLC1543(); //進行AD轉換
sent(); //把轉換結果發(fā)送給計算機
}
TLC1543是10位轉換器,所以要用2個字節(jié)來保存。但我只發(fā)送高8位給計算機。
通過LabVIEW做的小程序把轉換的十六進制經過一定算法轉化為相應電壓值后發(fā)現基本保持一條直線(如采集3.2V時,在3.0~3.4間波動)。
這個結果讓我相當滿意,心想只要把協議加上就大功告成。

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

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

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

}

}


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

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

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

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

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

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


關鍵詞: 51單片機數據采

評論


技術專區(qū)

關閉