OpenEdv-开源电子网

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

为何我编的这个用DS18B20读出的温度值会一直在上升啊?

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-2-25
在线时间
7 小时
发表于 2020-3-26 13:18:28 | 显示全部楼层 |阅读模式
10金钱
#include<DS18B20.h>
#include<delay.h>


u8 DS18B20_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStrue;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
   
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_11;
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOG,&GPIO_InitStrue);
   
    GPIO_SetBits(GPIOG,GPIO_Pin_11);
   
    DS18B20_RESET();
   
    return DS18B20_WAIT_ACT();
}

void DS18B20_CON(void)
{
    DS18B20_IO_OUT;
    DS18B20_WRITE_BYTE(0xcc);//Skip ROM
    DS18B20_WRITE_BYTE(0x4e);//写命令
    DS18B20_WRITE_BYTE(0x75);
    DS18B20_WRITE_BYTE(0x00);
    DS18B20_WRITE_BYTE(0x7f);
    DS18B20_RESET();
    DS18B20_WAIT_ACT();
}


void DS18B20_RESET(void)
{
    DS18B20_IO_OUT;
    DS18B20_DQ_OUT=0;
    delay_us(750);
    DS18B20_DQ_OUT=1;
    delay_us(15);
}

u8 DS18B20_WAIT_ACT(void)  //返回值  1:成功,0:失败
{
    u8 i=0;
    DS18B20_IO_IN;
    while(DS18B20_DQ_IN&&i<200)
    {
        i++;
        delay_us(1);
    }
    if(i>=200) return 0;
    i=0;
    while(!DS18B20_DQ_IN&&i<240)
    {
        i++;
        delay_us(1);
    }
    if(i>=240) return 0;
    return 1;
}


u8 DS18B20_READ_BIT(void)
{
    u8 bit;
    DS18B20_IO_OUT;
    DS18B20_DQ_OUT=0;
    delay_us(2);
    DS18B20_DQ_OUT=1;
    DS18B20_IO_IN;
    delay_us(12);
    if(DS18B20_DQ_IN) bit=1;
    else bit=0;
    delay_us(50);
    return bit;
}


void DS18B20_WRITE_BYTE(u8 dat)
{
    u8 i;
    DS18B20_IO_OUT;
    for(i=0;i<8;i++)
    {
        if((dat&0x01)==0x01)
        {
            DS18B20_DQ_OUT=0;
            delay_us(2);
            DS18B20_DQ_OUT=1;
            delay_us(60);
        }
        else
        {
            DS18B20_DQ_OUT=0;
            delay_us(60);
            DS18B20_DQ_OUT=1;
            delay_us(2);
        }
        dat>>=1;
    }
}

u8 DS18B20_READ_BYTE(void)
{
    u8 i,j=0,temp=0;
    for(i=0;i<8;i++)
    {
        j=DS18B20_READ_BIT();
        temp=(temp>>1)|(j<<7);
    }
    return temp;
}
float DS18B20_GET_Tempture(void)
{
    u8 TL,TH;
    short tem;
    float temp;
    DS18B20_START();
    DS18B20_RESET();
    DS18B20_WAIT_ACT();
    DS18B20_WRITE_BYTE(Skip_ROM);
    DS18B20_WRITE_BYTE(Read_Scratchpad);
    TL=DS18B20_READ_BYTE();
    TH=DS18B20_READ_BYTE();
    DS18B20_RESET();
    tem=TH;
    tem<<=8;
    tem+=TL;
    if(tem<0)
    {
        tem=~tem;
        tem++;
        temp=tem*0.0625;
        temp=-temp;
    }
    else
    {
        temp=tem*0.0625;
    }
    return temp;  
}

void DS18B20_START(void)
{
    DS18B20_RESET();
    DS18B20_WAIT_ACT();
    DS18B20_WRITE_BYTE(Skip_ROM);  //跳过ROM
    DS18B20_WRITE_BYTE(Convert_T);   //温度转换
}


主函数:
#include<stm32f10x.h>
#include<sys.h>
#include<led.h>
#include<usart.h>
#include<delay.h>
#include<DS18B20.h>

int main()
{
    u8 i=0;
    float temp;
    delay_init();
    LED_init();
    uart_init(115200);
    while(!DS18B20_INIT());
    while(1)
    {
        if(i==15)
        {
            temp=DS18B20_GET_Tempture();
            if(temp>=0)
            {
                printf("%.4f\r\n",temp);
            }
            else
            {
                temp=-temp;   
                printf("-%.4f\r\n",temp);
            }
        }
        i++;
        delay_ms(50);
        if(i>=20)
        {
            i=0;
            LED0=!LED0;
        }
    }
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2020-3-26 14:59:56 | 显示全部楼层
这个是103ZET6的DS18B20的程序,可以参考一下

实验30 18B20数字温度传感器实验.rar

328.51 KB, 下载次数: 13

回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-2-25
在线时间
7 小时
 楼主| 发表于 2020-3-26 18:27:00 | 显示全部楼层
hou18 发表于 2020-3-26 14:59
这个是103ZET6的DS18B20的程序,可以参考一下

我改的都要和提供的程序差不多了,但是一上电还是一直在升温。
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2019-9-25
在线时间
21 小时
发表于 2020-4-6 16:24:12 | 显示全部楼层
是不是18B20坏了
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-4-7
在线时间
3 小时
发表于 2020-4-7 09:33:52 | 显示全部楼层
或者硬件反了,负的了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 21:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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