[求助] 基于STM32的DS18B20温度检测问题

三不沾   2016-3-3 19:28 楼主
最近想用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**********************/


回复评论 (8)

这种问题,您贴出来程序估计没有人仔细帮您看的。建议你从淘宝上购买个逻辑分析仪(大概40块左右),分析您这种一线总线式的时序等问题呢。
点赞  2016-3-5 13:01
参考一下这个程序吧。
实验30 18B20数字温度传感器实验.rar (305.44 KB)
(下载次数: 243, 2016-3-7 10:27 上传)

点赞  2016-3-7 10:28
引用: weizhongc 发表于 2016-3-7 10:28
参考一下这个程序吧。

非常感谢 !!
点赞  2016-3-7 19:26
程序我没看,估计楼主的ds18b20的pdf都没怎么看,先把pdf看懂,然后琢磨adc要怎么用,那就懂了。这里我也说说我个人见解,ds18b20是一个传感器,将温度的模拟信号转变为数字信号,它的采样我记得是有分辨率的;其次是利用adc进行数据采样,把它读出来。
点赞  2016-3-8 09:08
DS18B20是单总线的,要严格按照数据手册里的时序,设置延时
点赞  2016-3-18 14:23
先看看DS18B20的资料,一般上电寄存器默认数据是85度,就是你没进行转化读回来的数据就是85度,调这个程序,一定要用示波器查看延时是否满足要求,写数据和读数据有必要可以关闭中断。
点赞  2016-3-26 16:49
您的问题解决了吗?我现在在做这个,也是只显示一次的温度
点赞  2019-5-19 15:12

程序实在看不下去,首先85度是ds18b20的复位温度,还有就是如果Vcc引脚没接好电源,则一直处于复位状态显示85度,另外采用两线制可以把VCC和GND联在一起接在电源地上,由DQ实现线上供电。检查你的步骤吧。我们是专业做DS18B20采集模块的。LCT2662M,仪表LCT2201C

 

 

 

本帖最后由 lct2000 于 2019-7-9 12:29 编辑
北京长信物联科技有限公司 专业的USB温湿度传感器、485温湿度传感器、气体传感器、64路DS18B20温度采集模块厂商。 www.lct2000.cn QQ:1930227091
点赞  2019-7-9 10:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复