STM32L152驱动18b20,无法得到温度,附带程序,大神帮忙看一下

2019-07-21 08:59发布

18B20.h文件:#ifndef __18B20_H
#define __18B20_H

#include "sys.h"

#define  OUT1_18B20_HIGH  GPIO_SetBits(GPIOE,GPIO_Pin_14)
#define  OUT1_18B20_LOW  GPIO_ResetBits(GPIOE,GPIO_Pin_14)
#define  OUT1_18B20_IN()  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_14)

void IN1_18B20_Config(void);
void OUT1_18B20_Config(void);

void IN2_18B20_Config(void);
void OUT2_18B20_Config(void);

u8 DS18B20_Init(void);
short DS18B20_Get_Temp(void);
void DS18B20_Start(void);
void DS18B20_Write_Byte(u8 dat);
u8 DS18B20_Read_Byte(void);
u8 DS18B20_Read_Bit(void);
u8 DS18B20_Check(void);
void DS18B20_Rst(void);
#endif



18B20.c文件:
#include  "18b20.h"
#include "delay.h"

void DS18B20_Rst(void)          
{
        OUT1_18B20_Config();         //SET PE14 OUTPUT
        OUT1_18B20_LOW;        
  delay_us(750);           
        OUT1_18B20_HIGH;         //DQ=1
        delay_us(15);             //15US
}

u8 DS18B20_Check(void)           
{   
        u8 retry=0;
        IN1_18B20_Config();        //SET PE14 INPUT         
    while (OUT1_18B20_IN()&&retry<200)
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=200)return 1;
        else retry=0;
    while (!OUT1_18B20_IN()&&retry<200)
        {
                retry++;
                delay_us(1);
        };
        if(retry>=240)return 1;            
        return 0;
}

u8 DS18B20_Read_Bit(void)          
{
        u8 data;
        OUT1_18B20_Config();        //SET PG11 OUTPUT
  OUT1_18B20_LOW;
        delay_us(2);
  OUT1_18B20_HIGH;
        IN1_18B20_Config();        //SET PG11 INPUT
        delay_us(12);
        if(OUT1_18B20_IN())data=1;
        else data=0;         
        delay_us(50);           
        return data;
}

u8 DS18B20_Read_Byte(void)     
{        
    u8 i,j,dat;
    dat=0;
        for (i=1;i<=8;i++)
        {
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }                                                    
    return dat;
}

void DS18B20_Write_Byte(u8 dat)     
{            
    u8 j;
    u8 testb;
        OUT1_18B20_Config();        //SET PE14 OUTPUT;
    for (j=1;j<=8;j++)
        {
        testb=dat&0x01;
        dat=dat>>1;
        if (testb)
        {
            OUT1_18B20_LOW;        // Write 1
            delay_us(2);                           
            OUT1_18B20_HIGH;
            delay_us(60);            
        }
        else
        {
            OUT1_18B20_LOW;        // Write 0
            delay_us(60);            
            OUT1_18B20_HIGH;
            delay_us(2);                          
        }
    }
}
void DS18B20_Start(void)
{                                                                 
    DS18B20_Rst();          
          DS18B20_Check();         
    DS18B20_Write_Byte(0xcc);        // skip rom
    DS18B20_Write_Byte(0x44);        // convert
}
             
u8 DS18B20_Init(void)
{
        GPIO_InitTypeDef   GPIO_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;            
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_40MHz ;
       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOE,&GPIO_InitStructure);

        GPIO_SetBits(GPIOE,GPIO_Pin_14);   

        DS18B20_Rst();

        return DS18B20_Check();
}  

short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
          short tem;
    DS18B20_Start ();                          // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();         
    DS18B20_Write_Byte(0xcc);        // skip rom
    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=(float)tem*0.625;               
        if(temp)return tem;                
        else return -tem;   
}

void IN1_18B20_Config(void)
{
        GPIO_InitTypeDef   GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;            
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_40MHz;

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOE,&GPIO_InitStructure);
}               
void OUT1_18B20_Config(void)
{
        GPIO_InitTypeDef   GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;            
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_40MHz ;

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
        GPIO_Init(GPIOE,&GPIO_InitStructure);
}       



根据原子的“标准例程”该写的,但是读取“DS18B20_Get_Temp()”读不到数据,找了好久也没找到原因,大神们帮忙看一下,非常感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
superliu588
2019-07-21 22:32
本帖最后由 superliu588 于 2018-3-12 22:37 编辑

首先看是否总线拉低之后是否有响应,之后在看读写这块是否有时序上的问题,个人不建议写完功能程序后调试,应该一步步来,否则很难排查问题。PS:原子哥的推挽方式易于理解,但是个人觉得总线最好设置开漏输出,不必重新设置输入输出模式。

一周热门 更多>