<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        單片機驅動ADC0832模數轉換程序

        作者:竹園電科技   來源:本站原創   點擊數:  更新時間:2014年03月18日   【字體:

        ADC0832是美國國家半導體公司生產的一種8位分辨率、雙通道A/D轉換芯片。
        ADC0832具有以下特點:
        8位分辨率;
        雙通道A/D轉換;
        輸入輸出電平與TTL/CMOS相兼容;
        5V電源供電時輸入電壓在0~5V之間;
        工作頻率為250KHZ,轉換時間為32μS;
        一般功耗僅為15mW;
        8P、14P—DIP(雙列直插)、PICC多種封裝;
        商用級芯片溫寬為0°C to +70°C?,工業級芯片溫寬為40℃ to +85℃

              模數轉換芯片是用來模擬信號轉為數字信號以便電腦處理的,可以用來對傳感器的數據進行收集分析。本來想買ADC0809的,它可以對8個模擬量進行采集,假如是一個腳用三個壓力傳感器,那就正好夠用了。這個ADC0832是跟單片機開發板一個淘寶店買的,因為那個淘寶店沒有ADC0809。網上搜了個ADC0832的轉換函數,拼了個程序在開發板的四位數碼管上顯示轉換過來的數據,要注意的是那個顯示函數是調一次只顯示四位數碼管的一位的,所以不能轉換顯示轉換顯示這樣,要轉換,顯示一次二次三次四次,轉換,顯示一次二次三次四次這樣。ADC0832引腳及代碼如下:(一晚沒睡,等下準備回家過清明掃墓去。歸去來兮!問西樓禁煙何處好?綠野晴天道。馬穿楊柳嘶,人倚秋千笑,探鶯花總教春醉倒。)


         


        //頭文件:
        #include <reg51.h>
        #include <intrins.h>
        //變量定義:
        unsigned char ly_dis[4];   //定義顯示緩沖區
        code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//表:共陽數碼管 0-9
        unsigned char l_posit=0; //顯示位置
        //引腳定義: 
        sbit SMG_q = P3^4; //定義數碼管陽級控制腳(千位)
        sbit SMG_b = P3^5; //定義數碼管陽級控制腳(百位)
        sbit SMG_s = P3^7; //定義數碼管陽級控制腳(十位)
        sbit SMG_g = P3^6; //定義數碼管陽級控制腳(個位)

        sbit CS   = P0^5;
        sbit Clk = P0^6;
        sbit DATI = P0^4;
        sbit DATO = P0^4;

        unsigned char dat = 0x00;      //AD值
        unsigned char count = 0x00;      //定時器計數
        unsigned char CH;       //通道變量

        //函數聲明:
        void display(void);//顯示函數,顯示緩沖區內容
        void delay(void);
        //unsigned char GetValue0832(bit Channel);
        unsigned char adc0832(unsigned char CH);

        //主函數,C語言的入口函數:
        void main()
        {
         unsigned int i=0;
         int ltemp;
         while(1)
         {
          if(i==100)
          {
           ltemp=adc0832(1);       //隔時取模數轉換(0~255對應0.00-5.00的電壓)
           ly_dis[0]=ltemp/100;    //顯示百位值
           ltemp=ltemp%100;
           ly_dis[1]=ltemp/10; //顯示 十位值
           ltemp=ltemp%10;
           ly_dis[2]=ltemp/1; //顯示 個位值
           ly_dis[3]=0;  //顯示小數點后一位0
          }
          i++;
          if(i==3000)
           i=0;
          display(); //調用顯示調一次只顯示一位輪流顯示四位
          delay();    
         }
        }

        //顯示函數,參數為顯示內容
        void display()
        {
         P0=0XFF;   //
         switch(l_posit){
         case 0:  //選擇千位數碼管,關閉其它位
          SMG_q=0;
          SMG_b=1;
          SMG_s=1; 
          SMG_g=1;
          P0=table[ly_dis[0]]; //輸出顯示內容
          break;
         case 1:  //選擇百位數碼管,關閉其它位
          SMG_q=1;
          SMG_b=0;
          SMG_s=1; 
          SMG_g=1;
          P0=table[ly_dis[1]];
          break;
         case 2:  //選擇十位數碼管,關閉其它位
          SMG_q=1;
          SMG_b=1;
          SMG_s=0; 
          SMG_g=1;
          P0=table[ly_dis[2]]&0x7f;
          break;
         case 3:  //選擇個位數碼管,關閉其它位
          SMG_q=1;
          SMG_b=1;
          SMG_s=1; 
          SMG_g=0;
          P0=table[ly_dis[3]];
          break;
         }
         l_posit++;  //每調用一次將輪流顯示一位
         if(l_posit>3)
          l_posit=0;
        }

        //延時子函數,短暫延時
        void delay(void){ 
         unsigned char i=10;
         while(i--);
        }

        /****************************************************************************

        函數功能:AD轉換子程序

        入口參數:CH

        出口參數:dat

        ****************************************************************************/

        unsigned char adc0832(unsigned char CH)

        {
              unsigned char i,test,adval;
             adval = 0x00;
             test = 0x00;
             Clk = 0;       //初始化
             DATI = 1;
             _nop_();
             CS = 0;
             _nop_();
             Clk = 1;
             _nop_();

           if ( CH == 0x00 )      //通道選擇
           {
               Clk = 0;
               DATI = 1;      //通道0的第一位
               _nop_();
               Clk = 1;
               _nop_();
               Clk = 0;
               DATI = 0;      //通道0的第二位
               _nop_();
               Clk = 1;
               _nop_();
            }
            else
            {
               Clk = 0;
               DATI = 1;      //通道1的第一位
               _nop_();
               Clk = 1;
               _nop_();
               Clk = 0;
               DATI = 1;      //通道1的第二位
               _nop_();
               Clk = 1;
               _nop_();
            }
              Clk = 0;
              DATI = 1;
            for( i = 0;i < 8;i++ )      //讀取前8位的值
            {
               _nop_();
               adval <<= 1;
               Clk = 1;
               _nop_();
               Clk = 0;
               if (DATO)
                  adval |= 0x01;
              else
                  adval |= 0x00;
            }
              for (i = 0; i < 8; i++)      //讀取后8位的值
              {
                   test >>= 1;
                   if (DATO)
                      test |= 0x80;
                   else
                      test |= 0x00;
                  _nop_();
                  Clk = 1;
                  _nop_();
                  Clk = 0;
              }
              if (adval == test)      //比較前8位與后8位的值,如果不相同舍去。若一直出現顯示為零,請將該行去掉
                   dat = test;
              _nop_();
               CS = 1;        //釋放ADC0832
               DATO = 1;
               Clk = 1;
              return dat;
        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