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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > #單片機#ds18b20 單位轉(zhuǎn)換 30度報警

          #單片機#ds18b20 單位轉(zhuǎn)換 30度報警

          作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
          #include"reg52.h"
          #define uchar unsigned char
          #define uint unsigned int
          sbit DSPORT=P3^7;
          sbit key3 = P3^2;
          sbit beep = P1^0;
          uchar flag;
          int tmp;
          float t;
          uint warn_d = 300; //溫度上限值,溫度為乘10之后的值
          uchar code table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
          0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
          void Delay1ms(unsigned int y)
          {
          unsigned int x;
          for(y;y>0;y--)
          for(x=110;x>0;x--);
          }
          unsigned char Ds18b20Init()
          {
          unsigned int i;
          DSPORT=0; //將總線拉低480us~960us
          i=70;
          while(i--);//延時642us
          DSPORT=1;//然后拉高總線,如果DS18B20做出反應(yīng)會將在15us~60us后總線拉低
          i=0;
          while(DSPORT)//等待DS18B20拉低總線
          {
          i ;
          if(i>5000)//等待>5MS
          return 0;//初始化失敗
          }
          return 1;//初始化成功
          }
          void Ds18b20WriteByte(unsigned char dat)
          {
          unsigned int i,j;
          for(j=0;j<8;j )
          {
          DSPORT=0;//每寫入一位數(shù)據(jù)之前先把總線拉低1us
          i ;
          DSPORT=dat&0x01; //然后寫入一個數(shù)據(jù),從最低位開始
          i=6;
          while(i--); //延時68us,持續(xù)時間最少60us
          DSPORT=1;//然后釋放總線,至少1us給總線恢復(fù)時間才能接著寫入第二個數(shù)值
          dat>>=1;
          }
          }
          unsigned char Ds18b20ReadByte()
          {
          unsigned char byte,bi;
          unsigned int i,j;
          for(j=8;j>0;j--)
          {
          DSPORT=0;//先將總線拉低1us
          i ;
          DSPORT=1;//然后釋放總線
          i ;
          i ;//延時6us等待數(shù)據(jù)穩(wěn)定
          bi=DSPORT; //讀取數(shù)據(jù),從最低位開始讀取
          byte=(byte>>1)|(bi<<7);
          i=4;//讀取完之后等待48us再接著讀取下一個數(shù)
          while(i--);
          }
          return byte;
          }
          void Ds18b20ChangTemp()
          {
          Ds18b20Init();
          Delay1ms(1);
          Ds18b20WriteByte(0xcc);//跳過ROM操作命令
          Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
          }
          void Ds18b20ReadTempCom()
          {
          Ds18b20Init();
          Delay1ms(1);
          Ds18b20WriteByte(0xcc); //跳過ROM操作命令
          Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
          }
          int Ds18b20ReadTemp()
          {
          int temp=0;
          unsigned char tmh,tml;
          Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
          Ds18b20ReadTempCom();//然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
          tml=Ds18b20ReadByte();//讀取溫度值共16位,先讀低字節(jié)
          tmh=Ds18b20ReadByte();//再讀高字節(jié)
          temp=tmh;
          temp<<=8;
          temp|=tml;
          return temp;
          }
          void Display(int temp) //顯示
          {
          unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
          float tp;
          if(temp< 0)//當(dāng)溫度值為負(fù)數(shù)
          {
          //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
          temp=temp-1;
          temp=~temp;
          tp=temp;
          temp=tp*0.0625*10 0.5;
          //留兩個小數(shù)點就*100, 0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
          //后面的數(shù)自動去掉,不管是否大于0.5,而 0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
          //算加上0.5,還是在小數(shù)點后面。
          }
          else
          {
          tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
          //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
          temp=tp*0.0625*10 0.5;
          //留兩個小數(shù)點就*100, 0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
          //后面的數(shù)自動去掉,不管是否大于0.5,而 0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
          //算加上0.5,還是在小數(shù)點后面。
          }
          datas[0] = temp / 100;
          datas= temp % 100 / 10;
          datas= temp % 10;
          P0=0xff;
          P0 = table[datas[0]];
          P2 = 0xfd;
          Delay1ms(1);
          P0=0xff;
          P0 = table[datas] & 0x7f;
          P2 = 0xfb;
          Delay1ms(1);
          P0=0xff;
          P0 = table[datas];
          P2 = 0xf7;
          Delay1ms(1);
          }
          void Exter_Init()
          {
          EX0=1; //打開外部中斷
          EA=1; //打開總中斷
          IT0=0; //低電平觸發(fā)
          EX0 = 1;
          IT0 = 1;
          }
          void main()
          {
          Exter_Init();
          beep = 1;
          while(1)
          {
          if(flag%2 == 1)//奇數(shù)次按鍵,顯示華氏度
          {
          t = Ds18b20ReadTemp(); //華氏度=(攝氏度*9)/5 32
          t = t*0.0625*10 0.5;
          tmp = t*1.8 320;
          P0=0xff;
          P0 = table[15];
          P2 = 0xfe;
          Delay1ms(1);
          P0=0xff;
          P0 = table[tmp/100];
          P2 = 0xfd;
          Delay1ms(1);
          P0=0xff;
          P0 = table[tmp0/10] & 0x7f;
          P2 = 0xfb;
          Delay1ms(1);
          P0=0xff;
          P0 = table[tmp];
          P2 = 0xf7;
          Delay1ms(1);
          }
          else //偶數(shù)次按鍵,顯示攝氏度
          {
          t = Ds18b20ReadTemp();
          tmp = t*0.0625*10 0.5;
          Display(Ds18b20ReadTemp());
          if(tmp >= warn_d)//若溫度超限,蜂鳴器報警
          {
          beep = 0;
          Delay1ms(1);
          beep = 1;
          Delay1ms(1);
          }
          else beep = 1;
          }
          }
          }
          void exter0() interrupt 0
          {
          Delay1ms(5);//消抖
          while(!key3);
          flag ;
          }


          評論


          技術(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); })();