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

📄 ds18b20_5.h

📁 这是一个51系列单片机控制加热温度的程序
💻 H
字号:
/*
功能:驱动温度传感器DS18B20工作。
资源:P1.7口(DQ),FamilyID[8] 器件ID值
使用:12M晶振 采用GetTemperature()函数进行温度采集。返回整型值。

修改日期:2007年6月27日
修改人:zx
*/
unsigned char FamilyID[8];
sbit DQ=P1^5;//数据信号
//unsigned char TH_0,TL_0;


void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}

/*********************************************************************************************************
** 函数名称: void delay15
** 功能描述: 精确延时15uS
** 输 入: 无
** 输 出: 无
** 备注:   12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void delay15()
{ 
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************************************
** 函数名称: delay15x
** 功能描述: 延时15uS的整数倍
** 输 入: (unsigned char)t:延迟时间=t*15uS  
** 输 出: 无
** 备注:   12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void delay15x(unsigned char t)
{  if(t==0) return;
  for(;t>0;t--)
    { delay15();
    }
}

/*********************************************************************************************************
** 函数名称: OW_Reset
** 功能描述: 1-Wire总线复位
** 输 入: void
** 输 出: 1bit: 1:总线上有器件  0:总线上无器件
** 调用模块: delay15x  delay15
** 备注:   12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
bit OW_Reset(void)//复位
{ unsigned char i;
  DQ = 0;       //pull DQ line low
  delay15x(30); // leave it low for 480~960us  (700uS)
  DQ = 1;       // allow line to return high
  delay15x(2);  // wait for presence 15~60uS    ( 56uS) 
  for(i=0;i<15;i++)  
     { 
       if (DQ==0) 
           {
            while(!DQ) {};// 复位成功,等待复位结束
            return(1);   // 并返回1,表示有器件
           } 
       delay15(); // 不成功,可能是1820反应慢,重试15次
     } 
       return(0);//  到达240uS等待最大值,放弃.返回0,表示无器件
}  


/*********************************************************************************************************
** 函数名称: OW_ReadByte
** 功能描述: 从 1-wire 总线上读取一个字节
** 输 入: void
** 输 出: 1Byte: 读取的1字节数据
** 调用模块: delay15x
** 备注:   12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned char OW_ReadByte(void)
{
unsigned char i;
unsigned char value = 0;
bit PEA;
PEA=EA;
  for (i=8;i>0;i--)
  {
    value>>=1;
    EA=0;
    DQ = 0; // pull DQ low to start timeslot
    _nop_();    
    _nop_(); //保持低,1uS以上 (3uS)
    DQ = 1; // then return high
    //delay15x(0); //Delay 1uS~15uS (12uS)
    _nop_();
    _nop_();
    _nop_();        //4uS
    if(DQ)  value|=0x80;
    EA=PEA;
    delay15x(5); // wait for rest of timeslot
  }
  return(value);
}


/*********************************************************************************************************
** 函数名称: OW_WriteByte
** 功能描述: 向 1-WIRE 总线上写一个字节
** 输 入: var:写入的1字节数据
** 输 出: 无
** 调用模块: delay15x
** 备注:   12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/

void OW_WriteByte(char val)
{
  unsigned char i;
  for (i=8; i>0; i--) // writes byte, one bit at a time
  {
    DQ = 0; // pull DQ low to start timeslot
   //保持低,1uS以上 (3uS)
    DQ = val&0x01;
    delay15x(3); // hold value for remainder of timeslot 60~120uS Total (85uS)
    DQ = 1;
    val=val>>1;
    delay15();
  }
  //delay15x(5);
}
/*********************************************************************************************************
** 函数名称: Conv_1820
** 功能描述: 命令1820开始温度转换
** 输 入: 无
** 输 出: 无
** 调用模块: OW_Reset OW_WriteByte
** 备注:   12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/

void Conv_1820()
{
  OW_Reset();
  OW_WriteByte(0xCC); //Skip ROM
  OW_WriteByte(0x44); // Start Conversion
}

/*********************************************************************************************************
** 函数名称: ReadFamily_1820
** 功能描述: 读取1820型号系列代码
** 输 入: 无
** 输 出:Byte:系列代码
** 全局变量: 无
** 调用模块: OW_Reset OW_WriteByte OW_ReadByte
** 备注:   12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:Shark
** 日 期: 2003年8月18日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/

unsigned char ReadFamily_1820()
{ //unsigned char FamilyID;
  uchar i;
  OW_Reset();
  OW_WriteByte(0x33);
  for(i=0;i<8;i++)
   FamilyID[i]=OW_ReadByte();
   return(FamilyID[0]);
}
/*********************************************************************************************************
** 函数名称: ReadTemp_1820
** 功能描述: 读取1820转换结果 (自动识别型号)
** 输 入: Kinds:精度设置(0:精确到小数点后一位;1,精确到小数点后2位)
** 输 出: (int)正常工作时:温度*10   总线无器件:0xf0ff 器件无法识别:0xfcff
** 全局变量: 无
** 调用模块: OW_Reset OW_WriteByte OW_ReadByte  ReadFamily_1820
** 备注:   12M晶体
** 作 者: Shark
** 日 期: 2003年8月13日
**-------------------------------------------------------------------------------------------------------
** 修 改:lsl
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int ReadTemp_1820(unsigned char Kinds)
{
  unsigned char tempH,tempL,Family;
 // char k;
  unsigned int TemMid;
  float KindsNum;
  if(Kinds==0)KindsNum=0.625;
  else        KindsNum=6.25;
 if(OW_Reset()==0) return(0xf0ff);//无器件,返回f0ff

  Family=ReadFamily_1820();
  OW_Reset();
  OW_WriteByte(0xCC); // Skip ROM
  OW_WriteByte(0xBE); // Read Scratch Pad
   delay15x(5);
   tempL=OW_ReadByte();
   tempH=OW_ReadByte();
   TemMid=((unsigned int)tempH) << 8;
   TemMid=TemMid+tempL;
   if (Family==0x28)//如果是18B20系列
     {
      if((TemMid&0x8000)==0x8000)
      	{
      	 TemMid=~TemMid+1;
      	 TemMid=TemMid*KindsNum;
	 TemMid=~(TemMid-1);
      	 return(TemMid);
      	}
      else return(TemMid*KindsNum);
     }
   else if(Family==0x10)//如果是1820系列
     {
      if(Kinds==0)KindsNum=5;
  	else        KindsNum=50;
      if((TemMid&0x8000)==0x8000)
      	{
      	 TemMid=~TemMid+1;
      	 TemMid=TemMid*5;
      	 return(TemMid);
      	}
      else return(TemMid*5);
     }
   else return(0xfcff);//其它型号无法识别 返回fcff  
}

uint GetTemperature(void)
	{
	uint value;
	uchar i;
	EA=0;
	Conv_1820();
	EA=1;
	for(i=0;i<100;i++)delay15x(255);
	EA=0;
	value=ReadTemp_1820(0);
	EA=1;
	return(value);
	}

⌨️ 快捷键说明

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