<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多點(diǎn)溫度檢測(cè)系統(tǒng)

          DS18B20多點(diǎn)溫度檢測(cè)系統(tǒng)

          作者: 時(shí)間:2018-08-01 來(lái)源:網(wǎng)絡(luò) 收藏

          本文為DS18B20多點(diǎn)系統(tǒng)設(shè)計(jì)程序

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

          #include

          #include //_nop_();延時(shí)函數(shù)用

          #define uchar unsigned char

          #define uint unsigned int

          //********************** DS18B20 指令********************* *********

          #define ds18B20_READ_ROM 0x33 // 讀ROM指令

          #define ds18B20_MATCH_ROM 0x55 // 匹配ROM指令

          #define ds18B20_SKIP_ROM 0xCC // 跳過(guò)ROM指令

          #define ds18B20_SEARCH_ROM 0xF0 // 搜索ROM指令

          #define ds18B20_ALARM_SEARCH 0xEC // 報(bào)警搜索指令

          #define ds18B20_WRITE_SCRATCHPAD 0x4E // 寫暫存寄存器指令

          #define ds18B20_READ_SCRATCHPAD 0xBE // 讀暫存寄存器指令

          #define ds18B20_COPY_SCRATCHPAD 0x48 // 復(fù)制暫存寄存器指令

          #define ds18B20_CONVERT_T 0x44 // 啟動(dòng)溫度轉(zhuǎn)換指令

          #define ds18B20_RECALL_E2 0xB8 // 重新調(diào)出E2PROM的數(shù)據(jù)

          sbit DQ=P0^7; //將P0.7口模擬時(shí)鐘數(shù)據(jù)口

          bit flag=0;

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

          溫 度小數(shù)部分用查表法

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

          uchar code ditab[16]=

          {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

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

          延 時(shí)函數(shù)

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

          void delay_us(unsigned int us)

          {

          unsigned int i;

          us=us/7; //1/7是STC89C58在22.1184MHz晶振

          for( i=0;i }

          void delay_ms(unsigned int ms)

          {

          unsigned int i,j;

          for( i=0;i for(j=0;j332;j++); //332是STC89C58在22.1184MHz晶振

          }

          /***********讀出溫度函數(shù)************

          輸 入:無(wú)

          輸出:zs+xs,格式為123.4

          即為浮點(diǎn)型數(shù)的溫度格式

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

          /***********18B20 復(fù)位函數(shù)**********/

          void Init18b20 (void)

          {

          DQ=1;;_nop_();_nop_();

          DQ=0; delay_us(600); //要大于480us,小于960us

          DQ=1;delay_us(60); //要大于15us-- 60us

          if(DQ==0)

          flag = 1; //detect 1820 success!

          else

          flag = 0; //detect 1820 fail!

          delay_us(200); //要大于60us,小于 240us

          DQ = 1;

          }

          /**********18B20寫命令函數(shù)*********

          向 1-WIRE 總線上寫一個(gè)字節(jié)

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

          void write_byte(uchar val)

          {

          uchar i;

          for (i=8; i>0; i--)

          {

          DQ=1;_nop_();_nop_();

          DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us

          DQ = val0x01; //最低位移出

          delay_us(60); //66us

          val=val>>1; //右移一位

          }

          DQ = 1;

          delay_us(10);

          }

          /*********18B20讀1個(gè)字節(jié) 函數(shù)********

          從總線上讀取一個(gè)字節(jié)

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

          uchar read_byte(void)

          {

          uchar i;

          uchar value = 0;

          for (i=8;i>0;i--)

          {

          DQ=1;_nop_();_nop_();

          value>>=1;

          DQ = 0;_nop_();_nop_();_nop_();_nop_(); //4us

          DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us

          if(DQ)value|=0x80;

          delay_us(60); //60us

          }

          DQ=1;

          delay_us(10);

          return(value);

          }

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

          串 口中斷服務(wù)子程序

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

          static void com_int(void) interrupt 4

          {

          if (RI)

          {

          RI = 0;

          if (SBUF == 0x0d)

          {

          ISP_CONTR = 0x60; // 軟復(fù)位到ISP區(qū)

          }

          }

          }

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

          串口發(fā)送一個(gè)字符

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

          void com_send_dat( unsigned char dat)

          {

          SBUF=dat;

          while (TI== 0);

          TI= 0 ;

          }

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

          串口初始化

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

          void init_com( void )

          {

          SCON=0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr //UART為模式1,8位數(shù)據(jù),允許接收

          TMOD|=0x20 ; //TMOD: timer 1, mode 2, 8-bit reload //定時(shí)器1為模式2,8位自動(dòng)重裝

          TH1=0xfa ; //Baud:19200 fosc=22.1184MHz

          TL1=0xfa;

          PCON|=0x80; //SMOD=1;波特率加倍;

          ES=1; //Enable Serial Interrupt

          TR1 = 1 ; // timer 1 run

          }

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

          搜索DS18B2064位ROM

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

          uchar search_rom(uchar *p)

          {

          uchar dat,i,j,k,n,value,number=1,number_temp=1,clash_number=0;

          bit clash_flag=0;

          for(n=0;n {

          flag=0;

          while(!flag)Init18b20(); // 復(fù)位ds18b20

          write_byte(ds18B20_SEARCH_ROM); //搜索ROM命令

          for(i=0; i8;i++) //8個(gè)字節(jié)第ROM

          {

          dat=0;

          for(j=0;j8; j++) //8位數(shù)據(jù)

          {

          value=0;

          for(k=0;k2;k++) //一位數(shù)據(jù) 位,一位補(bǔ)碼位

          {

          DQ=1;_nop_();_nop_();

          value=1;

          DQ = 0;_nop_();_nop_();_nop_();_nop_(); //4us

          DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us

          if(DQ)value|=0x01;

          delay_us(60); //60us

          }

          switch(value) //根據(jù)回復(fù)第兩位數(shù)據(jù)來(lái)發(fā)出相應(yīng)操作

          {

          case 0x00: //總線沖突

          if(n==0)

          {

          number++;

          number_temp=number;

          dat=dat>>1;

          DQ = 1;_nop_();_nop_();

          DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us

          DQ = 0; //最低位移出

          delay_us(60); //60us

          }

          else // 第二次以上循環(huán)時(shí)

          {

          clash_number++;

          if(clash_number>=(number_temp-1))

          {

          if(!clash_flag)

          {

          clash_flag=1;

          dat=dat>>1;

          dat=dat|0x80;

          DQ = 1;_nop_();_nop_();

          DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us

          DQ = 1; //最低位移出

          delay_us(60); //60us

          }

          else

          {

          clash_flag=0;

          number_temp--;

          dat=dat>>1;

          DQ = 1;_nop_();_nop_();

          DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us

          DQ = 0; //最低位移出

          delay_us(60); //60us

          }

          }

          }

          break;

          case 0x01:

          dat=dat>>1;

          DQ = 1;_nop_();_nop_();

          DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us

          DQ = 0; //最低位移出

          delay_us(60); //66us

          break;

          case 0x02:

          dat=dat>>1;

          dat=dat|0x80;

          DQ = 1;_nop_();_nop_();

          DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us

          DQ = 1; //最低位移出

          delay_us(60); //66us

          break;

          case 0x03:i=8;j=8;break;

          default:break;

          }

          }

          *p++=dat;

          }

          }

          return number;

          }

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

          多個(gè)DS18B20測(cè)試主函數(shù)

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

          void main()

          {

          uchar i,j,dat,amount;

          uchar ROM_data[16]; // 讀出ROM暫存

          uchar temp_data[2]; //讀出溫度暫存

          uchar temperature[7]={0,0,0,'.',0,'?,'?}; //要發(fā)送的數(shù)據(jù)緩存

          init_com();

          EA=0;

          while(1)

          {

          amount=search_rom(ROM_data);

          flag=0;

          while(!flag)Init18b20();

          write_byte(ds18B20_SKIP_ROM); // 跳過(guò)ROM命令

          write_byte(ds18B20_CONVERT_T); // 發(fā)轉(zhuǎn)換命令

          EA=1;

          delay_ms(1000);

          EA=0;

          for(j=0;j {

          flag=0;

          while(!flag)Init18b20();

          write_byte(ds18B20_MATCH_ROM); // 符合ROM命令

          for(i=j*8;i(j+1)*8;i++)

          {

          write_byte(ROM_da

          ta[i]);

          }

          write_byte(ds18B20_READ_SCRATCHPAD);//發(fā)讀命令

          temp_data[0]=read_byte(); //溫度低8位

          temp_data[1]=read_byte(); //溫度高8位

          temperature[4]=ditab[temp_data[0]0x0f]+0x30; // 小數(shù)位

          dat=((temp_data[0]0xf0)>>4)|((temp_data[1]0x0f)4); // 整數(shù)位

          for(i=0;i3;i++)

          {

          temperature[2-i]=dat%10+0x30;

          dat=dat/10;

          }

          for(i=0; i7;i++) //串口發(fā)送溫度數(shù)據(jù)

          {

          com_send_dat(temperature[i]);

          }

          }

          }



          關(guān)鍵詞: 單片機(jī) 溫度檢測(cè)

          評(píng)論


          相關(guān)推薦

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