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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > DS18B20溫度檢測(cè)調(diào)節(jié)程序(C代碼)

          DS18B20溫度檢測(cè)調(diào)節(jié)程序(C代碼)

          作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò) 收藏
          #include"reg52.h"

          #include"intrins.h"
          #include"absacc.h"
          #define uint unsigned int
          #define uchar unsigned char
          uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽(yáng)管0~9
          uchar code tab_motor_1[]={0x03,0x06,0x0c,0x09}; //電機(jī)正轉(zhuǎn) 向上
          uchar code tab_motor_2[]={0x09,0x0c,0x06,0x03}; //電機(jī)反轉(zhuǎn) 向下

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

          sbit ds18b20_in=P2^4; //溫度傳感器數(shù)據(jù)線位定義
          sbit dht11=P2^2; //溫濕度傳感器 數(shù)據(jù)線位定義
          sbit SPEAKER=P2^3; //報(bào)警器
          //sbit FAN=P2^5; //電風(fēng)扇
          sbit HEATERS=P3^1;
          sbit FAN=P3^0;
          //******************全局變量定義**********************************
          uchar tempL=0,tempH=0; //ds18b20讀取值
          uchar Set_Temp_H=30,Set_Temp_L=24;//溫度邊界值設(shè)定值
          uchar Set_Humi_H,Set_Humi_L;
          uchar Set_Illu_H,Set_Illu_L;
          uchar flag_judge_temp,flag_judge_humi,flag_judge_illu; //標(biāo)志位定義
          float temperature,illumination,humidity; //溫度值、光照值、濕度值?
          //**********************延時(shí)子程序************************
          void delay(uint time)
          {
          uint n=0;
          while(n {n++;}
          return;
          }
          void delay1()
          {
          int k;
          for(k=0;k<600;k++);
          }
          void delay20ms(void) //誤差 0us
          {
          unsigned char a,b;
          for(b=215;b>0;b--)
          for(a=45;a>0;a--);
          _nop_; //if Keil,require use intrins.h
          _nop_; //if Keil,require use intrins.h
          }
          //*******************顯示子程序**************************
          void display(float k)
          {
          int t;
          t=k*100;
          P1=0xfe;
          P0=tab[t/1000];//十位
          delay1();
          P1=0xfd;
          P0=tab[t%1000/100]-0x80;//個(gè)位+小數(shù)點(diǎn)
          delay1();
          P1=0xfb;
          P0=tab[t%100/10];//十分位
          delay1();
          P1=0xf7;
          P0=tab[t%10];//百分位
          delay1();
          P1=0xff;
          }
          //*****************ds18b20的初始化程序*********************
          init_ds18b20()
          {
          uchar x=0;
          ds18b20_in=1; //ds18b20_in先置高
          delay(8);
          ds18b20_in=0; //發(fā)送復(fù)位脈沖
          delay(85); //延時(shí)>480ms
          ds18b20_in=1; //拉高數(shù)據(jù)線
          delay(14); //等待15~60ms
          x=ds18b20_in; //用x的值來(lái)判斷初始化是否成功
          //ds18b20存在的話(huà)x=0,否則x=1
          delay(20);
          }
          /**************************讀取字符子程序******************/
          ReadOneChar()
          {
          uchar i=0; //主機(jī)數(shù)據(jù)線先從高電平拉低1ms以上,在拉高,從而產(chǎn)生讀信號(hào)

          uchar dat=0; //每個(gè)讀取周期最短持續(xù)時(shí)間為60ms,各個(gè)讀取周期之間必須有1ms以上的高電平恢復(fù)??

          for(i=8;i>0;i--) //一個(gè)字節(jié)8位
          {
          ds18b20_in=1;delay(1);
          ds18b20_in=0;dat>>=1;ds18b20_in=1;
          if(ds18b20_in)
          dat|=0x80;
          delay(4);
          }
          return(dat);
          }
          //****************向?qū)懸粋€(gè)字節(jié)子程序*********************/
          WriteOneChar(uchar dat)
          {
          uchar i; //數(shù)據(jù)從高電平拉至低電平,產(chǎn)生寫(xiě)起始信號(hào)
          for(i=8;i>0;i--)
          {
          ds18b20_in=0;
          ds18b20_in=dat&0x01;
          delay(5);
          ds18b20_in=1;
          dat>>=1;
          }
          delay(4);
          }
          /*********************************************************
          向ds18b20度溫度值
          出口參數(shù)temprature
          *********************************************************/
          ReadTemperature()
          {
          init_ds18b20(); //初始化
          WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作
          WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
          delay(125); //轉(zhuǎn)換延時(shí)
          init_ds18b20(); //初始化
          WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作
          WriteOneChar(0xbe); //讀溫度寄存器(頭兩個(gè)值分別是溫度的低位和高位)
          tempL=ReadOneChar(); //讀出溫度的低位LSB
          tempH=ReadOneChar(); //讀出高位的高位MSB
          //tempL=0X91;tempH=0X01;
          if(tempH&0x80)
          temperature=(~((tempH*256)+tempL)+1)*0.0625; //零度以下
          //溫度轉(zhuǎn)換,把高位低位做相應(yīng)的運(yùn)算轉(zhuǎn)換為實(shí)際的溫度
          else
          temperature=((tempH*256)+tempL)*0.0625; //零度以上
          delay(200);
          return(temperature);
          }
          //*************************************************************************************************************************************
          //**************報(bào)警子程序****************
          sounder_H()
          {

          SPEAKER=1;
          delay1();delay1();delay1();
          SPEAKER=0;
          }
          sounder_L() //蜂鳴器 低電平響
          {

          SPEAKER=1;
          delay1();delay1();delay1();
          delay1();delay1();delay1();
          delay1();delay1();delay1();
          delay1();delay1();delay1();
          SPEAKER=0;
          }
          //*************步進(jìn)電機(jī)子程序**************
          void motor_up()
          {
          int m,n;
          for(m=0;m<24;m++)
          for(n=0;n<4;n++)
          { P3=tab_motor_1[n];delay20ms();}
          }
          void motor_down()
          {
          int m,n;
          for(m=0;m<288;m++)
          for(n=0;n<4;n++)
          { P3=tab_motor_2[n];delay20ms();}
          }
          /*************電風(fēng)扇開(kāi)啟子程序 **************
          **************由直流電機(jī) 控制 *************/
          void fan()
          {
          FAN=0; //開(kāi)啟繼電器 打開(kāi)電動(dòng)機(jī)
          }
          //**************加熱器*********************
          void heaters()
          {
          HEATERS=0;
          }

          /*************溫度判斷***************
          正常返回“1 否則返回0?
          *************************************/
          judge_temp(float i)
          {
          int k;
          k=(int)(i*100);
          if( k<=Set_Temp_H*100 && k>=Set_Temp_L*100 ) //正常范圍內(nèi)
          { return 1;}
          if(k {
          flag_judge_temp=0; return 0;}
          else
          {
          flag_judge_temp=1; return 0;} //高于最大值
          }
          /*************濕度判斷***************
          正常返回“1 否則返回0
          *************************************/
          judge_humi(float ii)
          {}
          /*************光照判斷***************
          正常返回“1 否則返回0
          *************************************/
          judge_illu(float iii)
          {}


          //********************主程序****************
          void main()
          {
          float i;
          while(1)
          {
          i=ReadTemperature();
          display(i);

          /**********判斷******/
          {
          if(!judge_temp(i))
          {
          if(flag_judge_temp) //溫度高
          {sounder_H(); fan();HEATERS=1;//motor_up();
          }
          else
          {sounder_L(); heaters();FAN=1;//motor_down();
          } //溫度低
          }
          else {SPEAKER=1;FAN=1;HEATERS=1;}//關(guān)閉相應(yīng)調(diào)節(jié)功能
          }

          /*********處理**********/
          }
          }



          評(píng)論


          技術(shù)專(zhuān)區(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); })();