3673|8

5

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于DS18B20在stm32f103vet6工控板的问题 [复制链接]

用的是在淘宝上买好的STM32F103vet6工控板和DS18b20的水温传感器探测头,线连好后,串口助手一直显示25度,没有温度变化上改变,感觉没有温度上的更新,有时候重新烧写还会出错,只显示0.1,求问题在哪,怎么解决?求大神指点。

    一下是例子代码
/*   主函数     */

   int main(void)
{       
       
        SysTick_Init();
       
       
        LED_GPIO_Config();
       
        USART1_Config();       
        printf("\r\n this is a ds18b20 test demo \r\n");
       
        while( DS18B20_Init())       
        {
                printf("\r\n no ds18b20 exit \r\n");
        }       
        printf("\r\n ds18b20 exit \r\n");
       
        for(;;)
        {       
                printf("\r\n temperature %.1f ¡æ\r\n",DS18B20_Get_Temp());                                 
                Delay_ms(1500);               
                LED1_TOGGLE;
        }   
}


/* ds18b20 代码 */
#include "bsp_ds18b20.h"


static void DS18B20_GPIO_Config(void)
{               

        GPIO_InitTypeDef GPIO_InitStructure;


        RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);

                                                                                                                          
          GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;       


          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   


          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


          GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
       
                GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);         
}


static void DS18B20_Mode_IPU(void)
{
          GPIO_InitTypeDef GPIO_InitStructure;

               
          GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;

         
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       


          GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}



static void DS18B20_Mode_Out_PP(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

                                                                                                                  
          GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;       


          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   


          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


          GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}


static void DS18B20_Rst(void)
{

        DS18B20_Mode_Out_PP();
       
        DS18B20_DATA_OUT(LOW);

        Delay_us(750);
       

        DS18B20_DATA_OUT(HIGH);

        Delay_us(15);
}


static uint8_t DS18B20_Presence(void)
{
        uint8_t pulse_time = 0;
       

        DS18B20_Mode_IPU();
       

        while( DS18B20_DATA_IN() && pulse_time<100 )
        {
                pulse_time++;
                Delay_us(1);
        }       

        if( pulse_time >=100 )
                return 1;
        else
                pulse_time = 0;
       
        while( !DS18B20_DATA_IN() && pulse_time<240 )
        {
                pulse_time++;
                Delay_us(1);
        }       
        if( pulse_time >=240 )
                return 1;
        else
                return 0;
}


static uint8_t DS18B20_Read_Bit(void)
{
        uint8_t dat;
       

        DS18B20_Mode_Out_PP();

        DS18B20_DATA_OUT(LOW);
        Delay_us(10);
       
       
        DS18B20_Mode_IPU();
        //Delay_us(2);
       
        if( DS18B20_DATA_IN() == SET )
                dat = 1;
        else
                dat = 0;
       
       
        Delay_us(45);
       
        return dat;
}

