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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > DS18B20溫度傳感器64位ROM地址讀?。⊿TC89C52)

          DS18B20溫度傳感器64位ROM地址讀?。⊿TC89C52)

          作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
          最近在做一個溫度監(jiān)測系統(tǒng),采用DS18B20數(shù)字溫度傳感器,要用到64位ROM地址匹配,在網(wǎng)上查了一些資料,編寫了DS18b20的64位ROM地址讀取的程序,LCD1602顯示。分享給大家,有什么不足請大家留言。

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

          程序代碼:

          #include

          #defineucharunsignedchar

          #defineuintunsignedint

          sbitlcdrw=P1^1;//LCD1602讀/寫選擇H/L

          sbitlcdrs=P1^0;//LCD1602數(shù)據(jù)/命令選擇H/L

          sbitlcden=P2^5;//LCD1602使能

          sbitds=P2^2;//溫度傳感器信號線

          ucharcodetable[]="NO.1:.C";

          ucharcodetable1[]="";

          uchardatafCode[8];

          inttemp;//整型溫度數(shù)據(jù)

          floatf_temp;//浮點型溫度數(shù)據(jù)

          uchartflag;//溫度正負(fù)標(biāo)志

          //*****************LCD1602*******************************

          voiddelay(uintz)//延時函數(shù)延時z毫秒

          {

          uintx,y;

          for(x=z;x>0;x--)

          for(y=110;y>0;y--);

          }

          voidwrite_com(ucharcom)//lcd1602寫指令

          {

          lcdrs=0;

          P0=com;

          delay(5);

          lcden=1;

          delay(5);

          lcden=0;

          }//lcd1602寫數(shù)據(jù)

          voidwrite_date(uchardate)

          {

          lcdrs=1;

          P0=date;

          delay(5);

          lcden=1;

          delay(5);

          lcden=0;

          }

          voidinit1602()//初始化LCD1602

          {

          uchari;

          lcdrw=0;

          lcden=0;

          write_com(0x38);

          write_com(0x0c);

          write_com(0x06);

          write_com(0x01);

          write_com(0x80);

          for(i=0;i<13;i++)

          {

          write_date(table[i]);

          delay(5);

          }

          write_com(0x80+0x40);

          for(i=0;i<13;i++)

          {

          write_date(table1[i]);

          delay(5);

          }

          write_com(0x80+11);

          write_date(0xdf);

          write_com(0x80+0x40+11);

          write_date(0xdf);

          }

          //*******************DS18B20****************************

          voiddsreset()//DS18B20復(fù)位,初始化函數(shù)

          {

          uinti;

          ds=0;

          i=103;

          while(i>0)

          i--;

          ds=1;

          i=4;

          while(i>0)

          i--;

          }

          bittempreadbit()//讀一位數(shù)據(jù)函數(shù)

          {

          uinti;

          bitdat;

          ds=0;

          i++;

          ds=1;

          i++;

          i++;

          dat=ds;

          i=8;

          while(i>0)

          i--;

          returndat;

          }

          uchartempread()//讀一字節(jié)數(shù)據(jù)函數(shù)

          {

          uchari,j,dat;

          dat=0;

          for(i=1;i<=8;i++)

          {

          j=tempreadbit();

          dat=(j<<7)|(dat>>1);

          }

          returndat;

          }

          voidtempwrite(uchardat)//向DS18B20寫一字節(jié)數(shù)據(jù)函數(shù)

          {

          uinti;

          ucharj;

          bittestb;

          for(j=1;j<=8;j++)

          {

          testb=dat&0x01;

          dat=dat>>1;

          if(testb)//寫1

          {

          ds=0;

          i++;i++;

          ds=1;

          i=8;

          while(i>0)

          i--;

          }

          else//寫0

          {

          ds=0;

          i=8;

          while(i>0)

          i--;

          ds=1;

          i++;i++;

          }

          }

          }

          voidtempchange()//DS18B20開始獲取溫度并轉(zhuǎn)換

          {

          dsreset();

          delay(1);

          tempwrite(0xcc);//寫跳過讀ROM指令

          tempwrite(0x44);//寫溫度轉(zhuǎn)換指令

          }

          uintget_temp()

          {

          uchara,b;

          dsreset();

          delay(1);

          tempwrite(0xcc);//寫“跳過讀ROM”指令

          tempwrite(0xbe);//寫“讀內(nèi)部RAM中9字節(jié)的溫度數(shù)據(jù)”指令

          a=tempread();//讀高8位

          b=tempread();//讀低8位

          temp=b;

          temp<<=8;

          temp=temp|a;//兩個字節(jié)合為一個字節(jié)

          if(temp<0x0fff)

          tflag=0;//正值標(biāo)識符

          else

          {

          temp=~temp+1;

          tflag=1;//負(fù)值標(biāo)識符

          }

          f_temp=temp*0.0625;//溫度在寄存器中為12位,分辨路為0.0625

          temp=f_temp*10+0.5;//乘以10表示小數(shù)點后面只取一位,加0.5是四舍五入

          //f_temp=f_temp+0.05;

          returntemp;//temp是整型

          }

          voidwrite_wendu(ucharaddress,uchardate)//寫溫度

          {

          write_com(address);

          write_date(date);

          }

          voiddisplay()//顯示函數(shù)

          {

          uintw1,w2,w3,w4;

          w1=get_temp()/1000;//百位

          w2=get_temp()00/100;//十位

          w3=get_temp()0/10;//個位

          w4=get_temp();//小數(shù)點位

          if(tflag==0)

          write_wendu(0x80+5,0x20);//不顯示正號

          else

          write_wendu(0x80+5,0x2d);//顯示負(fù)號

          if(w1==0)

          {

          write_wendu(0x80+6,0x20);//百位為0,不顯示

          if((w1==0)&&(w2==0))

          write_wendu(0x80+7,0x20);//百位,十位都為0,不顯示

          else

          write_wendu(0x80+7,0x30+w2);

          write_wendu(0x80+8,0x30+w3);

          write_wendu(0x80+10,0x30+w4);

          }

          else

          {

          write_wendu(0x80+6,0x30+w1);

          write_wendu(0x80+7,0x30+w2);

          write_wendu(0x80+8,0x30+w3);

          write_wendu(0x80+10,0x30+w4);

          }

          }

          voidDispCode()//讀取ROM

          {

          uinti,xulie;

          dsreset();

          delay(1);

          tempwrite(0x33);

          for(i=0;i<8;i++)

          {

          fCode[i]=tempread();

          }

          write_com(0x80+0x40);

          for(i=0;i<8;i++)

          {

          xulie=fCode[i]>>4;//顯示高四位

          xulie=xulie*1.0;

          if(xulie<10)

          write_date(0x30+xulie);

          else

          write_date(0x37+xulie);

          xulie=fCode[i]&0x0f;//顯示低四位

          xulie=xulie*1.0;

          if(xulie<10)

          write_date(0x30+xulie);

          else

          write_date(0x37+xulie);

          }

          }

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

          voidmain()//主函數(shù)

          {

          init1602();

          DispCode();

          while(1)

          {//searchrom();

          tempchange();

          display();

          }

          }



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁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); })();