你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的DS18B20的问题  

[复制链接]
H_JEN 提问时间:2016-5-2 17:21 /
阅读主题, 点击返回1楼
收藏 3 评论55 发布时间:2016-5-2 17:21
55个回答
sfee2002 回答时间:2016-5-4 15:52:50
程序中。先拉低,然后将IO设成输入,用示波器看是否有复位脉冲。这样可以确保硬件没问题

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

荣丰宇 回答时间:2016-5-4 16:05:27
1.时序是否正确
2.管脚是否有上拉电阻

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

LIUBEIHUA 回答时间:2016-5-4 16:16:29
STM32的DS18B20的测温
设置成开漏输出,外接上拉电阻,
没有说明芯片类型,如是F103直接设成开漏输出。
                           如是L152直接设成开漏输出。最好用寄操作存器保证时序。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

wtliu 回答时间:2016-5-4 16:19:04
有做上啦设置吗?

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

jtc_88 回答时间:2016-5-4 16:46:38
公司电脑 不太好弄 我有一个 STM32F030 读取DS18B20的程序 上传不上去  
《DS18B20.c》

#include "stm32f0xx_hal.h"
#include "tim.h"
#include "DS18B20.h"


/*
微秒级延时用函数
*/
void Delay_us(uint16_t nus)
{
        __HAL_TIM_SetCounter(&htim17, 0);

        __HAL_TIM_ENABLE(&htim17);       

        while(__HAL_TIM_GetCounter(&htim17) < (48 * nus));
         /* Disable the Peripheral */
        __HAL_TIM_DISABLE(&htim17);
}
/*
复位DS18B20
*/
void DS18B20_Rst()
{
        DS18B20_IO_OUT_SET();                                                                        //
        HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_RESET);        //拉低DQ
        Delay_us(500);                                                                                       

//拉低500us
        HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_SET);                //DQ = 1
        Delay_us(30);       
}

/*
等待DS18B20的响应
返回1:未检测到DS18B20的存在
返回0:存在
*/
uint8_t DS18B20_Check(void)
{
        uint8_t retry = 0;
       
        DS18B20_IO_IN_SET();
        while(HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin) && (retry < 200))
        {
                retry++;
                Delay_us(1);
        }
        if(retry >= 200)
                return 1;
        else
                retry = 0;
       
        while(!HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin) && (retry < 240))
        {
                retry++;
                Delay_us(1);
        }
        if(retry >= 240)
                return 1;
       
        return 0;
}

/*
从DS18B20读取一个位
返回值:1/0
*/
uint8_t DS18B20_Read_Bit(void)
{
        uint8_t data = 0;
       
        DS18B20_IO_OUT_SET();//推挽输出设置
        HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_RESET);                //DQ = 0
        Delay_us(2);
        HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_SET);                        //DQ

= 1
        DS18B20_IO_IN_SET();                                        //输入上拉
        Delay_us(12);
        if(HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin))
                data = 1;
        else
                data = 0;
       
        Delay_us(50);
        return data;
}

/*
从DS18B20读取一个字节
返回值:读取到的数据
*/
uint8_t DS18B20_Read_Byte(void)                        //read one byte
{
        uint8_t i,j,dat;
       
        dat = 0;
       
        for(i = 1;i <= 8;i++)
        {
                j = DS18B20_Read_Bit();
                dat = (j << 7) | (dat >> 1);
        }
       
        return dat;
}

/*
写一个字节到DS18B20
dat:要写入的字节
*/
void DS18B20_Write_Byte(uint8_t dat)
{
        uint8_t j;
        uint8_t testb;
       
        DS18B20_IO_OUT_SET();//推挽输出设置
       
        for(j = 1;j <= 8;j++)
        {
                testb = dat & 0x01;
                dat = dat >> 1;
               
                if(testb)
                {
                        HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_RESET);               

//DQ = 0        write 1
                        Delay_us(2);
                        HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_SET);               

        //DQ = 1
                        Delay_us(60);
                }
                else
                {
                        HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_RESET);               

//DQ = 0        write 0
                        Delay_us(60);
                        HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_SET);               

        //DQ = 1
                        Delay_us(2);
                }
        }
}

