熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

新聞中心

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

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

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

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

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

因?yàn)榛A(chǔ)差,我不很自信,我懷疑是不是有哪一個(gè)步驟出錯(cuò)了,所以上來發(fā)帖請(qǐng)教各位老師,望指點(diǎn)。以下貼出我第2個(gè)實(shí)驗(yàn)的代碼:

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

}

}


//串口通信預(yù)設(shè)
void preset()
{
//設(shè)置計(jì)時(shí)器
TMOD=0x20; //設(shè)置Timer 1在方式2的計(jì)時(shí)模式
TR1=1; //啟動(dòng)Timer 1
TH1=0xfd;
TL1=0xfd; //根據(jù)波特率9600計(jì)算得出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由硬件置位,軟件復(fù)位
}


評(píng)論


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

關(guān)閉