基于STM32的DS18B20温度检测问题

2019-03-23 18:18发布

最近想用stm32做个温度检测的小作品   用的是DS18B20  出现了一点问题实在是搞不定了  希望各位大神指点指点
1:开发板每次上电都显示85度   且温度不会改变
2:每次重新下载程序   都会显示温度   显示的温度和室温接近  但是温度不会改变

自己感觉是DS18B20不能更新温度   只显示第一次检测到的温度  不知道是程序哪里出了问题

程序如下
----------------------------DS18B20.C------------------------------------------------

#include "DS18B20.h"
#define Reset_DQ() GPIO_ResetBits(GPIOG,GPIO_Pin_14);
#define Set_DQ() GPIO_SetBits(GPIOG,GPIO_Pin_14);
#define Get_DQ() GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_14);

void GPIO_DQ_Out_Mode(void)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
}
void GPIO_DQ_Input_Mode(void)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
}
unsigned char Init_DS18B20(void)
{
  unsigned char dat = 0;
   GPIO_DQ_Out_Mode();

  Set_DQ();
  Delay_us(5);
  Reset_DQ();
  Delay_us(50);
  Set_DQ();
  Delay_us(4);
   
  GPIO_DQ_Input_Mode();

   while(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_14));
   while(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_14)==0);
   
  Delay_us(50);
  GPIO_DQ_Out_Mode();
//  Set_DQ();

  return dat;
}
unsigned char ReadOneChar(void)
{
  unsigned char i = 0;
  unsigned char dat = 0;

  
  for(i=0;i<8;i++)
  {
   GPIO_DQ_Out_Mode();
   dat>>=1;
   Reset_DQ();
   Delay_us(0.2);
   Set_DQ();
   GPIO_DQ_Input_Mode();
   Delay_us(0.1);
   if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_14))
   {dat|=0x80;}
   Delay_us(7);
  }
  GPIO_DQ_Out_Mode();
  Set_DQ();
  return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
GPIO_DQ_Out_Mode();
for(i=0;i<8;i++)
{
  if(dat&0x01)
  {
   Reset_DQ();
   Delay_us(1);
   Set_DQ();
   Delay_us(7);
  }
  else
  {
   Reset_DQ();
   Delay_us(7);
   Set_DQ();
   Delay_us(0.5);
  }
  dat>>=1;
}
}
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0x33);

Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Delay_us(1000);

Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);

a=ReadOneChar();   
b=ReadOneChar();  
b<<=8;
t=a+b;
return(t);
}

----------------------------------------------------------------
------------------------------------------main.c----------------------------------------------------------
/**
  ******************************************************************************
  * @file    main.c
  * @author  fire
  * @version V1.0
  * @date    2013-xx-xx
  * @brief   óÃ3.5.0°æ±¾¿a½¨μÄ1¤3ìÄ£°å
  ******************************************************************************
  * @attention
  *
  * êμÑéƽì¨:ò°»e iSO STM32 ¿a·¢°å
  * ÂÛì3    :http://www.123.com
  * ìÔ±|    :http://32.taobao.com
  *
  ******************************************************************************
  */
  
#include "stm32f10x.h"
#include "systick.h"
#include "lcd1602.h"
#include "DS18B20.h"
#include "stdio.h"
/**
  * @brief  Ö÷oˉêy
  * @param  ÎT
  * @retval ÎT
  */

//unsigned int ReadTempFlag;
int main(void)
{
int temp;
float temperature;
char displaytemp[16];
GPIO_1602_Config();
SysTick_Init();

LCD_Init();           
DelayMs(20);         
LCD_Clear();

LCD_Write_Char(13,1,' ');
LCD_Write_Char(14,1,'C');

while (1)        
  {
  int Ltemp=0;
   
  temp=ReadTemperature();
   
  if(Ltemp!=temp)
  {
   Ltemp=temp;
   temperature=(float)Ltemp*0.0625;
   sprintf(displaytemp,"Temp  % 7.3f",temperature);
   LCD_Write_String(0,1,displaytemp);
  }
}
}
/*********************************************END OF FILE**********************/


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。