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条回答
oceane
1楼-- · 2019-07-21 11:12
 精彩回答 2  元偷偷看……
oceane
2楼-- · 2019-07-21 12:38
#include "main.h"
#include  "key.h"
#include  "lcd.h"
#include  "supply.h"
#include "delay.h"
#include "18b20.h"



int main(void)
{
        u8 t=0;                            
        short temperature;
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init();
       BEEP_Confing();
        LCDLED_Config();
       
        KEY1_Config();
        KEY2_Config();

       
        LCD_GPIOConfig();
        LCD_Config();
       
        DS18B20_Init();
  while (1)
  {
                if(t%10==0)                       
                {                                                                          
                        temperature=DS18B20_Get_Temp();       
                                       
                        if(temperature<0)
                        {
                          while( LCD_GetFlagStatus (LCD_FLAG_UDR) != RESET) ;
                                LCD->RAM[LCD_RAMRegister_6] &= 0xfff7ffff;
                                LCD->RAM[LCD_RAMRegister_6] |= 0x00080000;       
                                LCD_Show();                     
                                temperature=-temperature;                                       
                        }
                        else
                        {
                                LCD->RAM[LCD_RAMRegister_6] &= 0xfff7ffff;
        LCD_Show();                                            //è¥μ&#244;&#184;oo&#197;
                        }                       
                        Convert_18b20_NumEightToChar(temperature);          
                }                                  
                 delay_ms(10);
                t++;
        }
}
附加主函数,本人为段码液晶屏
正点原子
3楼-- · 2019-07-21 16:13
帮顶
18811707971
4楼-- · 2019-07-21 18:08
看看时序
oceane
5楼-- · 2019-07-21 19:17
18811707971 发表于 2018-3-11 17:10
看看时序

恩  谢谢,检查过了,为发现问题呢
oceane
6楼-- · 2019-07-21 19:39
 精彩回答 2  元偷偷看……

一周热门 更多>