野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11380|回复: 1

stm32f429 温度检测ds18b20问题

[复制链接]
发表于 2018-3-27 22:03:22 | 显示全部楼层 |阅读模式
温度检测一直读的数据为000,复位ds18b20和应答又没有问题。希望大佬教教
代码如下:

#include "bsp_ds18b20.h"
#include "bsp_systick.h"
#include "bsp_usart.h"


void GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(DS18B20_GPIO_CLK,ENABLE);
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;//开漏
        GPIO_InitStructure.GPIO_Pin=DS18B20_GPIO_PIN;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(DS18B20_GPIO_PORT,&GPIO_InitStructure);
       
        GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN);

}

//复位DS18B20
void DS18B20_Reset(void)
{
        DS18B20_0;
        delay_us(750);//至少产生480us的低电位
        DS18B20_1;               
        delay_us(15);
       
}

u8 DS18B20_Answer_Check(void)
{
        u8 retry=0;
        while(Read_GPIO_Pin && retry<200)
        {
                retry++;
                delay_us(1);
        }
        if(retry>=200)//经过200us,存在脉冲还没到
        {
               
                return 1;               
        }
        else
        {
                retry=0;
        }
        while(!Read_GPIO_Pin && retry<240)//存在脉冲到了,且时间不超240us
        {
                retry++;
                delay_us(1);
        }
        if(retry>=240)
        {
       
                return 1;
        }
        else
        {
                return 0;
        }

}

u8 DS18B20_Read_Bit(void)
{
        u8 data;
        DS18B20_0;
        delay_us(2);//起始,产生1us ~15us的低电平
        DS18B20_1;
        delay_us(12);
       
        if(Read_GPIO_Pin)
                data=1;
        else
                data=0;
        delay_us(50);
        return data;
}

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

void DS18B20_Write_Byte(u8 data)
{
        u8 i,temp;
        for(i=0;i<8;i++)
        {
                temp=data & 0x01;
                data=data>>1;
                if(temp)
                {
                        DS18B20_0;
                        delay_us(2);
                        DS18B20_1;
                        delay_us(60);
                }
                else
                {
                        DS18B20_0;
                        delay_us(60);
                        DS18B20_1;
                        delay_us(2);
                }
//                data=data>>1;
        }
       
}


void DS18B20_Start(void)
{
        DS18B20_Reset();
        DS18B20_Answer_Check();
        DS18B20_Write_Byte(0xcc);
        DS18B20_Write_Byte(0x44);

}
u8 DS18B20_Init(void)
{
        GPIO_Config();
        DS18B20_Reset();
        return DS18B20_Answer_Check();
}
       
float DS18B20_Get_T(void)
{
        u8 TL,TH;
        u8 temp;
        short tem;
        DS18B20_Start();
        DS18B20_Reset();
        DS18B20_Answer_Check();
        DS18B20_Write_Byte(0xcc);//skip rom
//        DS18B20_Write_Byte(0x44);
        DS18B20_Write_Byte(0xbe);//convert
        TL=DS18B20_Read_Byte();
        TH=DS18B20_Read_Byte();
//        printf("%d,%d",TL,TH);
       
        if(TH>7)
        {
                TH=~TH;
                TL=~TL;
                temp=0;         //温度为负

   }
        else
                temp=1; //温度为正            

    tem=TH;               //获得高八位

    tem<<=8;   

    tem+=TL;              //获得底八位

    tem=(double)tem*0.625;       //转换   

       if(temp)
                                 return tem;      //返回温度值

       else
                                 return -tem;   
//                tem=(TH<<8)|TL;
//                temp=(~tem)+1;
//                temp*=0.0625;
//        }
//        else
//        {       
//                temp=((TH<<8)|TL)*0.0625;
//        }
//        return temp;

}




#include "stm32f4xx.h"
#include "bsp_usart.h"
#include "bsp_ds18b20.h"
#include "bsp_systick.h"

int main(void)
{
        float temperature;
        USART_Config();
        SysTick_Init();
        while(DS18B20_Init())
        {
                printf("DS18B20 Check failed\r\n");
        }
        printf("DS18B20 Check success\r\n");
        while(1)
        {
                temperature=DS18B20_Get_T();
                printf("%f",temperature);
                delay_us(1000000);

       
        }
}





回复

使用道具 举报

 楼主| 发表于 2018-3-27 22:12:57 | 显示全部楼层
Read_Byte 那个函数的这个错了。
要改成
j=DS18B20_Read_Bit();
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-1 07:18 , Processed in 0.024558 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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