欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機液位檢測系統設計剖析 [打印本頁]

作者: wengehaoren    時間: 2020-4-28 16:47
標題: 單片機液位檢測系統設計剖析
一 功能簡介
     本設計經過調研,收集且分析相關技術資料,綜合考慮液位檢測技術發展和液位檢測系統特點的基礎上,提出把液位檢測顯示同超限報警綜合的解決方案。本系統采用AT89C51單片機作為處理器,主要完成以下工作:
         基于AT89C51的液位信息檢測設計方案。
         傳感器LM1042,A/D轉換芯片ADC0809與單片機的接口電路設計。
         LED數碼管的顯示是利用段碼加位碼循環動態顯示實現的。
         設計主要軟件程序模塊,完成軟件設計。

二 系統硬件設計簡介
該系統以AT89C51作為核心控制部件,外加傳感器。一片A/D轉換芯片和一片數碼管驅動芯片來完成系統的預期任務,即液位的檢測、顯示和超限報警。LM1042外接的熱阻探針溫度的變化依賴于周圍材料的熱阻的大小,從而可以根據探針在液體中的深度不同時電阻的不同檢測出液位的深度信息,由LM1042內部轉換電路網絡轉換為與液位成線性關系的電壓信號,再由A/D轉換芯片AD0809將模擬信號轉換為數字信號,實現液位信息的輸入,AT89C51從ADC0809讀取液位信息后進行數據處理和超限判斷,隨后將處理過的數據分別通過位碼和段碼送給相應的芯片。同時,若液位超限則由單片機驅動蜂鳴器報警。

各部分功能:
電源部分提供+5V +15V電壓供系統各部分使用。
傳感器LM1042實現液位信息到電壓信號的轉換。
3. ADC0809將放大器輸出的電壓信號經A/D轉換后送到單片機。
4. AT89C51為處理器,實現液位信息的接收、數據處理、輸出到LED顯示端.
5.蜂鳴器部分在單片機檢測到液位超限是由單片機驅動實現聲音報警。
6.單片機對液位數據處理后輸出,送給相應芯片控制LED動態顯示。

傳感器電路的設計

  由于我們在設計的過程中未接觸到實際傳感器,在protues仿真軟件中采用電位器模擬的辦法,因此我們只是了解了傳感器的原理。傳感器電路設計部分并未實現。

本系統經過采用AD0809芯片,其中11腳為電源端,最主要的6腳START,啟動控制端口,高電平有效,EOC連接51單片機的終端輸入端,觸發中斷的信號。9腳是輸出時能端,電路圖中可以看出它是由P2.6控制的。10腳為時鐘接口,12,16分別為參考正,參考負。26腳為通道0的信號輸入端,23,24,25為通道選擇引腳,22為鎖存使能信號端,下面的八路信號是輸出端,由低到高的對應八位二進制數。13為參考地。 (見附錄電路原理設計圖)         

電路圖可以參見上面的圖2-8,大致控制是通過P0口將段碼送給245增加驅動后,送至LED的A-DP的輸入端,控制顯示的大小。同時通過P2.0,P2.1作為139譯碼器的輸入信號選出一路信號后,作為位碼送至LED的1-4端口,決定哪一位顯示。整個LED顯示電路的控制主要是通過245的使能端控制實現的。至于它的動態顯示,是由于在一個時刻,只能送一個位碼,一個段碼,也就是只能保證一位數字的正確顯示,通過快速的程序循環就實現了動態的顯示過程。

              

BU(P2.5接口)蜂鳴器用于報警。當檢測到液位高于200cm或者低于100cm時,啟動報警裝置。

        


    第六章 系統軟件部分的設計

    系統的硬件確定以后,功能完善的軟件能夠很好的指導和協調硬件的工作,可使系統發揮其最大的作用,并且便利以后的更新換代升級。

     一個完整的系統都離不開對系統狀態的監控,為了更好的協調軟件,硬件各個部分正常工作就必須對整個系統進行嚴密監控。在本系統中定時器T0中斷服務程序擔任數據讀取,處理和輸出顯示任務,每隔一定的時間對A/D轉化進行一次采樣,并進行相應的處理,在經過LED驅動電路來實現液位的顯示。而主程序完成的任務相對簡單,它只是完成初始化和啟動T0定時的工作。

