stm32 ds18b20 温度传感器

1

1

相关文章:http://blog.csdn.net/zhangxuechao_/article/details/74991985

举例

void DS18B20_in()
{
    GPIO_InitTypeDef gpio = 
    {
        GPIO_Pin_11,
        GPIO_Speed_50MHz,
        GPIO_Mode_IPD
    };  

    GPIO_Init(GPIOG, &gpio);
}

void DS18B20_out()
{
    GPIO_InitTypeDef gpio = 
    {
        GPIO_Pin_11,
        GPIO_Speed_50MHz,
        GPIO_Mode_Out_PP
    };  

    GPIO_Init(GPIOG, &gpio);
}

u8 DS18B20_check()
{
    u8 flag = 0;

    DS18B20_in();

    while(ds18b20_in == 1)
    {
        flag++;
        if(flag > 100)
        {
            return 1;
        }
        delay_us(1); //一次循环1us
    }

    flag = 0;
    while(ds18b20_in == 0)
    {
        flag++;
        if(flag > 240)
        {
            return 1;
        }
        delay_us(1);
    }

    return 0;
}

u8 DS18B20_reset()
{
    DS18B20_out();

    ds18b20_out = 0;
    delay_us(500);  
    ds18b20_out = 1;
    delay_us(1);

    return DS18B20_check();
}

u8 DS18B20_init()
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);   

    return DS18B20_reset();
}

u8 DS18B20_read_bit()
{
    DS18B20_out();

    ds18b20_out = 0;
    delay_us(1);

    ds18b20_out = 1; //释放总线
    delay_us(1);

    DS18B20_out();
    delay_us(15);

    return ds18b20_in;
}

u8 DS18B20_read()
{
    u8 i = 0;
    u8 r, tmp;

    for(i = 0; i < 8; i++)
    {
        tmp = DS18B20_read_bit();
        r = (tmp << 7 | r >> 1);

        delay_us(45);
        ds18b20_out = 1;
        delay_us(1);
    }
    return r;
}

void DS18B20_write(u8 d)
{
    u8 i = 0;
    u8 tmp = 0;
    DS18B20_out();

    for(i = 0; i < 8; i++)
    {
        tmp = d & 0x01;
        d >>= 1;

        ds18b20_out = 0;
        delay_us(1);

        if(tmp == 0)
        {
            delay_us(60);   
        }
        else
        {
            ds18b20_out = 1;            
            delay_us(60);   
        }

        ds18b20_out = 1;    
        delay_us(1);    
    }

}

void DS18B20_ChangeTemp()
{
    DS18B20_write(0xcc); //忽略ROM 
    DS18B20_write(0x44); //温度转换

    return;
}

void DS18B20_ReadTemp()
{
    DS18B20_write(0xcc); 
    DS18B20_write(0xbe); //读取RAM

    return;
}

u16 readTemp()
{
    int temp = 0;
    u8 tmph = 0, tmpl = 0;

    DS18B20_reset(); //必须的
    DS18B20_ChangeTemp();

    DS18B20_reset(); //必须的
    DS18B20_ReadTemp();

    tmpl = DS18B20_read(); //低字节   
    tmph = DS18B20_read(); //高字节       

    temp = tmph;
    temp <<= 8;
    temp |= tmpl; 

    return temp;           
}

int main(void)
{
    while(DS18B20_init() != 0)
    {
        printf("DS18B20_init failed.\n");
        delay_ms(500);
    }
    while(1)
    {
        led1 = ~led1;

        r = readTemp();

        if((r & 0xf800) == 0xf800)
        {
            r = (~r) + 1;
            temp = r * (-0.0625);
        }
        else 
        {
            temp = r * 0.0625;
        }

        printf("temp %.2f\n", temp);

        delay_ms(1000);
    }
}
posted @ 2017-08-17 16:40  thomas_blog  阅读(345)  评论(0编辑  收藏  举报