⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.txt

📁 读出DS18B20的数据值
💻 TXT
字号:
/*-----------------------------------------------------------------------
	*
	*                     DS18B20温度传感器读写部分:
	*            
	*               通过对传感器写入命令来控制传感器的实时输出
	*-------------------------------------------------------------------------*/
	void delay15(uchar n)        //精确延时   N*15US
	{   
     do{
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
          n--;
      }while(n);
	}
	//DS18B20初始化判标志位程序
	void  DSinited(void)
	{
	   uchar  time=25;
	   
	   DQ1=0;
	   delay15(40);
	   DQ1=1;
       while(time--)
	   {
	      if(DQ1==0)
		  {
		    Flag0=1;                                   //表示DS18B20存在			
			break;
		  }
		  else
		    Flag0=0;                                    //表示DS18B20不存在
	   }
	   delays(10);
	  // DQ1=1;
	}
	 //从DS18B20读出一个字节的数据
	 uchar  DSread()
	 {	   	
	    uchar  i;
		uchar  byte;
        uchar  dateout=0;
		uchar  buff=0x01;		

		for(i=0;i<8;i++)
		{		  
		   DQ1=0;
		   _nop_();
		   _nop_();
		   _nop_();
		   DQ1=1;
		   delay15(1);
           byte=buff&DQ1;
		   byte=byte<<i;                   
		   dateout=dateout|byte;
		   delay15(1);
		}
		return(dateout);
	  }
	//向DS18B20写程序
     void  DSwrite(uchar date)
     {	   
         uchar  i;        		

		 for(i=0;i<8;i++)
		 {
		     DQ1=0;
			 delay15(1);
			 DQ1=date&0x01;			 
			 date=date>>1;
			 delay15(2);
			 DQ1=1;
			 _nop_();
          }
		  delay15(3);
		 // DQ1=1;
	}
    //设置DS18B20暂存存储器
	void  DSconfine(void)
	{
	   while(Flag0)
	   {
	      DSwrite(0xcc);                             //发SKIP ROM命令
		  _nop_();
          DSwrite(0x4e);                             //发写暂存存储器命令
		  _nop_();
		  DSwrite(0x00);                             //TH(报警上限)中写入00H
		  _nop_();
		  DSwrite(0x00);                             //TL(报警下限)中写入00H
		  _nop_();
		  DSwrite(0x1f);                             //选择温度分辨率
		  _nop_();
		}
	 }
	//将从DS18B20中读出的温度数据进行转换
	uchar  convert_temp(uchar date1,uchar date2)
	{	   
		uchar  buff1;
		uchar  buff2;
		bit    byte;
		uchar  dateout;

		buff1=date1&0xF0;                                      //舍去温度低位中小数点后四位
		buff1=buff1>>4;                                        //将高四位转到低四位
      
		buff2=date2&0x0F;                                     //取低四位
        buff2=buff2<<4;                                       //将数据移到高四位,最高位为符号位		
		dateout=buff1|buff2;
		byte=(bit)(date1&0x08);                                //取第四位,采用四舍五入的计算法
		if(byte)
		dateout++;
	  
		return(dateout);
	}
      
    //读出温度转换值(返回值为一位,高位为符号位)
	uchar  Gettemper(void)
	{
	   uchar  dateout;
	   uchar  dateout1;
	   uchar  dateout2;	   

       DQ1=1;
       DSinited();
	   if(Flag0)
	   {
	       DSwrite(0xcc);                               //跳过ROM匹配
           _nop_();
           DSwrite(0x44);                               //发出温度转换命令
           _nop_();
		   DSinited();                                  //准备读温度前先复位
		   _nop_();
		   DSwrite(0xcc);                               //跳过ROM匹配
           _nop_();
		   DSwrite(0xbe);                               //发出读温度命令
           _nop_();
    	   dateout1=DSread();                           //返回读出的温度低位值
		   dateout2=DSread();                         //返回读出的温度高位值          
		   dateout=convert_temp(dateout1,dateout2);          
		   return(dateout);		   
    	}
		else
		  return(0);
	} 
 
    void  main(void)
    {
    
	   uchar   wendu;	  
	   bit     a;

	   wendu=Gettemper();                                                   //进行温度采集
	   a=(bit)(wendu&0x80);	   
	   if(a)                                                         //为负值时,此时温度为0下,否则为0上,温度值即为数据的值	   
	    wendu=~wendu;	   
	   show(wendu);                                                  //将数据值显示出来
   }
           

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -