OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4263|回复: 10

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

[复制链接]

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-7
在线时间
40 小时
发表于 2018-3-10 17:45:54 | 显示全部楼层 |阅读模式
5金钱
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()”读不到数据,找了好久也没找到原因,大神们帮忙看一下,非常感谢!

最佳答案

查看完整内容[请看2#楼]

谢谢,问题解决了。原时序是没有问题的,不知道为什么改用寄存器写就好了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-7
在线时间
40 小时
 楼主| 发表于 2018-3-10 17:45:55 | 显示全部楼层
superliu588 发表于 2018-3-12 22:32
首先看是否总线拉低之后是否有响应,之后在看读写这块是否有时序上的问题,个人不建议写完功能程序后调试, ...

谢谢,问题解决了。原时序是没有问题的,不知道为什么改用寄存器写就好了
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-7
在线时间
40 小时
 楼主| 发表于 2018-3-10 17:51:02 | 显示全部楼层
#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++;
        }
}
附加主函数,本人为段码液晶屏
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-11 01:37:54 | 显示全部楼层
帮顶
回复

使用道具 举报

17

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2532
金钱
2532
注册时间
2016-3-6
在线时间
393 小时
发表于 2018-3-11 17:10:34 | 显示全部楼层
看看时序
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-7
在线时间
40 小时
 楼主| 发表于 2018-3-11 17:37:38 | 显示全部楼层

恩  谢谢,检查过了,为发现问题呢
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-7
在线时间
40 小时
 楼主| 发表于 2018-3-11 17:38:54 | 显示全部楼层
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-7
在线时间
40 小时
 楼主| 发表于 2018-3-11 17:41:37 | 显示全部楼层
自己顶一下,暂时还未解决,大牛帮忙看一下
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-7
在线时间
40 小时
 楼主| 发表于 2018-3-12 14:02:23 | 显示全部楼层
顶顶顶
回复

使用道具 举报

2

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2017-7-17
在线时间
33 小时
发表于 2018-3-12 22:32:08 | 显示全部楼层
本帖最后由 superliu588 于 2018-3-12 22:37 编辑

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

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-10-10
在线时间
3 小时
发表于 2018-10-17 09:46:26 | 显示全部楼层
能问一下,用寄存器改哪里呀*_*
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 21:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表