ds18b20总是显示0,是哪儿出问题了

2019-08-23 15:16发布

各位帮我看下哪儿错了
ds18b20.c

#include "ds18b20.h"
#include "delay.h"
//u8 DS18B20_SensorNum;
//u8 DS18B20_ID[MaxSensorNum][8];
void DS18B20_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;     //ds18b20-->PA.2 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);      //根据设定参数初始化GPIOA.2
  GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
//使得data引脚变为输入模式
void DS18B20_Mode_IPU(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;     
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//使得data引脚变为输出模式
void DS18B20_Mode_Out(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;     
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //kailou输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);      //根据设定参数初始化GPIOA.2
}
void DS18B20_Rst(void)
{
    DS18B20_Mode_Out();
DS18B20_DQ_OUT_Low; //产生至少480us的低电平复位信号
delay_us(500);
DS18B20_DQ_OUT_High;
delay_us(15);
}
u8 DS18B20_Answer_Check(void)
{
u8 i=0;
DS18B20_Mode_IPU();//主机设置为上拉输入
//等待应答脉冲(一个60~240us的低电平信号)的到来
//如果100us内,没有应答脉冲,退出函数,注意:从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲
while(DS18B20_DQ_IN&&i<100)
{
  i++;
  delay_us(1);
}
//经过100us后,如果没有应答脉冲,退出函数
if(i>=100)
  return 1;
else return 0;
//有应答脉冲,且存在时间不超过240us
while(!DS18B20_DQ_IN&&i<240)
{
    i++;
    delay_us(1);
}
if(i>=240)
  return 1;
   else return 0;
}
u8 DS18B20_Read_Bit(void)
{
  u8 data;
  DS18B20_Mode_Out();
  DS18B20_DQ_OUT_Low; // 读时间的起始:必须由主机产生 >1us <15us 的低电平信号
  delay_us(2);
  DS18B20_DQ_OUT_High;
  delay_us(12);
  DS18B20_Mode_IPU();// 设置成输入,释放总线,由外部上拉电阻将总线拉高
  if (DS18B20_DQ_IN)
  data = 1;
  else
  data = 0;
  delay_us(50);
  return data;
}
u8 DS18B20_Read_2Bit(void)
{
u8 i;
u8 dat=0;
for(i=2;i>0;i--)
{
  dat=dat<<1;
  DS18B20_Mode_Out();
  DS18B20_DQ_OUT_Low;
  delay_us(2);
  DS18B20_DQ_OUT_High;
  DS18B20_Mode_IPU();
  delay_us(12);
  if(DS18B20_DQ_IN)dat|=0x01;
  delay_us(50);
}
return dat;
}
u8 DS18B20_Read_Byte(void)
{
u8 i, j, dat;
  dat = 0;
  for (i = 1; i <= 8; i++)
  {
   j = DS18B20_Read_Bit();
   dat = (dat>>1)|(j <<7);
  }
   return dat;
}
void DS18B20_Write_Bit(u8 dat)
{
DS18B20_Mode_Out();
  if (dat)
  {
   DS18B20_DQ_OUT_Low;// Write 1
   delay_us(2);
   DS18B20_DQ_OUT_High;
   delay_us(60);
  }
  else
  {
   DS18B20_DQ_OUT_Low;// Write 0
   delay_us(60);
   DS18B20_DQ_OUT_High;  
   delay_us(2);
  }
}
void DS18B20_Write_Byte(u8 dat)
{
  u8 j;
  u8 testb;
  DS18B20_Mode_Out();
  for (j = 1; j <= 8; j++)
  {
   testb = dat & 0x01;
   dat = dat >> 1;
   if (testb)
   {
    DS18B20_DQ_OUT_Low;// 写1
    delay_us(2);
    DS18B20_DQ_OUT_High;
    delay_us(60);
   }
   else
   {
   DS18B20_DQ_OUT_Low;// 写0
   delay_us(60);
   DS18B20_DQ_OUT_High;// 释放总线
   delay_us(2);
   }
  }
}
u8 DS18B20_Init(void)
{
  DS18B20_GPIO_Config();
  DS18B20_Rst();
  return DS18B20_Answer_Check();
}
short DS18B20_Get_Temp(void)
{
   
//  u8 j;//匹配的字节
  u8 TL, TH;
  u8 temp;
short tem;
  DS18B20_Rst();
  DS18B20_Answer_Check();
  DS18B20_Write_Byte(0xcc);// skip rom
  DS18B20_Write_Byte(0x44);// convert
  DS18B20_Rst();
  DS18B20_Answer_Check();
  
  // DS18B20_Write_Byte(GPIOx,GPIO_Pin,0xcc);// skip rom
  //匹配ID,i为形参
//  DS18B20_Write_Byte(0x55);
//  for (j = 0; j < 8; j++)
//  {
//  DS18B20_Write_Byte(DS18B20_ID[i][j]);
//  }
  DS18B20_Write_Byte(0xcc);
  DS18B20_Write_Byte(0xbe);// convert
  TL = DS18B20_Read_Byte(); // LSB
  TH = DS18B20_Read_Byte(); // MSB
  if (TH >7)
  {
   TH=~TH;
         TL=~TL;
         temp=0; //温度为负
  }
  else temp=1;
   tem=TH; //获得高八位
      tem<<=8;
      tem+=TL;  //获得底八位
      tem=(double)tem*0.625;  //转换
      if(temp)return tem;  //返回温度值
      else return -tem;
}
//void DS18B20_Search_Rom(void)
// {
//  u8 k, l, chongtuwei, m, n, num;
//  u8 zhan[5];
//  u8 ss[64];
//  u8 tempp;
//  l = 0;
//  num = 0;
//  do
//  {
//   DS18B20_Rst(); //注意:复位的延时不够
//   delay_us(480); //480、720
//   DS18B20_Write_Byte(0xf0);
//   for (m = 0; m < 8; m++)
//   {
//    u8 s = 0;
//    for (n = 0; n <8; n++)
//    {
//     k = DS18B20_Read_2Bit();//读两位数据
//     
//     k = k & 0x03;
//     s >>=1;
//     if (k == 0x01)//01读到的数据为0 写0 此位为0的器件响应
//     {
//      DS18B20_Write_Bit(0);
//      ss[(m * 8 + n)] = 0;
//     }
//     else if (k == 0x02)//读到的数据为1 写1 此位为1的器件响应
//     {
//      s = s | 0x80;
//      DS18B20_Write_Bit(1);
//      ss[(m * 8 + n)] = 1;
//     }
//     else if (k == 0x00)//读到的数据为00 有冲突位 判断冲突位
//     {
//       //如果冲突位大于栈顶写0 小于栈顶写以前数据 等于栈顶写1
//       chongtuwei = m * 8 + n  + 1;
//       if (chongtuwei >zhan[l])
//      {
//       DS18B20_Write_Bit(0);
//       ss[(m*8+n)]=0;
//       zhan[++l]=chongtuwei;
//      }
//      else if(chongtuwei<zhan[l])
//      {
//       s=s|((ss[(m*8+n)]&0x01)<<7);
//       DS18B20_Write_Bit(ss[(m*8+n)]);
//      }
//      else if(chongtuwei==zhan[l])
//      {
//       s=s|0x80;
//       DS18B20_Write_Bit(1);
//       ss[(m*8+n)]=1;
//       l=l-1;
//      }
//    }
//    else
//    {
//    //没有搜索到
//    }
//   }
//   tempp=s;
//   DS18B20_ID[num][m]=tempp;//保存搜索到的ID
//  }
//  num=num+1;//保存搜索到的个数
//  }
//  while(zhan[l]!=0&&(num<MaxSensorNum));
//  DS18B20_SensorNum=num;
// //printf("DS18B20_SensorNum=%d ",DS18B20_SensorNum);
//}

main

value=DS18B20_Get_Temp();
   if(value<0)
      {
     LCD_ShowChar(16+40,64,'-',16,0); //显示负号
     value=-value;  //转为正数
      }else LCD_ShowChar(16+40,64,' ',16,0);  //去掉负号
      LCD_ShowNum(16+40+8,64,value/10,2,16);  //显示正数部分
   LCD_ShowNum(16+72,64,value%10,1,16); //显示小数部分

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。