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

📄 ds18b20.h

📁 本源程序是为数字温度传感器DS18B20而编写的驱动程
💻 H
字号:
/***********************************************************************************
 ***********************************************************************************
                        *********************************                      
                        温度传感器DS18B20的操作与控制程序
                        *********************************
    文件名称:DS18B20.h
    功  能:温度传感器DS18B20进行操作与控制。主要包括对DS18B20的初始化函数、
                  写命令函数和读数据函数    
    设 计 者:黄开坤
 **********************************************************************************/
#ifndef       DS18B20                   //条件编译
/***端口定义及变量声明*************************************************************/
;sbit   DQ       =P3^0;                 //数据传输线接单片机的相应的引脚
unsigned char tempL=0;                  //暂存从DS18B20读出的温度高位
unsigned char tempH=0;                  //暂存从DS18B20读出的温度低位
float temperature;                      //存放计算后得出的实际温度值
unsigned char temperature_symbol;       //温度的符号位,为1表示负温,为0表示正温
unsigned char temp[8] ;                 //用于存放温度的ASCII码
/***延时程序************************************************************************/  
void DS18B20_delay(unsigned char x)     //延时时间=机周*2*X+2;X=0至255 
{ 
     while(--x); 
}
/***初使化**************************************************************************/
unsigned char DS18B20_Initial(void)     //对DS18B20进行初使化函数
{
     unsigned char x=0;
	 DQ=1;                              //DQ先置高
     DS18B20_delay(1);                  //稍延时
     DQ=0;                              //发送复位脉冲
     DS18B20_delay(250);                //延时>480ms
     DQ=1;                              //拉高数据线
     DS18B20_delay(15);                 //等待15~60ms
	 x=DQ;                              //若x=0,则DS18B20存在,否则不存在
     DS18B20_delay(250);
     DQ=1;
     return(x);                         //返回值用于测试DS18B20是否存在,为0则存在
} 
/***读取数据************************************************************************/
unsigned char DS18B20_Read(void)        //从DS18B20中读取数据
{ 
     unsigned char i=0; 
     unsigned char dat=0;               //暂存读取的数据
     for(i=0;i<8;i++)
        {
          dat >>= 1;                    //先读取低位,逐位读取 
          DQ = 0;                       //
          _nop_();                      //
          DQ = 1;                       //必须写1,否则读出来的将是不预期的数据
          DS18B20_delay(1);             //稍延时
          _nop_();
          if(DQ)                        //读取数据
          dat |= 0x80;
          DS18B20_delay(30);            //读取一位的周期>60us
          DQ = 1;                       //释放总线
		  _nop_();            
        }
     return dat;                        //返回读取的值
}
/***写命令或数据********************************************************************/
void DS18B20_Write(unsigned char dat)
{ 
     unsigned char i; 
     for(i=0;i<8;i++)
        {if(dat & 0x01)                 //低位在前
           { DQ = 0;                    //结束Recovery time
             DS18B20_delay(1);
             DQ = 1;   }                //发送“1”
         else
             DQ = 0;                    //发送“0”
             DS18B20_delay(30);         //等待DS18B20采样
         DQ = 1;                        //
         _nop_();                       //
         dat >>= 1;                     //准备发送下一位
  }
 }
/***读取温度值***********************************************************************
高位放到tempH里,低位放到tempL里,计算后的实际温度存放到temperature里
************************************************************************************/
float ReadTemperature(void)
{  

     DS18B20_Initial()               ;  //初始化
     DS18B20_Write(0xcc)             ;  //跳过读序列号的*作
     DS18B20_Write(0xbe)             ;  //读温度寄存器
     tempL=DS18B20_Read()            ;  //读出温度的低8位
     tempH=DS18B20_Read()            ;  //读出温度的高8位   
     if(tempH&0x80)
        {temperature_symbol=1        ;	//负温度值
		  tempH=~tempH               ;
          tempL=~tempL               ;
	      temperature=(tempH*256+tempL+1)*0.0625;//计算实际温度
	    }
     else
         {temperature_symbol=0       ;           //正温度值
		  temperature=(tempH*256+tempL)*0.0625;	 //计算实际温度
		  }
     DQ=1;
     DS18B20_Initial();                 //初始化
     DS18B20_Write(0xcc);               //跳过读序列号的*作
     DS18B20_Write(0x44);               //启动温度转换,为下一次读取温作准备
     return(temperature);
} 
/***数值变换(把浮点数转换成相应的字符串)********************************************/
void IntToStr(float t) 
{                            	
	temp[0]=(unsigned char)(t/100)%10+'0'; //百位         	
	temp[1]=(unsigned char)(t/10)%10+'0' ; //十位                                    	
	temp[2]=(unsigned char)t%10+'0'      ; //个位
	temp[3]='.'                          ; //小数点                                       	
	temp[4]=(unsigned char)(t/0.1)%10+'0'; //小数
	temp[5]=' '                          ;
	temp[6]='C'                          ; //温度单位
	temp[7]='\0'                         ;
	if(temperature_symbol)				   //判断正负,
	   {temp[0]='-'                      ; //负号
	    if(temp[1]=='0')
		   temp[1]=' '                   ; //消去无效位 
		}
	else
	    {if(temp[0]=='0'||temp[0]=='-')	   
		    temp[0]=' '                  ; //消去无效位
		 if(temp[1]=='0')
		    temp[1]=' '                  ; //消去无效位
		} 	
} 
/***结束****************************************************************************/
#endif

⌨️ 快捷键说明

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