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

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

        基于51單片機的DS18B20溫度傳感器驅動程序加詳解

        作者:佚名   來源:不詳   點擊數:  更新時間:2014年08月17日   【字體:

          

        //此部分為18B20的驅動程序
         
        //本程序驗證通過,晶振為12MHz
         
        #include <reg52.H>
        #include <intrins.h>
         
        sbit    D18B20=P3^7;    //DQ接P3^7
        #define  NOP()   _nop_()  
        #define  _Nop()  _nop_() 
         
        void TempDelay (unsigned char idata us);  //延時函數定義
        void Init18b20 (void);                   //初始化函數定義
        void WriteByte (unsigned char idata wr);  //單字節寫入
        void read_bytes (unsigned char idata j);  //定義多字節數據讀取
         
        unsigned char CRC (unsigned char j);//定義校驗碼數組
        void GemTemp (void);                //數據處理
        void Config18b20 (void);    //配置上下限即處理位數(9/10/11)
         
        void ReadID (void);         //讀取器件ID,即ROM中的數據
        void TemperatuerResult(void); //最終數據輸出
         
         
        //bit  flag;
        unsigned int  idata Temperature,D[10]; //定義溫度數組
        unsigned char idata temp_buff[9];      //定義RAM數據暫存數組
        //存儲讀取的字節,read scratchpad為9字節,read rom ID為8字節
        unsigned char idata id_buff[8];    //定義ROM數據暫存數組
        unsigned char idata *p,TIM;        //指針變量
        unsigned char idata crc_data;      //CRC計算變量定義
         
         
        unsigned char code CrcTable [256]={
        0,  94, 188,  226,  97,  63,  221,  131,  194,  156,  126,  32,  163,  253,  31,  65,
        157,  195,  33,  127,  252,  162,  64,  30,  95,  1,  227,  189,  62,  96,  130,  220,
        35,  125,  159,  193,  66,  28,  254,  160,  225,  191,  93,  3,  128,  222,  60,  98,
        190,  224,  2,  92,  223,  129,  99,  61,  124,  34,  192,  158,  29,  67,  161,  255,
        70,  24,  250,  164,  39,  121,  155,  197,  132,  218,  56,  102,  229,  187,  89,  7,
        219,  133, 103,  57,  186,  228,  6,  88,  25,  71,  165,  251,  120,  38,  196,  154,
        101,  59, 217,  135,  4,  90,  184,  230,  167,  249,  27,  69,  198,  152,  122,  36,
        248,  166, 68,  26,  153,  199,  37,  123,  58,  100,  134,  216,  91,  5,  231,  185,
        140,  210, 48,  110,  237,  179,  81,  15,  78,  16,  242,  172,  47,  113,  147,  205,
        17,  79,  173,  243,  112,  46,  204,  146,  211,  141,  111,  49,  178,  236,  14,  80,
        175,  241, 19,  77,  206,  144,  114,  44,  109,  51,  209,  143,  12,  82,  176,  238,
        50,  108,  142,  208,  83,  13,  239,  177,  240,  174,  76,  18,  145,  207,  45,  115,
        202,  148, 118,  40,  171,  245,  23,  73,  8,  86,  180,  234,  105,  55,  213, 139,
        87,  9,  235,  181,  54,  104,  138,  212,  149,  203,  41,  119,  244,  170,  72,  22,
        233,  183,  85,  11,  136,  214,  52,  106,  43,  117,  151,  201,  74,  20,  246,  168,
        116,  42,  200,  150,  21,  75,  169,  247,  182,  232,  10,  84,  215,  137,  107,  53};
        //CRC數據表
         
        //Function:延時處理
         
        void TempDelay (unsigned char idata us)
        {
         while(us--);
        }
         
         
        //Function:18B20初始化
         
        void Init18b20 (void)
        {
         D18B20=1;  //偵測到下跳沿,初始化
         _nop_();
         D18B20=0;
         TempDelay(160);   //delay480 us  (480)
         _nop_();
         D18B20=1;   //釋放總線
         TempDelay(30);   //delay 96 us (60-112)
         _nop_();
         _nop_();
         _nop_(); //18B20偵測到此上升沿,會自動應答
            //發送presence信號
        //if(D18B20==0)
         // flag = 1;   //detect 1820 success!
         //else
         // flag = 0;    //detect 1820 fail!
         TempDelay(30);       //delay 96 us(60-240)
         _nop_();    //發送應答脈沖
         _nop_();
         D18B20 = 1;   //釋放總線
        }
         
         
        //Function:向18B20寫入一個字節
         
        void WriteByte (unsigned char idata wr)  //單字節寫入
        {
         unsigned char idata i;
         for (i=0;i<8;i++)
         {
          D18B20 = 1;
             _nop_();
          D18B20 = 0;   //偵測到下跳沿,初始化
          _nop_();
          D18B20=wr&0x01;   //寫數據在(60-120)us內
          TempDelay(30);   //delay 96(60-120)us
          _nop_();
          _nop_();   //至少大于1us恢復時間
          D18B20=1;   //釋放總線
          wr >>= 1;   //一個字節8位,總共寫8次
         }
        }
         
         
        //Function:讀18B20的一個字節
         
        unsigned char ReadByte (void)     //讀取單字節
        {
         unsigned char idata i,u=0;
         for(i=0;i<8;i++)
         {
          D18B20 = 1;
             _nop_();
          D18B20 = 0;  //負跳沿,初始化
          u >>= 1;
          D18B20 = 1;   //釋放總線
          if(D18B20==1)
          u |= 0x80;
          TempDelay (3); //15us內采樣
          _nop_();
         }
         return(u);
        }
         
         
        //Function:讀18B20
         
        void read_bytes (unsigned char idata j)
        {
          unsigned char idata i;
          for(i=0;i<j;i++)
          {
            *p = ReadByte();
            p++;
          }
        }
         
         
        //Function:CRC校驗
         
        unsigned char CRC (unsigned char j)
        {
            unsigned char idata i,crc_data=0;
           for(i=0;i<j;i++)  //查表校驗
            crc_data = CrcTable[crc_data^temp_buff[i]];
            return (crc_data);//返回i=8時的crc_data
        }//若為0,校驗正確,即此時的temp_buff[8]=0x00;
         
         
        //Function:讀取溫度
         
        void GemTemp (void)
        {
           read_bytes (9);
           if (CRC(9)==0) //校驗正確
           { //暫存器第0字節低8位,第一字節為高8位。
             Temperature = temp_buff[1]*0x100 + temp_buff[0];
        //     Temperature *= 0.625;
          Temperature /= 16; //轉換成10進制
          TempDelay(1);
            }
        }
         
         
        //Function:內部配置
         
        void Config18b20 (void)  //重新配置報警限定值和分辨率
        {
             Init18b20();
             WriteByte(0xcc);  //skip rom
             WriteByte(0x4e);  //配置暫存器2,3,4字節數據
             WriteByte(0x19);  //上限
             WriteByte(0x1a);  //下限
             WriteByte(0x7f);     //set 11 bit (0.125)
             Init18b20();
             WriteByte(0xcc);  //skip rom
             WriteByte(0x48);  //保存設定值
             Init18b20();
             WriteByte(0xcc);  //skip rom
             WriteByte(0xb8);  //回調設定值
        }
         
         
        //Function:讀18B20ID
         
        void ReadID (void)//讀取器件 id
        {
         Init18b20();
         WriteByte(0x33);  //read rom
         read_bytes(8);
        }
         
         
        //Function:18B20ID全處理
         
        void TemperatuerResult(void)
        {
           p = id_buff;
           ReadID();    //讀取器件ID
           Config18b20(); //ROM配置
         Init18b20 (); //初始化
         WriteByte(0xcc);   //單點檢測,跳過ROM檢索
         WriteByte(0x44);   //啟用溫度轉換
         
         Init18b20 ();
         WriteByte(0xcc);   //單點檢測,跳過ROM檢索
         WriteByte(0xbe);   //讀取暫存器的全部內容
         p = temp_buff;
         GemTemp();
        }
         
        unsigned int TempTick=0;
        void GetTemp()
        {      
             if(TIM==1)
         {  TIM=0;
            TemperatuerResult();
         //  D[5]=Temperature;
         }
         
        }
         
        //刷新時間
         
        void T1zd(void) interrupt 3
        {
           TH1 = 0xfe;       TL1 = 0x33;
           TIM++;
         
        }
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