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