DS18B20 基于HAL库 IO模拟及注意事项

#ifndef __DS18B20_H
#define __DS18B20_H

#include "gpio.h"
#include "tim.h"

#define DS18B20_DQ_OUT_LOW()  do{ HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_RESET); }while(0)
#define DS18B20_DQ_OUT_HIGH() do{ HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_SET); }while(0)
#define DS18B20_DQ_IN 			HAL_GPIO_ReadPin(DQ_GPIO_Port,DQ_Pin)

short DS18B20_Get_Temperature(void);
uint8_t DS18B20_Init(void);

extern short DS18B20_Temp;
#endif

注:IIC必须加上拉电阻,模拟IIC可以设置为开漏输出模式,实现共享总线和双向通信。无需重复配置输入输出。(18B20暂时没有测试过,想起来补充了下)

#include "DS18B20.h"

short DS18B20_Temp=0;       //温度值

/*设置DQ口为输入模式*/
void DS18B20_IO_IN(){
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.Pin = DQ_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(DQ_GPIO_Port, &GPIO_InitStruct);
}
/*设置DQ口为输出模式*/
void DS18B20_IO_OUT(){
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = DQ_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(DQ_GPIO_Port,&GPIO_InitStruct);
}

void DS18B20_Rst(void){
    DS18B20_IO_OUT();
    DS18B20_DQ_OUT_LOW();
    delay_us(750);
    DS18B20_DQ_OUT_HIGH();
    delay_us(2);
}

uint8_t DS18B20_Check(void){
    uint8_t retry = 0;
    DS18B20_IO_IN();
    while(DS18B20_DQ_IN && retry < 200){
        retry++;
        delay_us(2);
    }

    if(retry >= 200)
        return 1;
    else
        retry = 0;

    while(!DS18B20_DQ_IN && retry < 240){
        retry++;
        delay_us(2);
    }

    if(retry >= 240)
        return 1;

    return 0;
}

uint8_t DS18B20_Read_Bit(void){
    uint8_t data;
    DS18B20_IO_OUT();
    DS18B20_DQ_OUT_LOW();
    delay_us(2);
    DS18B20_DQ_OUT_HIGH();
    DS18B20_IO_IN();
    delay_us(2);

    if(DS18B20_DQ_IN)
        data = 1;
    else
        data = 0;

    delay_us(50);
    return data;
}

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

void DS18B20_Write_Byte(uint8_t data){
    uint8_t j;
    uint8_t testb;
    DS18B20_IO_OUT();
    for(j=1;j<=8;j++){
        testb=data&0x01;
        data=data>>1;
        if(testb){
            DS18B20_DQ_OUT_LOW();
            delay_us(2);
            DS18B20_DQ_OUT_HIGH();
            delay_us(60);
        }else{
            DS18B20_DQ_OUT_LOW();
            delay_us(60);
            DS18B20_DQ_OUT_HIGH();
            delay_us(2);
        }
    }
}

void DS18B20_Start(void){
    DS18B20_Rst();
    DS18B20_Check();
    DS18B20_Write_Byte(0xcc);
    DS18B20_Write_Byte(0x44);
}

uint8_t DS18B20_Init(void){

    DS18B20_Rst();
    return DS18B20_Check();
}

short DS18B20_Get_Temperature(void){
    uint8_t temp;
    uint8_t TL,TH;
    short temperature;

    DS18B20_Start();
    DS18B20_Rst();
    DS18B20_Check();
    DS18B20_Write_Byte(0xcc);
    DS18B20_Write_Byte(0xbe);
    TL = DS18B20_Read_Byte();
    TH = DS18B20_Read_Byte();

    if(TH>7){
        TH = ~TH;
        TL = ~TL;
        temp = 0;
    }else
        temp = 1;

    temperature = TH;
    temperature <<= 8;
    temperature += TL;
    temperature = (float)temperature*0.625;
    if(temperature)
        return temperature;
    else
        return -temperature;
}

调用:DS18B20_Temp=DS18B20_Get_Temperature();

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风飘零翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值