找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9368|回復: 7
打印 上一主題 下一主題
收起左側(cè)

單片機+ADC0808的8路數(shù)據(jù)采集控制系統(tǒng)設計 含仿真與源碼

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:345053 發(fā)表于 2018-6-4 23:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
設計了一個關于單片機數(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 總體設計方案


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é)果決定是否進行警報工作。
  • ADC/DAC功能選擇模塊:
通過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)換            
                }            
  • DAC功能模塊:
模擬信號通過模擬信號輸入端口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ù)字顯示。
  1. for(i=0;i<8;i++)
  2.   {  
  3.      P1_4=1;  
  4.      P1_7=a1[i];//送位選碼
  5.               P1_6=b1[i];
  6.               P1_5=c1[i];
  7.               P0=buf[i];  //數(shù)據(jù)顯示  
  8.      delay(2);//亮一段時間   
  9.      P1_4=0;//熄滅掉,否則會形成亮段碼干擾                  
  10.   }
復制代碼

  • 警報功能模塊:
通過比較P2端接受的數(shù)字信號和上下限的大小,P3^1輸出相應的電平控制蜂鳴器。P3^1輸出的低電平蜂鳴器工作,輸出高電平蜂鳴器不工作。
P3_1=1; //蜂鳴器不鳴
                if(vv>=MAX)
                {
                P3_1=0;//蜂鳴器響
                }
                if(vv<=MIN)
                {
                P3_1=0;//蜂鳴器響
                }
  • DAC功能模塊:
P0^0-P0^7端口輸出數(shù)字信號經(jīng)過鎖存器74LS373到DAC0832的信號接受端D0-D7中。Cs和WR端控制ADC0832轉(zhuǎn)換。RFB端負責輸出模擬信號。
  1. void DAC()
  2. {            
  3.     P3_1=1;
  4.               while(1)   //三角波
  5.    {
  6.     if(P3_7==1)
  7.                 {
  8.                  unsigned char i;
  9.                  for(i=0;i<250;i++)
  10.                  {
  11.                  DAC0832=i;
  12.                  }
  13.                                for(i=250;i>1;i--)
  14.                  {
  15.                  DAC0832=i;
  16.                  }
  17.                 }
  18.               else                                          //方波
  19.               {
  20.               unsigned char i;
  21.               for(i=0;i<250;i++)
  22.               {
  23.                  DAC0832=250;
  24.               }
  25.               for(i=0;i<250;i++)
  26.               {
  27.                  DAC0832=0;
  28.               }
  29.               }
  30.               if(P1_0!=0) //判斷是否終止DAC
  31.               break;                            //終止DAC
  32.               }
  33. }
復制代碼

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
附錄
              