在該系統的軟件部分的設計中,第一部分主要是對流程圖的介紹,第二部分是系統工作程序的編程內容,由于全部編程部分較多,只取最重要的水位檢測主程序段。本程序段主要實現啟動ADC0809轉換器,并從A/D轉換器采集信號的功能。

二 程序清單

#include<reg51.h>
unsigned char A_DV0;                                //A_D轉換得到值
unsigned Hmax,Hmin;                                //上下限值
unsigned char A_DV[4];                               //當前液位值
char T0c=0;
char A;                                             //T0計時次數
void T0Run(void);                                    //T0啟動子程序
void LED(unsigned char A_DV[]);                       //LED顯示子程序
void A_DRun(void);                                   //啟動A_D轉換子程序
void A_DReA_D(void);                                //A_D轉換子程序
int Height;
bit Bjj(int Height,unsigned  Hmax,Hmin);              //數值比較函數
sbit BU=P2^5;
sbit L1=P2^0;
sbit               L2=P2^1;
sbit ST=P2^6;
sbit OE=P2^7;
sbit EOC=P3^2;
main()
    {   
                   BU=0;
         Hmax=200;                              //上限值,根據實際情況設定
         Hmin=100;                              //下限值 ,根據實際情況設定
         T0Run();
                            while(1);
    }
void T0Run(void)                                  //T0啟動子程序
  {
    IE=0x82;                                     //啟動中斷T0  
    TMOD=0x01;                                  //設置T0工作于模式1
    TH0=0xff;                                 
    TL0=0xec;                                     //送入計數初值
    TR0=1;
              ST=0;
              OE=0;                                         //啟動定時器T0
  }
void time0(void) interrupt 1
  {
    TH0=0xff;
              TL0=0xec;                                      //重裝計數初值
    T0c++;
    if(T0c>19)                                      //如果計時20次即1s  
      {      
                 T0c=0;
       A_DRun();                                    //啟動A_D轉換                                                        
       A_DReA_D();
       LED(A_DV);
       Bjj(Height,Hmax,Hmin);
      }
}
void A_DRun(void)                                   //啟動A_D程序
{
                ST=0;
                ST=1;
                ST=0;
}
void A_DReA_D(void)
{   
     int A_DV0;
     while(EOC==0);
              OE=1;
              A_DV0=P1;
              OE=0;                                                                                                                                                                        
     Height=A_DV0;                                                                                                                              //計算A_D轉換值
     A_DV[0]=Height%10;                             //逐位分離液位值
     A_DV[1]=(Height%100)/10;
     A_DV[2]=(Height%1000)/100;
     A_DV[3]=0;
}
void LED(unsigned char A_DV[])                         //LED顯示子程序      
{
  int i,k;
  char a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   
                   //數字零到數字九的共陽極顯示時的七段碼
  char b[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  for(i=0;i<1000;i++)                                                  
              //設定循環次數,使這四位數循環快速顯示,實現長時間的動態顯示
  {

   k=A_DV[3];
   L1=1;
   L2=1;
   A=a[k];
   P0=A;   
                                                     //顯示第3位            
   k=A_DV[0];
   L1=0;
   L2=1;
   A=b[k];  
   P0=A;
                                                     //顯示第2位
   k=A_DV[1];
   L1=1;
   L2=0;
   A=a[k];
   P0=A;
                                                      //顯示第1位
   k=A_DV[2];
   L1=0;
   L2=0;
   A=a[k];
   P0=A;  
}
}
bit Bjj(int Height,unsigned  Hmax,Hmin)               //數值比較函數
{  if(Height>Hmax||Height<Hmin)
     BU=1;
    else BU=0;                   //p2.5接的是蜂鳴器,到有高電平時,蜂鳴器就會響起
     return 1;
}   

            

以上的Word格式文檔51黑下載地址:
單片機51hei設計——液位檢測系統剖析.doc (940 KB, 下載次數: 20)






歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1