51單片機不適合做數(shù)據(jù)采集嗎
以下是我做過的兩個通信測試實驗:
(1)不使用協(xié)議
我正確地把AD轉(zhuǎn)換器與單片機相連,采集一個電壓(例如3.2V)。我的程序大概如下:
while(1)
{
TLC1543();
sent();
}
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é)果讓我相當(dāng)滿意,心想只要把協(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é)果導(dǎo)致我無法添加通信協(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();
flag=0;
while(1)
{
}
}
//串口通信預(yù)設(shè)
void preset()
{
//設(shè)置計時器
TMOD=0x20;
TR1=1;
TH1=0xfd;
TL1=0xfd;
EA=1;
//設(shè)置通信模式
SM0=0;
SM1=1;
REN=1;
ES=1;
}
//發(fā)送串口值
void sent(uint TX)
{
{
}
}
//串口接收
void receive() interrupt 4
{
flag=1;
RX=SBUF;
RI=0;
}
評論