單片機源程序如下:
  1. #include <reg51.h>
  2. #include <absacc.h>
  3. #define DAC0832 XBYTE[0XFFFE]                //        DAC0832的地址
  4. unsigned char code zixing[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0-9
  5. unsigned char code zixing1[]={0xbF,0x86,0xdB,0xcF,0xe6,0xeD,0xfD,0x87,0xfF,0xeF};         //0-9
  6. unsigned char buf[]={0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00} ;           //顯示緩沖區(qū)
  7. unsigned char c1[]={1,1,1,1,0,0,0,0};  //數(shù)碼管選位
  8. unsigned char b1[]={1,1,0,0,1,1,0,0};          //數(shù)碼管選位
  9. unsigned char a1[]={1,0,1,0,1,0,1,0};        //數(shù)碼管選位
  10. unsigned char ad_data;//定義成全局變量,以便主函數(shù)和中斷函數(shù)都能引用
  11. unsigned char i,j;  
  12. unsigned char TD;  
  13. unsigned int MAX;
  14. unsigned int MIN;
  15. unsigned int dig,dd;
  16. unsigned int Aa,Bb,Cc,xuhao,df;
  17. long int vv;
  18. sbit P3_0=P3^0;
  19. sbit P3_1=P3^1;
  20. sbit P3_4=P3^4;
  21. sbit P3_7=P3^7;
  22. sbit P1_0=P1^0;
  23. sbit P1_1=P1^1;
  24. sbit P1_2=P1^2;
  25. sbit P1_3=P1^3;
  26. sbit P1_4=P1^4;
  27. sbit P1_5=P1^5;
  28. sbit P1_6=P1^6;
  29. sbit P1_7=P1^7;
  30. void delay(unsigned int time); //子程序聲明  
  31. void ADC();
  32. void xianshi();
  33. void xianding();
  34. void jingbao();
  35. void ADCC();
  36. void DAC();
  37. void main()
  38. {    EA=1;               
  39.       EX0=1;
  40.           EX1=1;
  41.       ET0=1;
  42.           ET1=1;
  43.       IT0=1;
  44.           IT1=1;
  45.       PX0=1;
  46.       MAX=40; //電壓上限賦初值
  47.       MIN=10; //電壓下限賦初值        
  48.           while(1)
  49.           {
  50.       if(P1_0==1)//判斷DAC和ADC
  51.           ADCC();  //ADC轉(zhuǎn)換
  52.           else
  53.              DAC();//DCA轉(zhuǎn)換        
  54.           }                                                                                            
  55. }//main end
  56. void delay(unsigned int time)        //延時
  57. {   
  58.    unsigned int i,j;
  59.    for(i=0;i<time;i++)
  60.    for(j=0;j<60;j++) ;
  61.   }
  62. void ADC()                //模數(shù)轉(zhuǎn)換程序
  63. {        
  64.     TD=P3;
  65.           Aa=Bb=Cc=0;
  66.         if(P1_3==1)
  67.         {
  68.          Cc=4;
  69.         }
  70.         if(P1_2==1)
  71.         {
  72.          Bb=2;
  73.         }
  74.         if(P1_1==1)
  75.         {
  76.          Aa=1;
  77.         }
  78.         xuhao=Aa+Bb+Cc;//信道序號
  79.     buf[1]=zixing[xuhao];//將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)                           
  80.     ad_data=P2;//讀取轉(zhuǎn)換完成的數(shù)字量
  81.         vv=(5*ad_data/255.0)*10;//擴大10以便顯示出小數(shù)點后的1位數(shù)         
  82.                                                 //除以255.0時先轉(zhuǎn)換成浮點數(shù),而乘10后,又將乘積的結(jié)果浮點數(shù)轉(zhuǎn)換成整型數(shù)
  83.         dig=vv%10;//取模要余數(shù)得出低位   
  84.         buf[3]=zixing[dig];//將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)   
  85.         dig=vv/10;//求商
  86.     buf[2]=zixing1[dig]; //將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
  87. }
  88. void xianshi()                 //數(shù)碼管顯示程序
  89. {

  90.   for(i=0;i<8;i++)  
  91.   {   
  92.      P1_4=1;   
  93.      P1_7=a1[i];//送位選碼
  94.          P1_6=b1[i];
  95.          P1_5=c1[i];
  96.          P0=buf[i];  //數(shù)據(jù)顯示   
  97.      delay(2);//亮一段時間   
  98.      P1_4=0;//熄滅掉,否則會形成亮段碼干擾              
  99.   }   
  100. }
  101. void jingbao()        //警報程序
  102. {
  103.             P3_1=1; //蜂鳴器不鳴
  104.           if(vv>=MAX)
  105.           {
  106.           P3_1=0;//蜂鳴器響
  107.           }
  108.           if(vv<=MIN)
  109.           {
  110.           P3_1=0;//蜂鳴器響
  111.           }
  112. }
  113. void up() interrupt 0         //上限電壓調(diào)整中斷
  114. {        
  115.     if(P3_4==1)
  116.     {
  117.     MAX++;
  118.         }
  119.         else
  120.         {
  121.         MAX--;
  122.         }
  123. }
  124. void down() interrupt 2           //下限電壓調(diào)整中斷
  125. {
  126.     if(P3_4==1)
  127.     {
  128.     MIN++;
  129.         }
  130.         else
  131.         {
  132.         MIN--;
  133.         }
  134. }
  135. void xianding()           //上下限警報電壓掃描程序
  136. {     
  137.       dd=MAX/10;                 //求商
  138.           buf[4]=zixing1[dd]; //將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
  139.           dd=MAX%10;                 //取模要余數(shù)得出低位
  140.           buf[5]=zixing[dd]; //將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
  141.           dd=MIN/10;                 //求商
  142.           buf[6]=zixing1[dd]; //將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
  143.           dd=MIN%10;                 //取模要余數(shù)得出低位
  144.           buf[7]=zixing[dd]; //將數(shù)字轉(zhuǎn)換成字型碼放入顯示緩沖區(qū)
  145. }
  146. void ADCC()
  147. {                     
  148.           while(1)
  149.           {           
  150.           P3_0=0;        
  151.           P3_0=1;
  152.       P3_0=0; //ADC0808轉(zhuǎn)換開始
  153.           if(TD!=P3) //檢測adc轉(zhuǎn)換信道是否發(fā)生變化
  154.           {
  155.           ADC();//模數(shù)轉(zhuǎn)換程序
  156.           }              
  157.           if(ad_data!=P2) //檢測adc轉(zhuǎn)換信號是否發(fā)生變化
  158.           {        
  159.           ADC();   //模數(shù)轉(zhuǎn)換程序
  160.           }
  161.           xianding();  //上下限警報電壓設置程序
  162.           jingbao();   //警報程序
  163.           xianshi();   //數(shù)碼管顯示程序
  164.           if(P1_0!=1)//判斷是否終止ADC
  165.           break;          //終止ADC
  166.       }                                                                                                              
  167. }
  168. void DAC()
  169. {        
  170.     P3_1=1;
  171.         while(1)   //三角波
  172.    {  
  173.     if(P3_7==1)
  174.           {
  175.            unsigned char i;
  176.            for(i=0;i<250;i++)
  177.            {
  178.            DAC0832=i;
  179.            }
  180.                    for(i=250;i>1;i--)
  181. ……………………

  182. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼



所有資料51hei提供下載:
8路數(shù)據(jù)采集控制系統(tǒng).zip (801.18 KB, 下載次數(shù): 150)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:253209 發(fā)表于 2018-6-5 23:21 | 只看該作者
感謝分享,,正好需要,Keil5編譯成功了

51hei.png (51.26 KB, 下載次數(shù): 37)

51hei.png
回復

使用道具 舉報

板凳
ID:8455 發(fā)表于 2018-6-6 17:00 | 只看該作者
多謝分享,學習下。
回復

使用道具 舉報

地板
ID:566495 發(fā)表于 2019-6-19 10:11 | 只看該作者
很棒正好需要
回復

使用道具 舉報

5#
ID:612661 發(fā)表于 2019-9-17 16:51 | 只看該作者
感謝分享
回復

使用道具 舉報

6#
ID:612661 發(fā)表于 2019-9-17 16:55 | 只看該作者
感謝分享,正好需要
回復

使用道具 舉報

7#
ID:612661 發(fā)表于 2019-9-18 09:13 | 只看該作者
感謝分享
回復

使用道具 舉報

8#
ID:936097 發(fā)表于 2021-6-10 16:16 | 只看該作者
你好我用這個程序在WORD這報錯怎么辦呢
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表