/*
开始温度转换
*/
void DS18B20_Start(void)        //ds18b20 start convert
{       
        DS18B20_Rst();
        DS18B20_Check();
        DS18B20_Write_Byte(0xcc);//skip rom
        DS18B20_Write_Byte(0x44);//convert
}       
/*
设置为9位精度
*/
void DS18B20_Comfig2(void)        //
{       
        DS18B20_Rst();
        DS18B20_Check();
        DS18B20_Write_Byte(0xcc);//skip rom
        DS18B20_Write_Byte(0x4e);//write
}
/*
初始化DS18B20的IO口DQ同时检测DS的存在
返回1:不存在
返回0:存在
*/
//uint8_t DS18B20_init(void)
//{
//        ;
//}

/*
从DS18B20得到温度值
精度:0.5摄氏度
返回值:温度值
*/
uint16_t DS18B20_Get_Temp(void)
{
        uint8_t temp;
        uint8_t i = 0;
        uint8_t TL,TH;
        uint16_t tem;
       
#ifdef        CONFIG_DS18B20
       
uint8_t                FD,FH,RG;
#endif       


#ifdef        CONFIG_DS18B20
               
                DS18B20_Comfig2();
                DS18B20_Write_Byte(100);
                DS18B20_Write_Byte(0);
                DS18B20_Write_Byte(0x1f);
               
               
//                DS18B20_Start();
#endif       
        DS18B20_Rst();
        i = DS18B20_Check();
        if(i == 1)
                return 0xffee;
        DS18B20_Write_Byte(0xcc);//skip rom
        DS18B20_Write_Byte(0xbe);//read data
        TL = DS18B20_Read_Byte();//LSB
        TH = DS18B20_Read_Byte();//MSB

#ifdef        CONFIG_DS18B20
       
        FD = DS18B20_Read_Byte();
        FH = DS18B20_Read_Byte();
        RG = DS18B20_Read_Byte();
        printf("RG = %X\r\n",RG);
#endif               

        if(TH > 7)
        {
                TH = ~TH;
                TL = ~TL;
                temp = 0;        //温度为负
        }
        else
                temp = 1;        //温度为正
       
        tem = TH;        //获得高8位
        tem <<= 8;
        tem += TL;//获得低8位
        tem = (float)(tem >> 3) * 0.5 *100;//转换
        if(temp)
                return tem;        //返回温度值
        else
                return -tem;
       
}

《DS18B20.h》
#ifndef __DS18B20_H
#define __DS18B20_H

#define DS18B20_IO_OUT_SET()        //{DS18B20_GPIO_Port->MODER &= 0xFFFFFFF3;GPIOF->MODER |= 1 << 2;GPIOF->PUPDR &= 0xFFFFFFF3;}        //输出推挽 其余设置 默认
#define DS18B20_IO_IN_SET()                //{DS18B20_GPIO_Port->MODER &= 0xFFFFFFF3;GPIOF->PUPDR &= 0xFFFFFFF3;GPIOF->PUPDR |= 1 << 2;}        //设置输入上拉

//#define                CONFIG_DS18B20                //设置DS18B20的 分辨率

/*
开始温度转换
*/
void DS18B20_Start(void);        //ds18b20 start convert
/*
从DS18B20得到温度值
精度:0.5摄氏度
返回值:温度值
*/
uint16_t DS18B20_Get_Temp(void);
/*
微秒级延时用函数
*/
void Delay_us(uint16_t nus);
#endif
《gpio.c》

/**
  ******************************************************************************
  * File Name          : gpio.c
  * Description        : This file provides code for the configuration
  *                      of all used GPIO pins.
  ******************************************************************************
  *
  * COPYRIGHT(c) 2016 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "gpio.h"
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOF_CLK_ENABLE();
  __GPIOA_CLK_ENABLE();
  __GPIOB_CLK_ENABLE();

  /*Configure GPIO pins : PAPin PAPin PAPin PAPin
                           PAPin */
  GPIO_InitStruct.Pin = CD4053_Pin|C_S1_Pin|C_S2_Pin|C_S3_Pin
                          |C_S4_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PA7 */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = DS18B20_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(DS18B20_GPIO_Port, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

}

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


