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

📄 ds18b20.c

📁 DS18B20是一个温度传感器
💻 C
📖 第 1 页 / 共 2 页
字号:
    while(--length);
    return(crc);                
  }
//****************************************************************************
//模块名:Search_ROM
//编写者:liukang
//描述:  搜索ds18b20的地址子程序。
//功能:  
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
void Search_ROM (void)
{
  unsigned char A[8],B[8];               //A[8]为已知ID中最大的ID值,B[8]节点表
  unsigned char POINT0,POINT;            //POINT0指向上次检索的最后一个节点位置;
  //POINT指向当前节点位置;
  unsigned char I,J,K;                   //I,J为循环计数器;K为检索失败次数
  unsigned char DATA,CRC;
  unsigned char *PA,*PB;

  PA = &A[0];
  PB = &B[0];

  J = 0xFF;
  FLAG |= FLAG_TEMP_OK;                  //预设传感器正常
  I = 5;                                 //
  while ((I != 0) && ~(FLAG & FLAG_TEMP_RET))
  {
    Rst_DS18B20();            //传感器复位,复位成功或5次复位失败跳出循环
    I--;
  }
  if (FLAG && FLAG_TEMP_RET)
  {                                   //复位成功,开始搜索ds18b20的地址
    for (I = 0 ; I <8 ; I++)
    {
      A[I] = 0;                        //已知ID中最大的ID值"0"
      B[I] = 0;                        //所有节点都未处理
    }
    POINT0 = 63;
    POINT = 0XFF;
    K = 0;
    for (J = 0 ; (J<5 && K<5 && POINT != 0) ; J++)
    {
      Rst_DS18B20();                      //传感器复位
      Write_BUS_Byte (0XF0);            //写搜索ID命令
      POINT = 0;
      FLAG &= ~FLAG_TEMP_OVER;
      for (I = 0 ; ((I < 64) && ~(FLAG & FLAG_TEMP_OVER)) ; I++)
      {
        Right_Move_Temp(PA,PB);         //循环右移
        DATA = Read_BUS_2bit();         //读ds18b20两位
        switch (DATA &= 0XC0)
        {
        case 0:                       //读数为“0”,此位为一节点
          {
            if (B[0] & 0X80)
            {                           //本节点已处理
              DATA = 0XFF;
              A[7] |= 0X80;               //地址表写"1"
            }
            else
            {                           //本节点未处理
              if (I == POINT0)
              {                        //当前节点是最后的未处理节点
                DATA = 0XFF;
                A[7] |= 0X80;            //地址表写"1"
                B[0] |= 0X80;            //节点表写"1"
              }
              else
              {
                A[7] &= ~0X80;           //地址表写"0"
                POINT = I;               //设置节点指针
              }
            }
            DATA = Write_BUS_bit (DATA);  //选择方向
          }
          break;
        case 0X80:
          {
            DATA = 0X00;
            DATA = Write_BUS_bit (DATA);  //写"0"
            A[7] &= ~0X80;
            //                      B[0] &= ~0X80;
          }
          break;
        case 0X40:
          {
            DATA = 0X0F;
            DATA = Write_BUS_bit (DATA);  //写"1"
            A[7] |= 0X80;
            //                      B[0] &= ~0X80;
          }
          break;
        case 0XC0:
          {
            FLAG |= FLAG_TEMP_OVER;
          }
          break;
        default:
          break; 
        }
      }                                   //I循环结束
      if(!(FLAG & FLAG_TEMP_OVER))
      {
        CRC = CRC_Verify(PA,7);
        if (CRC == A[7])
        {
          for (I=0; I<8; I++) ID[J][I] = A[I];
          POINT0 = POINT;
          K = 0;
        }
        else 
        {
          J--;
          K++;
        }
      }
    }                                     //J循环结束
    TEMP_NUMBER = J;
  }
  else
  {                     //复位失败,置失败标志
    FLAG &= FLAG_TEMP_OK;
  }
}
//****************************************************************************
//模块名:Read_Temp
//编写者:liukang
//描述:  读温度子程序。
//功能:  
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
unsigned int ddddd;
void Read_Temp (void)
  {
    //float fq0=0.625;

    unsigned char I,J,CRC;
    unsigned char ROM[9];
    unsigned char *PA;
    Rst_DS18B20();                          //温度传感器复位
    if ((TEMP_NUMBER > 0) && (FLAG && FLAG_TEMP_RET))
      {                                     //温度传感器数量>0并且复位正常
        Write_BUS_Byte (0xcc);              //发"跳过地址"命令
        Write_BUS_Byte (0x44);              //发"启动温度转换"命令
        
        I = 0XFF;
        _EINT();
        ddddd=0x00;
        while ((ddddd!=0xFF) && (I>0))
          {                               //循环等待温度转换结束
            ddddd = Read_BUS_Byte();

            ConverFlag = 0;
            TimCh1 = GetMsValue(100);
            //GoTimer(1);
            while(!ConverFlag);
              I--;
          }
		_DINT();
        
        for (I=0; I<TEMP_NUMBER; I++)
          {
            PA = ROM;
            Rst_DS18B20();
            Write_BUS_Byte (0x55);          //发"匹配温度传感器"命令
            for (J=0; J<8; J++)             //发温度传感器地址
              {
                Write_BUS_Byte (ID[I][J]);
              }
            Write_BUS_Byte (0xbe);          //发"读存储器"命令
            for (J=0; J<9; J++)
              {
                ROM[J] = Read_BUS_Byte();
              }
            CRC = CRC_Verify(PA,8);
            if (CRC == ROM[8])
              {
                PA =(unsigned char*)&TEMP[I];
                *PA = ROM[0];
                *(PA+1) = ROM[1]; 
              }
            //fq0 *= TEMP[I];
            //TEMP[I] = fq0;
          }     //I循环结束
      }
  }

//****************************************************************************
//模块名:Temp
//编写者:liukang
//描述:  温度子程序。
//功能:  
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
void Temp (void)
{
  Rst_DS18B20 ();
  Search_ROM ();
  Read_Temp();
  _NOP();
}
//****************************************************************************
//模块名:Delay
//编写者:liukang
//描述:  延时子程序。
//功能:  
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
void Delay(unsigned int x)
{
  while(x !=0)x--;
}
//****************************************************************************
//模块名:GetTemperature()
//编写者:lp
//描述:  得到实际温度
//功能:  总线上只存在一个传感器,得到当前实际的温度
//版本:  1.0
//修改:  2007年03月21日
//****************************************************************************

float GetTemperature()
{	
	
	Temp ();
	Temperature = ((float)TEMP[0])/16;
  //Temperature = (float)TEMP[0];
	

  return Temperature;
}

⌨️ 快捷键说明

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