/*
* ′óDS18B20¶áò»¸ö×Ö½ú£¬μíλÏèDD
*/
uint8_t DS18B20_Read_Byte(void)
{
        uint8_t i, j, dat = 0;       
       
        for(i=0; i<8; i++)
        {
                j = DS18B20_Read_Bit();               
                dat = (dat) | (j<         }
       
        return dat;
}

/*
* D′ò»¸ö×Ö½úμ½DS18B20£¬μíλÏèDD
*/
void DS18B20_Write_Byte(uint8_t dat)
{
        uint8_t i, testb;
        DS18B20_Mode_Out_PP();
       
        for( i=0; i<8; i++ )
        {
                testb = dat&0x01;
                dat = dat>>1;               
               
                if (testb)
                {                       
                        DS18B20_DATA_OUT(LOW);
                       
                        Delay_us(8);
                       
                        DS18B20_DATA_OUT(HIGH);
                        Delay_us(58);
                }               
                else
                {                       
                        DS18B20_DATA_OUT(LOW);
                       
                        Delay_us(70);
                       
                        DS18B20_DATA_OUT(HIGH);                       
                       
                        Delay_us(2);
                }
        }
}

void DS18B20_Start(void)
{
        DS18B20_Rst();          
        DS18B20_Presence();         
        DS18B20_Write_Byte(0XCC);               
        DS18B20_Write_Byte(0X44);               
}

uint8_t DS18B20_Init(void)
{
        DS18B20_GPIO_Config();
        DS18B20_Rst();
       
        return DS18B20_Presence();
}


float DS18B20_Get_Temp(void)
{
        uint8_t tpmsb, tplsb;
        short s_tem;
        float f_tem;
       
        DS18B20_Rst();          
        DS18B20_Presence();         
        DS18B20_Write_Byte(0XCC);                               
        DS18B20_Write_Byte(0X44);                       
       
        DS18B20_Rst();
  DS18B20_Presence();
        DS18B20_Write_Byte(0XCC);                               
  DS18B20_Write_Byte(0XBE);                               
       
        tplsb = DS18B20_Read_Byte();                 
        tpmsb = DS18B20_Read_Byte();
       
        s_tem = tpmsb<<8;
        s_tem = s_tem | tplsb;
       
        if( s_tem < 0 )               
                f_tem = (~s_tem+1) * 0.0625;       
        else
                f_tem = s_tem * 0.0625;
       
        return f_tem;        
}


此帖出自stm32/stm8论坛

最新回复

DS18B20 编程还是比较 麻烦的,延时  调用 太多,影响主程序的运行 得用定时器 来调度 程序来实现延时,详细见 见附件 [attach]438103[/attach]   详情 回复 发表于 2019-10-15 11:49
点赞 关注(1)
 

回复
举报

2万

帖子

341

TA的资源

版主

沙发
 
是代码的问题吗
硬件连接对不
淘宝老板怎么讲
此帖出自stm32/stm8论坛
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
qwqwqw2088 发表于 2019-4-6 18:15
是代码的问题吗
硬件连接对不
淘宝老板怎么讲

人老板不懂,代码应该没错,就是用串口调试工具只是一直显示25度,没有更新变化,有时插得不牢就变成0.1了,到底哪里有问题我也很烦闷
此帖出自stm32/stm8论坛
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

4
 
没有实物测试很难判断原因的,如果代码确实可靠,那就是硬件的嫌疑更大些。
此帖出自stm32/stm8论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

5
 
18B20可以直接接IO口,单独接个IO电源和地调试看看温度会不会反馈就好了。还有就是18B20质量参差不齐
此帖出自stm32/stm8论坛
 
 
 

回复

335

帖子

0

TA的资源

纯净的硅(初级)

6
 
没看到你的延时函数,一般是时序的问题吧。调试看看
此帖出自stm32/stm8论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

7
 
本帖最后由 lhwqwer 于 2019-4-8 19:48 编辑
yanxinboy 发表于 2019-4-8 12:09
没看到你的延时函数,一般是时序的问题吧。调试看看
#include "bsp_SysTick.h"

static __IO u32 TimingDelay;


void SysTick_Init(void)
{
        /* SystemFrequency / 1000    1msÎ
         * SystemFrequency / 100000         10us
         * SystemFrequency / 1000000 1us
         */
//        if (SysTick_Config(SystemFrequency / 100000))        // ST3.0.0
        if (SysTick_Config(SystemCoreClock / 1000000))        // ST3.5.0
        {
                /* Capture error */
                while (1);
        }

        SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}


void Delay_us(__IO u32 nTime)
{
        TimingDelay = nTime;       


        SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;

        while(TimingDelay != 0);
}


void TimingDelay_Decrement(void)
{
        if (TimingDelay != 0x00)
        {
                TimingDelay--;
        }
}
//////////////////////.h////////////////////////////
#ifndef __SYSTICK_H
#define __SYSTICK_H

#include "stm32f10x.h"

void SysTick_Init(void);
void Delay_us(__IO u32 nTime);         // 1us

#define Delay_ms(x) Delay_us(1000*x)         //ms

#endif /* __SYSTICK_H */


这个是延时的.c和 .h文件,我用的是网盘上给好的ds18b20传感器的例程,烧进ds18b20测水温的,串口工具显示就是25度,没有变化,是不是代码不适合测水温的?
此帖出自stm32/stm8论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

8
 
有没有大神做过的,指点一下。
此帖出自stm32/stm8论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

9
 

DS18B20 编程还是比较 麻烦的,延时  调用 太多,影响主程序的运行
得用定时器 来调度 程序来实现延时,详细见 见附件

21STM32F10x_DS18BD20源程序说明.zip (97.94 KB, 下载次数: 14)

此帖出自stm32/stm8论坛
 
个人签名CAN总线STM32F105_Keil工程C++源程序
https://bbs.eeworld.com.cn/thread-553036-1-1.html
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表