《tim.c》
/**
  ******************************************************************************
  * File Name          : TIM.c
  * Description        : This file provides code for the configuration
  *                      of the TIM instances.
  ******************************************************************************
  *
  * COPYRIGHT(c) 2016 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "tim.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

TIM_HandleTypeDef htim14;
TIM_HandleTypeDef htim16;
TIM_HandleTypeDef htim17;

/* TIM14 init function */
void MX_TIM14_Init(void)
{

  htim14.Instance = TIM14;
  htim14.Init.Prescaler = 0;
  htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim14.Init.Period = 65535;
  htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;
  HAL_TIM_Base_Init(&htim14);

}
/* TIM16 init function */
void MX_TIM16_Init(void)
{

  htim16.Instance = TIM16;
  htim16.Init.Prescaler = TIM16_PSC;
  htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim16.Init.Period = 65535;
  htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;
  htim16.Init.RepetitionCounter = 0;
  HAL_TIM_Base_Init(&htim16);

}
/* TIM17 init function */
void MX_TIM17_Init(void)
{

  htim17.Instance = TIM17;
  htim17.Init.Prescaler = 0;
  htim17.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim17.Init.Period = 65535;
  htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;
  htim17.Init.RepetitionCounter = 0;
  HAL_TIM_Base_Init(&htim17);

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{

  if(htim_base->Instance==TIM14)
  {
  /* USER CODE BEGIN TIM14_MspInit 0 */

  /* USER CODE END TIM14_MspInit 0 */
    /* Peripheral clock enable */
    __TIM14_CLK_ENABLE();
  /* USER CODE BEGIN TIM14_MspInit 1 */

  /* USER CODE END TIM14_MspInit 1 */
  }
  else if(htim_base->Instance==TIM16)
  {
  /* USER CODE BEGIN TIM16_MspInit 0 */

  /* USER CODE END TIM16_MspInit 0 */
    /* Peripheral clock enable */
    __TIM16_CLK_ENABLE();
  /* USER CODE BEGIN TIM16_MspInit 1 */

  /* USER CODE END TIM16_MspInit 1 */
  }
  else if(htim_base->Instance==TIM17)
  {
  /* USER CODE BEGIN TIM17_MspInit 0 */

  /* USER CODE END TIM17_MspInit 0 */
    /* Peripheral clock enable */
    __TIM17_CLK_ENABLE();
  /* USER CODE BEGIN TIM17_MspInit 1 */

  /* USER CODE END TIM17_MspInit 1 */
  }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{

  if(htim_base->Instance==TIM14)
  {
  /* USER CODE BEGIN TIM14_MspDeInit 0 */

  /* USER CODE END TIM14_MspDeInit 0 */
    /* Peripheral clock disable */
    __TIM14_CLK_DISABLE();
  /* USER CODE BEGIN TIM14_MspDeInit 1 */

  /* USER CODE END TIM14_MspDeInit 1 */
  }
  else if(htim_base->Instance==TIM16)
  {
  /* USER CODE BEGIN TIM16_MspDeInit 0 */

  /* USER CODE END TIM16_MspDeInit 0 */
    /* Peripheral clock disable */
    __TIM16_CLK_DISABLE();
  /* USER CODE BEGIN TIM16_MspDeInit 1 */

  /* USER CODE END TIM16_MspDeInit 1 */
  }
  else if(htim_base->Instance==TIM17)
  {
  /* USER CODE BEGIN TIM17_MspDeInit 0 */

  /* USER CODE END TIM17_MspDeInit 0 */
    /* Peripheral clock disable */
    __TIM17_CLK_DISABLE();
  /* USER CODE BEGIN TIM17_MspDeInit 1 */

  /* USER CODE END TIM17_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/






评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

wambob 回答时间:2016-5-4 17:40:06
本帖最后由 wambob 于 2016-5-4 17:44 编辑

18b20是单总线器件,外部需要上拉,而且时序对延时有要求,我开始跳这个,也没调成,最后还是用别人的例子移植成功了。这是我的18b20例程,希望对你有用
https://www.stmcu.org.cn/module/forum/thread-600041-1-1.html

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

zhang7309 回答时间:2016-5-4 19:32:50
首先确定传感器是不是好的

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

sacq12 回答时间:2016-5-4 19:40:32
楼主给出你的连线图,免得大家怀疑上拉电阻什么的;
如有可能,用逻辑分析仪看波形更好。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

wenyangzeng 回答时间:2016-5-4 20:50:33
楼主,关键就在初始化的480us,不同厂家的芯片这几百微秒都不尽相同,有的需要650us,有的要700us.你多试几次就OK了。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

零tot 回答时间:2016-5-4 21:27:14
建议看一下看一下各端口的波形是否正确,是否是自己需要的延时,检查管脚功能是否设置是正确的,达到自己预定的效果

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版