設計了一個關于單片機數(shù)據(jù)采集控制系統(tǒng)的作品,采用數(shù)模轉(zhuǎn)換和模數(shù)轉(zhuǎn)換的技術,實現(xiàn)了8路數(shù)據(jù)采集功能和輸出模擬信號的功能
單片機數(shù)據(jù)采集控制系統(tǒng)
摘要:設計了一個關于單片機數(shù)據(jù)采集控制系統(tǒng)的作品,采用數(shù)模轉(zhuǎn)換和模數(shù)轉(zhuǎn)換的技術,實現(xiàn)了8路數(shù)據(jù)采集功能和輸出模擬信號的功能
1 課題意義 單片機數(shù)據(jù)采集控制系統(tǒng)不只是應用于工業(yè)領域,如鋼鐵、電力、化工,還廣泛用于食品,醫(yī)藥、建筑、科研等行業(yè)。 在一些工業(yè)現(xiàn)場中,設備長時間運行容易出現(xiàn)故障,為了監(jiān)控這些設備,通常利用數(shù)據(jù)采集裝置采集他們運行時的數(shù)據(jù)并送給PC機,通過運行在PC機上的特定軟件對這些數(shù)據(jù)進行分析,以此判斷當前運行設備的狀況,進而采取相應措施。 實時采集來自生產(chǎn)線的產(chǎn)量數(shù)據(jù)或是不良品的數(shù)量、或是生產(chǎn)線的故障類型(如停線、缺料、品質(zhì)),并傳輸?shù)綌?shù)據(jù)庫系統(tǒng)中;接收來自數(shù)據(jù)庫的信息:如生產(chǎn)計劃信息、物料信息等;傳輸檢查工位的不良品名稱及數(shù)量信息;連接檢測儀器,實現(xiàn)檢測儀器數(shù)字化,數(shù)據(jù)采集儀自動從測量儀器中獲取測量數(shù)據(jù),進行記錄,分析計算,對測量結(jié)果進行自動判斷。 2 總體設計方案
11.png (53.93 KB, 下載次數(shù): 36)
下載附件
2018-6-4 23:43 上傳
2.1 設計思路 設計基本要求: 1)可實現(xiàn)8路數(shù)據(jù)的采集,假設8路信號均為0-5V的電壓信號; 2)采集數(shù)據(jù)可通過數(shù)碼管顯示,顯示格式為:[通道號] 電壓值,如 [01] 4.5 3)具有異常數(shù)據(jù)聲音報警功能:對第一路數(shù)據(jù)可設置正常數(shù)據(jù)的上限值和下限值,當采集的數(shù)據(jù)出現(xiàn)異常,發(fā)出報警信號。 4)可輸出頻率為1kHZ的方波,三角波。 根據(jù)上述要求,設計思路如下 選擇單片機與A/D轉(zhuǎn)換芯片結(jié)合的方法實現(xiàn)本設計。使用 的基本元器件是:AT89C51單片機,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腳為地址鎖存控制,當輸入為高電平時,對地址信號進行鎖存。START腳為測試控制,當輸入一個2uS寬高電平脈沖時,就開始A/D轉(zhuǎn)換。EOC腳為A/D轉(zhuǎn)換結(jié)束標志,當A/D轉(zhuǎn)換結(jié)束時,7腳輸出高電平。OE腳為A/D轉(zhuǎn)換數(shù)據(jù)輸出允許控制,當OE腳為高電平時,A/D轉(zhuǎn)換數(shù)據(jù)從該端口輸出。CLK腳為0809的時鐘輸入端。單片機的P0.0~P0.7、P3端口作8為數(shù)碼管顯示控制。P2端口作A/D轉(zhuǎn)換數(shù)據(jù)讀入用,P3.0端口用作0809的A/D轉(zhuǎn)換控制。通過對單片機p1.5-1.7口置低電平控制數(shù)碼管亮燈,p3.1口置低電平時蜂鳴器報警。 模擬信號輸出電路由D/A轉(zhuǎn)換、數(shù)據(jù)處理及顯示控制等組成。D/A轉(zhuǎn)換集成電路有DAC0832完成。DAC0832具有8個數(shù)字入端口,地址線(D0-D7腳)有8個端口的數(shù)字輸入作D/A轉(zhuǎn)換。Cs和WR端控制ADC0832轉(zhuǎn)換。RFB端負責輸出模擬信號。 2.1.1 方案 A/D轉(zhuǎn)換器的種類很多,就位數(shù)來說,可以分為8位、10位、12位和16位等。位數(shù)越高其分辨率就越高,價格也就越貴。A/D轉(zhuǎn)換器型號很多,而其轉(zhuǎn)換時間和轉(zhuǎn)換誤差也各不相同。 (1)逐漸逼近式A/D轉(zhuǎn)換器:它是一種速度快、精度較高、成本較低的直接式轉(zhuǎn)換器,其轉(zhuǎn)換時間在幾微秒到幾百微秒之間。 (2)雙積分A/D轉(zhuǎn)換器:它是一種間接式的A/D轉(zhuǎn)換器,優(yōu)點是抗干擾能力強,精度比較高,缺點是數(shù)度很慢,適用于對轉(zhuǎn)換數(shù)度要求不高的系統(tǒng)。 (3)并行式A/D轉(zhuǎn)換器:它又被稱為flash(快速)型,它的轉(zhuǎn)換數(shù)度很高,但她采用了很多個比較器,而n位的轉(zhuǎn)換就需要2n-1個比較器,因此電路規(guī)模也極大,價格也很貴,只適用于視頻A/D轉(zhuǎn)換器等數(shù)度特別高的領域。 方案確立 鑒于上面三種方案,在價格、轉(zhuǎn)換速度等多種標準考量下,在本設計選用的是逐漸逼近式A/D轉(zhuǎn)換器——ADC0808。 2.2 設計方框圖 3 設計原理分析 AT89C51芯片是主控電路負責控制模擬電路0832和采集電路0808的工作。模擬信號經(jīng)過采集電路后轉(zhuǎn)化為數(shù)字信號反饋到主控電路AT89C51中,主控電路AT89C51將反饋的模擬信號在顯示電路中顯示出來。警報電路通過主控電路AT89C51比較數(shù)據(jù)后的結(jié)果決定是否進行警報工作。 通過P1^0端口進行控制,當P1^0端口置高電平時進行ADC轉(zhuǎn)換,當P1^0端口置低電平時進行DAC轉(zhuǎn)換。P1^0端口控制了74LS373的使能端電平,進而控制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編碼器中,再通過編碼器輸出相應的信號控制ADC0808的模擬信道選擇地址。 P1^5-P1^7端口通過輸出信號到74LS138譯碼器中,譯碼器輸出信號到數(shù)碼管位選段從而控制顯示。P0^0-P0^7端口送數(shù)字信號經(jīng)過74LS373鎖存器到數(shù)碼管顯示區(qū)中進行相應的數(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);//亮一段時間
- P1_4=0;//熄滅掉,否則會形成亮段碼干擾
- }
復制代碼
通過比較P2端接受的數(shù)字信號和上下限的大小,P3^1輸出相應的電平控制蜂鳴器。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端負責輸出模擬信號。 - 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
- }
- }
復制代碼
3.1 時鐘電路的設計 時鐘電路由一個12MHZ晶振和兩個30pF電容C1和C2組成。 3.2 控制電路的設計 控制電路有AT89C51芯片的I/O通過輸出高低電平到各個器件的使能端中進行相應的控制。 4 測試 測試方法:分功能逐一測試; 測試過程: - 先測試ADC轉(zhuǎn)換功能是否可以執(zhí)行。在模數(shù)轉(zhuǎn)換中發(fā)現(xiàn)模數(shù)轉(zhuǎn)換結(jié)果與測試所用測試電壓不一致,在仿真中發(fā)現(xiàn)轉(zhuǎn)換結(jié)果輸送到單片機中只有一瞬間,嚴重影響單片機AT89C51數(shù)據(jù)接受。通過添加一個74LS273鎖存器對傳輸結(jié)果進行保持,解決上述問題。測試結(jié)果:在模數(shù)轉(zhuǎn)換中模數(shù)轉(zhuǎn)換結(jié)果與測試所用測試電壓一致。
- 測試顯示功能。通過觀察顯示的結(jié)果與測試數(shù)據(jù)是否相同。針對顯示閃爍,對顯示程序中的延時進行調(diào)整。測試通過。測試結(jié)果:通過觀察顯示的結(jié)果與測試數(shù)據(jù)相同。
- 測試信道選擇功能。通過對比所選擇的信號是否與測試信號一一對應。測試通過。測試結(jié)果:
通過對比所選擇的信號與測試信號一一對應。 - 測試警報功能。通過不斷的調(diào)整輸入模擬信號來測試警報系統(tǒng)是否會在設定的先下限定中發(fā)出警報。測試通過。測試結(jié)果模擬信號在超過設定的先下限定中發(fā)出警報,正常狀態(tài)下不發(fā)出警報。
- DAC功能測試。通過示波器觀察輸出信號與編程所需信號是否一致。測試通過。結(jié)果:通過示波器觀察輸出信號與編程所需信號一致。
5 總結(jié) 本課題的主要功能是模擬信號采集并轉(zhuǎn)換功能和數(shù)模轉(zhuǎn)換功能。模擬信號采集和轉(zhuǎn)換功能可以應用在醫(yī)療中用于采集人體的微電流在轉(zhuǎn)換信號輸出于PC端進行觀看。數(shù)模功能可以應用在揚聲器中。 整個設計通過后繼的完善應該可以以達到將模擬信號采集后進行轉(zhuǎn)換為數(shù)字信號,將對應信息顯示在數(shù)碼管中進行觀察。將數(shù)字信號超出設置的上下限信號會發(fā)出警報,提醒工作人員。同時也可以將收集到的信號進行判斷,后輸出相應波形的模擬信號。其中8路的信號采集通道可以通過按鍵進行選擇,信號報警上下限也可以通過按鍵進行調(diào)整。 參考文獻 [1] 李繼凱.數(shù)字電子技術與應用 科學出版社,2016 [2] 楊立生.單片機原理與應用項目教程[M].武漢:武漢大學出版社,2015 [3] 閻石.數(shù)字電子技術基礎(第三版). 北京:高等教育出版社,1989 [4] 廖常初.現(xiàn)場總線概述[J].電工技術,1999.6 附錄   
單片機源程序如下:
- #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) //延時
- {
- 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;//擴大10以便顯示出小數(shù)點后的1位數(shù)
- //除以255.0時先轉(zhuǎn)換成浮點數(shù),而乘10后,又將乘積的結(jié)果浮點數(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);//亮一段時間
- P1_4=0;//熄滅掉,否則會形成亮段碼干擾
- }
- }
- void jingbao() //警報程序
- {
- 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() //上下限警報電壓掃描程序
- {
- 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(); //上下限警報電壓設置程序
- jingbao(); //警報程序
- 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黑下載附件…………
復制代碼
0.png (46.61 KB, 下載次數(shù): 34)
下載附件
2018-6-4 23:44 上傳
所有資料51hei提供下載:
8路數(shù)據(jù)采集控制系統(tǒng).zip
(801.18 KB, 下載次數(shù): 150)
2018-6-4 23:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|