設(shè)計(jì)了一個(gè)關(guān)于單片機(jī)數(shù)據(jù)采集控制系統(tǒng)的作品,采用數(shù)模轉(zhuǎn)換和模數(shù)轉(zhuǎn)換的技術(shù),實(shí)現(xiàn)了8路數(shù)據(jù)采集功能和輸出模擬信號的功能
單片機(jī)數(shù)據(jù)采集控制系統(tǒng)
摘要:設(shè)計(jì)了一個(gè)關(guān)于單片機(jī)數(shù)據(jù)采集控制系統(tǒng)的作品,采用數(shù)模轉(zhuǎn)換和模數(shù)轉(zhuǎn)換的技術(shù),實(shí)現(xiàn)了8路數(shù)據(jù)采集功能和輸出模擬信號的功能
1 課題意義 單片機(jī)數(shù)據(jù)采集控制系統(tǒng)不只是應(yīng)用于工業(yè)領(lǐng)域,如鋼鐵、電力、化工,還廣泛用于食品,醫(yī)藥、建筑、科研等行業(yè)。 在一些工業(yè)現(xiàn)場中,設(shè)備長時(shí)間運(yùn)行容易出現(xiàn)故障,為了監(jiān)控這些設(shè)備,通常利用數(shù)據(jù)采集裝置采集他們運(yùn)行時(shí)的數(shù)據(jù)并送給PC機(jī),通過運(yùn)行在PC機(jī)上的特定軟件對這些數(shù)據(jù)進(jìn)行分析,以此判斷當(dāng)前運(yùn)行設(shè)備的狀況,進(jìn)而采取相應(yīng)措施。 實(shí)時(shí)采集來自生產(chǎn)線的產(chǎn)量數(shù)據(jù)或是不良品的數(shù)量、或是生產(chǎn)線的故障類型(如停線、缺料、品質(zhì)),并傳輸?shù)綌?shù)據(jù)庫系統(tǒng)中;接收來自數(shù)據(jù)庫的信息:如生產(chǎn)計(jì)劃信息、物料信息等;傳輸檢查工位的不良品名稱及數(shù)量信息;連接檢測儀器,實(shí)現(xiàn)檢測儀器數(shù)字化,數(shù)據(jù)采集儀自動(dòng)從測量儀器中獲取測量數(shù)據(jù),進(jìn)行記錄,分析計(jì)算,對測量結(jié)果進(jìn)行自動(dòng)判斷。 2 總體設(shè)計(jì)方案
2.1 設(shè)計(jì)思路 設(shè)計(jì)基本要求: 1)可實(shí)現(xiàn)8路數(shù)據(jù)的采集,假設(shè)8路信號均為0-5V的電壓信號; 2)采集數(shù)據(jù)可通過數(shù)碼管顯示,顯示格式為:[通道號] 電壓值,如 [01] 4.5 3)具有異常數(shù)據(jù)聲音報(bào)警功能:對第一路數(shù)據(jù)可設(shè)置正常數(shù)據(jù)的上限值和下限值,當(dāng)采集的數(shù)據(jù)出現(xiàn)異常,發(fā)出報(bào)警信號。 4)可輸出頻率為1kHZ的方波,三角波。 根據(jù)上述要求,設(shè)計(jì)思路如下 選擇單片機(jī)與A/D轉(zhuǎn)換芯片結(jié)合的方法實(shí)現(xiàn)本設(shè)計(jì)。使用 的基本元器件是:AT89C51單片機(jī),ADC0808模數(shù)轉(zhuǎn)換芯片,DAC0832數(shù)模轉(zhuǎn)換芯片,74ls373地址鎖存器,74ls13譯碼器,74ls148編碼器,8位數(shù)碼管,按鍵,電容,電阻,晶振,蜂鳴器等。 數(shù)字電壓測量電路由A/D轉(zhuǎn)換、數(shù)據(jù)處理及顯示控制等組成。A/D轉(zhuǎn)換由集成電路ADC0808完成。ADC0809具有8路擬輸入端口,地址線(IN0-IN7腳)可決定對哪一路模擬輸入作A/D換。ALE腳為地址鎖存控制,當(dāng)輸入為高電平時(shí),對地址信號進(jìn)行鎖存。START腳為測試控制,當(dāng)輸入一個(gè)2uS寬高電平脈沖時(shí),就開始A/D轉(zhuǎn)換。EOC腳為A/D轉(zhuǎn)換結(jié)束標(biāo)志,當(dāng)A/D轉(zhuǎn)換結(jié)束時(shí),7腳輸出高電平。OE腳為A/D轉(zhuǎn)換數(shù)據(jù)輸出允許控制,當(dāng)OE腳為高電平時(shí),A/D轉(zhuǎn)換數(shù)據(jù)從該端口輸出。CLK腳為0809的時(shí)鐘輸入端。單片機(jī)的P0.0~P0.7、P3端口作8為數(shù)碼管顯示控制。P2端口作A/D轉(zhuǎn)換數(shù)據(jù)讀入用,P3.0端口用作0809的A/D轉(zhuǎn)換控制。通過對單片機(jī)p1.5-1.7口置低電平控制數(shù)碼管亮燈,p3.1口置低電平時(shí)蜂鳴器報(bào)警。 模擬信號輸出電路由D/A轉(zhuǎn)換、數(shù)據(jù)處理及顯示控制等組成。D/A轉(zhuǎn)換集成電路有DAC0832完成。DAC0832具有8個(gè)數(shù)字入端口,地址線(D0-D7腳)有8個(gè)端口的數(shù)字輸入作D/A轉(zhuǎn)換。Cs和WR端控制ADC0832轉(zhuǎn)換。RFB端負(fù)責(zé)輸出模擬信號。 2.1.1 方案 A/D轉(zhuǎn)換器的種類很多,就位數(shù)來說,可以分為8位、10位、12位和16位等。位數(shù)越高其分辨率就越高,價(jià)格也就越貴。A/D轉(zhuǎn)換器型號很多,而其轉(zhuǎn)換時(shí)間和轉(zhuǎn)換誤差也各不相同。 (1)逐漸逼近式A/D轉(zhuǎn)換器:它是一種速度快、精度較高、成本較低的直接式轉(zhuǎn)換器,其轉(zhuǎn)換時(shí)間在幾微秒到幾百微秒之間。 (2)雙積分A/D轉(zhuǎn)換器:它是一種間接式的A/D轉(zhuǎn)換器,優(yōu)點(diǎn)是抗干擾能力強(qiáng),精度比較高,缺點(diǎn)是數(shù)度很慢,適用于對轉(zhuǎn)換數(shù)度要求不高的系統(tǒng)。 (3)并行式A/D轉(zhuǎn)換器:它又被稱為flash(快速)型,它的轉(zhuǎn)換數(shù)度很高,但她采用了很多個(gè)比較器,而n位的轉(zhuǎn)換就需要2n-1個(gè)比較器,因此電路規(guī)模也極大,價(jià)格也很貴,只適用于視頻A/D轉(zhuǎn)換器等數(shù)度特別高的領(lǐng)域。 方案確立 鑒于上面三種方案,在價(jià)格、轉(zhuǎn)換速度等多種標(biāo)準(zhǔn)考量下,在本設(shè)計(jì)選用的是逐漸逼近式A/D轉(zhuǎn)換器——ADC0808。 2.2 設(shè)計(jì)方框圖 3 設(shè)計(jì)原理分析 AT89C51芯片是主控電路負(fù)責(zé)控制模擬電路0832和采集電路0808的工作。模擬信號經(jīng)過采集電路后轉(zhuǎn)化為數(shù)字信號反饋到主控電路AT89C51中,主控電路AT89C51將反饋的模擬信號在顯示電路中顯示出來。警報(bào)電路通過主控電路AT89C51比較數(shù)據(jù)后的結(jié)果決定是否進(jìn)行警報(bào)工作。 通過P1^0端口進(jìn)行控制,當(dāng)P1^0端口置高電平時(shí)進(jìn)行ADC轉(zhuǎn)換,當(dāng)P1^0端口置低電平時(shí)進(jìn)行DAC轉(zhuǎn)換。P1^0端口控制了74LS373的使能端電平,進(jìn)而控制ADC/DAC功能選擇。 while(1) { if(P1_0==1)//判斷DAC和ADC ADCC(); //ADC轉(zhuǎn)換 else DAC();//DCA轉(zhuǎn)換 } 模擬信號通過模擬信號輸入端口IN0-IN7輸入到ADC0808芯片中,OUT0-7數(shù)字信號輸出端口將數(shù)字信號輸送到74LS237鎖存器中,再把信號送到P2端口; 數(shù)字鍵盤0-7把低電平輸出到74LS148編碼器中,再通過編碼器輸出相應(yīng)的信號控制ADC0808的模擬信道選擇地址。 P1^5-P1^7端口通過輸出信號到74LS138譯碼器中,譯碼器輸出信號到數(shù)碼管位選段從而控制顯示。P0^0-P0^7端口送數(shù)字信號經(jīng)過74LS373鎖存器到數(shù)碼管顯示區(qū)中進(jìn)行相應(yīng)的數(shù)字顯示。 - for(i=0;i<8;i++)
- {
- P1_4=1;
- P1_7=a1[i];//送位選碼
- P1_6=b1[i];
- P1_5=c1[i];
- P0=buf[i]; //數(shù)據(jù)顯示
- delay(2);//亮一段時(shí)間
- P1_4=0;//熄滅掉,否則會(huì)形成亮段碼干擾
- }
復(fù)制代碼
通過比較P2端接受的數(shù)字信號和上下限的大小,P3^1輸出相應(yīng)的電平控制蜂鳴器。P3^1輸出的低電平蜂鳴器工作,輸出高電平蜂鳴器不工作。 P3_1=1; //蜂鳴器不鳴 if(vv>=MAX) { P3_1=0;//蜂鳴器響 } if(vv<=MIN) { P3_1=0;//蜂鳴器響 } P0^0-P0^7端口輸出數(shù)字信號經(jīng)過鎖存器74LS373到DAC0832的信號接受端D0-D7中。Cs和WR端控制ADC0832轉(zhuǎn)換。RFB端負(fù)責(zé)輸出模擬信號。 - void DAC()
- {
- P3_1=1;
- while(1) //三角波
- {
- if(P3_7==1)
- {
- unsigned char i;
- for(i=0;i<250;i++)
- {
- DAC0832=i;
- }
- for(i=250;i>1;i--)
- {
- DAC0832=i;
- }
- }
- else //方波
- {
- unsigned char i;
- for(i=0;i<250;i++)
- {
- DAC0832=250;
- }
- for(i=0;i<250;i++)
- {
- DAC0832=0;
- }
- }
- if(P1_0!=0) //判斷是否終止DAC
- break; //終止DAC
- }
- }
復(fù)制代碼
3.1 時(shí)鐘電路的設(shè)計(jì) 時(shí)鐘電路由一個(gè)12MHZ晶振和兩個(gè)30pF電容C1和C2組成。 3.2 控制電路的設(shè)計(jì) 控制電路有AT89C51芯片的I/O通過輸出高低電平到各個(gè)器件的使能端中進(jìn)行相應(yīng)的控制。 4 測試 測試方法:分功能逐一測試; 測試過程: - 先測試ADC轉(zhuǎn)換功能是否可以執(zhí)行。在模數(shù)轉(zhuǎn)換中發(fā)現(xiàn)模數(shù)轉(zhuǎn)換結(jié)果與測試所用測試電壓不一致,在仿真中發(fā)現(xiàn)轉(zhuǎn)換結(jié)果輸送到單片機(jī)中只有一瞬間,嚴(yán)重影響單片機(jī)AT89C51數(shù)據(jù)接受。通過添加一個(gè)74LS273鎖存器對傳輸結(jié)果進(jìn)行保持,解決上述問題。測試結(jié)果:在模數(shù)轉(zhuǎn)換中模數(shù)轉(zhuǎn)換結(jié)果與測試所用測試電壓一致。
- 測試顯示功能。通過觀察顯示的結(jié)果與測試數(shù)據(jù)是否相同。針對顯示閃爍,對顯示程序中的延時(shí)進(jìn)行調(diào)整。測試通過。測試結(jié)果:通過觀察顯示的結(jié)果與測試數(shù)據(jù)相同。
- 測試信道選擇功能。通過對比所選擇的信號是否與測試信號一一對應(yīng)。測試通過。測試結(jié)果:
通過對比所選擇的信號與測試信號一一對應(yīng)。 - 測試警報(bào)功能。通過不斷的調(diào)整輸入模擬信號來測試警報(bào)系統(tǒng)是否會(huì)在設(shè)定的先下限定中發(fā)出警報(bào)。測試通過。測試結(jié)果模擬信號在超過設(shè)定的先下限定中發(fā)出警報(bào),正常狀態(tài)下不發(fā)出警報(bào)。
- DAC功能測試。通過示波器觀察輸出信號與編程所需信號是否一致。測試通過。結(jié)果:通過示波器觀察輸出信號與編程所需信號一致。
5 總結(jié) 本課題的主要功能是模擬信號采集并轉(zhuǎn)換功能和數(shù)模轉(zhuǎn)換功能。模擬信號采集和轉(zhuǎn)換功能可以應(yīng)用在醫(yī)療中用于采集人體的微電流在轉(zhuǎn)換信號輸出于PC端進(jìn)行觀看。數(shù)模功能可以應(yīng)用在揚(yáng)聲器中。 整個(gè)設(shè)計(jì)通過后繼的完善應(yīng)該可以以達(dá)到將模擬信號采集后進(jìn)行轉(zhuǎn)換為數(shù)字信號,將對應(yīng)信息顯示在數(shù)碼管中進(jìn)行觀察。將數(shù)字信號超出設(shè)置的上下限信號會(huì)發(fā)出警報(bào),提醒工作人員。同時(shí)也可以將收集到的信號進(jìn)行判斷,后輸出相應(yīng)波形的模擬信號。其中8路的信號采集通道可以通過按鍵進(jìn)行選擇,信號報(bào)警上下限也可以通過按鍵進(jìn)行調(diào)整。 參考文獻(xiàn) [1] 李繼凱.數(shù)字電子技術(shù)與應(yīng)用 科學(xué)出版社,2016 [2] 楊立生.單片機(jī)原理與應(yīng)用項(xiàng)目教程[M].武漢:武漢大學(xué)出版社,2015 [3] 閻石.數(shù)字電子技術(shù)基礎(chǔ)(第三版). 北京:高等教育出版社,1989 [4] 廖常初.現(xiàn)場總線概述[J].電工技術(shù),1999.6 附錄   
單片機(jī)源程序如下:
- #include <reg51.h>
- #include <absacc.h>
- #define DAC0832 XBYTE[0XFFFE] // DAC0832的地址
- unsigned char code zixing[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0-9
- unsigned char code zixing1[]={0xbF,0x86,0xdB,0xcF,0xe6,0xeD,0xfD,0x87,0xfF,0xeF}; //0-9
- unsigned char buf[]={0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00} ; //顯示緩沖區(qū)
- unsigned char c1[]={1,1,1,1,0,0,0,0}; //數(shù)碼管選位
- unsigned char b1[]={1,1,0,0,1,1,0,0}; //數(shù)碼管選位
- unsigned char a1[]={1,0,1,0,1,0,1,0}; //數(shù)碼管選位
- unsigned char ad_data;//定義成全局變量,以便主函數(shù)和中斷函數(shù)都能引用
- unsigned char i,j;
- unsigned char TD;
- unsigned int MAX;
- unsigned int MIN;
- unsigned int dig,dd;
- unsigned int Aa,Bb,Cc,xuhao,df;
- long int vv;
- sbit P3_0=P3^0;
- sbit P3_1=P3^1;
- sbit P3_4=P3^4;
- sbit P3_7=P3^7;
- sbit P1_0=P1^0;
- sbit P1_1=P1^1;
- sbit P1_2=P1^2;
- sbit P1_3=P1^3;
- sbit P1_4=P1^4;
- sbit P1_5=P1^5;
- sbit P1_6=P1^6;
- sbit P1_7=P1^7;
- void delay(unsigned int time); //子程序聲明
- void ADC();
- void xianshi();
- void xianding();
- void jingbao();
- void ADCC();
- void DAC();
- void main()
- { EA=1;
- EX0=1;
- EX1=1;
- ET0=1;
- ET1=1;
- IT0=1;
- IT1=1;
- PX0=1;
- MAX=40; //電壓上限賦初值
- MIN=10; //電壓下限賦初值
- while(1)
- {
- if(P1_0==1)//判斷DAC和ADC
- ADCC(); //ADC轉(zhuǎn)換
- else
- DAC();//DCA轉(zhuǎn)換
- }
- }//main end
- void delay(unsigned int time) //延時(shí)
- {
- unsigned int i,j;
- for(i=0;i<time;i++)
- for(j=0;j<60;j++) ;
- }
- void ADC() //模數(shù)轉(zhuǎn)換程序
- {
- TD=P3;
- Aa=Bb=Cc=0;
- if(P1_3==1)
- {
- Cc=4;
- }
- if(P1_2==1)
- {
- Bb=2;
- }
- if(P1_1==1)
- {
- Aa=1;
- }
- xuhao=Aa+Bb+Cc;//信道序號
- buf[1]=zixing[xuhao];//將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
- ad_data=P2;//讀取轉(zhuǎn)換完成的數(shù)字量
- vv=(5*ad_data/255.0)*10;//擴(kuò)大10以便顯示出小數(shù)點(diǎn)后的1位數(shù)
- //除以255.0時(shí)先轉(zhuǎn)換成浮點(diǎn)數(shù),而乘10后,又將乘積的結(jié)果浮點(diǎn)數(shù)轉(zhuǎn)換成整型數(shù)
- dig=vv%10;//取模要余數(shù)得出低位
- buf[3]=zixing[dig];//將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
- dig=vv/10;//求商
- buf[2]=zixing1[dig]; //將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
- }
- void xianshi() //數(shù)碼管顯示程序
- {
- for(i=0;i<8;i++)
- {
- P1_4=1;
- P1_7=a1[i];//送位選碼
- P1_6=b1[i];
- P1_5=c1[i];
- P0=buf[i]; //數(shù)據(jù)顯示
- delay(2);//亮一段時(shí)間
- P1_4=0;//熄滅掉,否則會(huì)形成亮段碼干擾
- }
- }
- void jingbao() //警報(bào)程序
- {
- P3_1=1; //蜂鳴器不鳴
- if(vv>=MAX)
- {
- P3_1=0;//蜂鳴器響
- }
- if(vv<=MIN)
- {
- P3_1=0;//蜂鳴器響
- }
- }
- void up() interrupt 0 //上限電壓調(diào)整中斷
- {
- if(P3_4==1)
- {
- MAX++;
- }
- else
- {
- MAX--;
- }
- }
- void down() interrupt 2 //下限電壓調(diào)整中斷
- {
- if(P3_4==1)
- {
- MIN++;
- }
- else
- {
- MIN--;
- }
- }
- void xianding() //上下限警報(bào)電壓掃描程序
- {
- dd=MAX/10; //求商
- buf[4]=zixing1[dd]; //將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
- dd=MAX%10; //取模要余數(shù)得出低位
- buf[5]=zixing[dd]; //將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
- dd=MIN/10; //求商
- buf[6]=zixing1[dd]; //將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
- dd=MIN%10; //取模要余數(shù)得出低位
- buf[7]=zixing[dd]; //將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
- }
- void ADCC()
- {
- while(1)
- {
- P3_0=0;
- P3_0=1;
- P3_0=0; //ADC0808轉(zhuǎn)換開始
- if(TD!=P3) //檢測adc轉(zhuǎn)換信道是否發(fā)生變化
- {
- ADC();//模數(shù)轉(zhuǎn)換程序
- }
- if(ad_data!=P2) //檢測adc轉(zhuǎn)換信號是否發(fā)生變化
- {
- ADC(); //模數(shù)轉(zhuǎn)換程序
- }
- xianding(); //上下限警報(bào)電壓設(shè)置程序
- jingbao(); //警報(bào)程序
- xianshi(); //數(shù)碼管顯示程序
- if(P1_0!=1)//判斷是否終止ADC
- break; //終止ADC
- }
- }
- void DAC()
- {
- P3_1=1;
- while(1) //三角波
- {
- if(P3_7==1)
- {
- unsigned char i;
- for(i=0;i<250;i++)
- {
- DAC0832=i;
- }
- for(i=250;i>1;i--)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
8路數(shù)據(jù)采集控制系統(tǒng).zip
(801.18 KB, 下載次數(shù): 150)
2018-6-4 23:27 上傳
點(diǎn)擊文件名下載附件
|