<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 溫度傳感器18B20的驅動程序

          溫度傳感器18B20的驅動程序

          作者: 時間:2016-11-26 來源:網絡 收藏
          以下綠色文字都是18B20驅動程序的驅動程序,學習時不必每句都看懂,只需要知道每個函數(shù)的作用已利于以后調用!調用的方法在最后黑體字那里加以體會即可!

          學習方法:

          本文引用地址:http://www.ex-cimer.com/article/201611/321641.htm

          越是看似高級、復雜的器件,都會有自己的驅動程序往往由生產廠家提供!所以在后期提高階段要聯(lián)系如何使用這些驅動函數(shù)!就像是以后學習高一級的ARM系統(tǒng)時,那都是有自己的庫函數(shù)的,使用時改變參數(shù)而已(當然從表面來講)!后期價已熟練即可

          bitflag;
          unsigned intidata Temperature;
          unsigned char idata temp_buff[9]; //存儲讀取的字節(jié),read scratchpad為9字節(jié),read rom ID為8字節(jié)
          unsigned char idata id_buff[8];
          unsigned char idata *p,TIM;
          unsigned char idata crc_data;


          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
          };
          //

          void TempDelay (unsigned char idata us)
          {
          while(us--);
          }


          void Init18b20 (void)
          {
          D18B20=1;
          _nop_();
          D18B20=0;
          TempDelay(80);//delay 530 uS//80
          _nop_();
          D18B20=1;
          TempDelay(14);//delay 100 uS//14
          _nop_();
          _nop_();
          _nop_();

          if(D18B20==0)
          flag = 1;//detect 1820 success!
          else
          flag = 0;//detect 1820 fail!
          TempDelay(20);//20
          _nop_();
          _nop_();
          D18B20 = 1;
          }


          void WriteByte (unsigned char idata wr)//單字節(jié)寫入
          {
          unsigned char idata i;
          for (i=0;i<8;i++)
          {
          D18B20 = 0;
          _nop_();
          D18B20=wr&0x01;
          TempDelay(3);//delay 45 uS //5
          _nop_();
          _nop_();
          D18B20=1;
          wr >>= 1;
          }
          }


          unsigned char ReadByte (void)//讀取單字節(jié)
          {
          unsigned char idata i,u=0;
          for(i=0;i<8;i++)
          {
          D18B20 = 0;
          u >>= 1;
          D18B20 = 1;
          if(D18B20==1)
          u |= 0x80;
          TempDelay (2);
          _nop_();
          }
          return(u);
          }


          void read_bytes (unsigned char idata j)
          {
          unsigned char idata i;
          for(i=0;i{
          *p = ReadByte();
          p++;
          }
          }


          unsigned char CRC (unsigned char j)
          {
          unsigned char idata i,crc_data=0;
          for(i=0;i//查表校驗
          crc_data = CrcTable[crc_data^temp_buff[i]];
          return (crc_data);
          }


          void GemTemp (void)
          {
          read_bytes (9);
          if (CRC(9)==0) //校驗正確
          {
          Temperature = temp_buff[1]*0x100 + temp_buff[0];
          //Temperature *= 0.625;
          Temperature /= 16;
          TempDelay(1);
          }
          }


          void Config18b20 (void)//重新配置報警限定值和分辨率
          {
          Init18b20();
          WriteByte(0xcc);//skip rom
          WriteByte(0x4e);//write scratchpad
          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);//回調設定值
          }


          void ReadID (void)//讀取器件 id
          {
          Init18b20();
          WriteByte(0x33);//read rom
          read_bytes(8);
          }


          void TemperatuerResult(void)
          {
          p = id_buff;
          ReadID();
          Config18b20();
          Init18b20 ();
          WriteByte(0xcc);//skip rom
          WriteByte(0x44);//Temperature convert

          Init18b20 ();
          WriteByte(0xcc);//skip rom
          WriteByte(0xbe);//read Temperature
          p = temp_buff;
          GemTemp();
          }

          void GetTemp()
          {
          if(TIM==100) //每隔 1000ms 讀取溫度
          {TIM=0;
          TemperatuerResult();
          }

          }


          void T1zd(void) interrupt 3
          {
          TH1 = 0xD8;//10
          TL1 = 0xF0;
          TIM++;

          }
          #include
          #include "tem.H"
          extern GetTemp();//聲明引用外部函數(shù)
          extern unsigned intidata Temperature;// 聲明引用外部變量
          void delay(unsigned int i);

          //else IO
          sbitLS138A=P2^2;//管腳定義
          sbitLS138B=P2^3;
          sbitLS138C=P2^4;


          //此表為 LED 的字模, 共陰數(shù)碼管 0-9-
          unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
          unsigned longLedOut[5],LedNumVal;


          void system_Ini()
          {
          TMOD|= 0x11;
          TH1 = 0xD8;//10
          TL1 = 0xF0;
          IE = 0x8A;
          TR1= 1;

          }

          main()
          { unsigned char i;
          system_Ini();
          while(1)
          {
          GetTemp();


          LedNumVal=Temperature;//把實際溫度送到LedNumVal變量中
          LedOut[0]=Disp_Tab[LedNumVal000/1000];
          LedOut[1]=Disp_Tab[LedNumVal00/100];
          LedOut[2]=Disp_Tab[LedNumVal0/10];//十位
          LedOut[3]=Disp_Tab[LedNumVal];//個位

          for(i=0; i<4; i++)
          {
          P0 = LedOut[i] ;

          switch(i)
          {//138譯碼
          case 0:LS138A=0; LS138B=0; LS138C=0; break;
          case 1:LS138A=1; LS138B=0; LS138C=0; break;
          case 2:LS138A=0; LS138B=1; LS138C=0; break;
          case 3:LS138A=1; LS138B=1; LS138C=0; break;
          }

          delay(100);
          }

          P0 = 0;

          }
          }

          //延時程序
          void delay(unsigned int i)
          {
          char j;
          for(i; i > 0; i--)
          for(j = 200; j > 0; j--);
          }



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();