打印

stm32f429 温度检测ds18b20问题

[复制链接]
703|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子学长|  楼主 | 2020-4-25 21:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
温度检测一直读的数据为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);

        
        }
}

使用特权

评论回复

相关帖子

沙发
ningling_21| | 2020-4-25 22:21 | 只看该作者
示波器测一下数据线波形就知道了

使用特权

评论回复
板凳
maximQ820270087| | 2020-6-18 17:45 | 只看该作者
验证成功的例程

/*所用单片机型号为STC89C52RC,晶振为11.0592MHz*/

#include<reg52.h>

#include<intrins.h>



sbit Bus=P1^1;//数据单总线



unsigned int Ds_Result();//返回最终结果
bit DS_Init();//初始化子函数
void Ds_Write(unsigned char dat);//“写”子函数(用于向总线写命令)
unsigned char Ds_Read();//“读”子函数(用于从总线读值)
void Ds_Change();//开始转换温度
unsigned int Get_Temp();//获取温度子函数
void Delay10us(unsigned int t);//延时10*t微秒

void Delay1ms(unsigned int t);



/*ds18b20 10*t延时函数*/
void Delay10us(unsigned int t)
{
    unsigned int i;
    for(i=t;i>0;i--)
    {
        _nop_();  _nop_();
        _nop_();  _nop_();
        _nop_();  _nop_();
    }
}




/*dsb8b20 1ms延时函数*/
void Delay1ms(unsigned int t)   //误差 0us
{
    unsigned char a,b,c;
        for(t;t>0;t--)
            for(c=1;c>0;c--)
                for(b=142;b>0;b--)
                    for(a=2;a>0;a--);
}
/*ds18b20初始化*/
bit Ds_Init()
{
        bit ack;
        Bus=0;
        Delay10us(60);//最小480,最大960
        Bus=1;
        Delay10us(6);//15-60us
       

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

424

主题

447

帖子

1

粉丝