DS18B20 HAL库 驱动,供参考

#include "18B20.h"
#include "usart.h"
#include "stdio.h"
#include "delay.h"
//初始化,返回1表示成功
uint8_t DS18B20_init(void){

	DS18B20_reset();
	if(DS18B20_check()){
		DS18B20_reset();
		DS18B20_check();
		return 1;
	}else{
		return 0;
	}

}
//获取温度
float DS18B20_get(void){
	struct temparature DS18B20_temp;
	float value=0;
	uint8_t tmp;
	DS18B20_reset();
	DS18B20_check();
	DS18B20_writeByte(0xcc);
	DS18B20_writeByte(0x44);
	do{
		tmp = DS18B20_readByte();
	}while(tmp != 0xff);
	
	DS18B20_reset();
	DS18B20_check();
	DS18B20_writeByte(0xcc);
	DS18B20_writeByte(0xbe);	
	DS18B20_temp.value = DS18B20_readByte();
	DS18B20_temp.symbol = DS18B20_readByte();
	
	if(DS18B20_temp.symbol>7){
			value = ((uint16_t)(DS18B20_temp.symbol&0x1f))<<8;
			value += DS18B20_temp.value;
			printf("-");
			printf("%f\n",value);
		return -value;
		}else{
			value = ((uint16_t)DS18B20_temp.symbol)<<8;
			value += DS18B20_temp.value;
			printf("当前温度:+");
			printf("%f\n",value*0.0625);
			return value;
		}
}
//复位
void DS18B20_reset(void){
	HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_RESET);
	delay_us(750);
	HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_SET);
	delay_us(15);
}
//响应
uint8_t DS18B20_check(void){
	uint16_t count=0;
	while(HAL_GPIO_ReadPin(DQ_GPIO_Port, DQ_Pin)&&count<200){
		delay_us(1);
		count++;
	}
	if(count>=200){
		return 0;
	}else{
		count=0;
	}
	while(HAL_GPIO_ReadPin(DQ_GPIO_Port, DQ_Pin)==0&&count < 240){
		delay_us(1);
		count++;
	}
	if(count>=240){
		return 0;
	}
	return 1;
}
//读位
uint8_t DS18B20_readBit(void){

	uint8_t tmp;
	HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_RESET);
	delay_us(2);
	HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_SET);
	delay_us(11);
	tmp = HAL_GPIO_ReadPin(DQ_GPIO_Port, DQ_Pin);
	delay_us(50);
	return tmp;
}
//读字节
uint8_t DS18B20_readByte(void){	
	uint8_t return_val=0;
	for(int i=0;i<8;i++){
		return_val = (return_val>>1) | DS18B20_readBit()<<7;
	}
	return return_val;
}
//写字节
void DS18B20_writeByte(uint8_t data){
	
	uint8_t j;
  uint8_t testb;
    for (j=1;j<=8;j++) 
	{
        testb=data&0x01;
        data=data>>1;
        if (testb) 
        {
            HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_RESET);
            delay_us(2);                            
            HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_SET);
            delay_us(60);             
        }
        else 
        {
            HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_RESET);
            delay_us(60);             
            HAL_GPIO_WritePin(DQ_GPIO_Port, DQ_Pin, GPIO_PIN_SET);
            delay_us(2);                          
        }
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值