直接上代码!
DS18B20.c
#include "DS18B20.h"
#include "../../Userxcode/Delay/delay.h"
void DS18B20_Reset(void)
{
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
delay_us(750);
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
//delay_us(15);
delay_us(30);
}
uint8_t DS18B20_Check(void)
{
uint8_t retry = 0;
uint8_t retval = 0;
while(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_11) && retry < 200)
{
retry++;
delay_us(1);
}
if(retry >= 200) return retval = 1; //
else retry = 0;
while(!HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_11) && retry < 240)
{
retry++;
delay_us(1);
}
if(retry >= 240) retval =1;
return retval;
}
uint8_t DS18B20_Init(void)
{
DS18B20_Reset();
return DS18B20_Check();
}
void DS18B20_Write_Byte(uint8_t data)
{
uint8_t i,testb;
for(i=0; i<8; i++)
{
testb=data&0x01;
data=data>>1;
if(testb)
{
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
delay_us(2);
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
delay_us(60);
}
else
{
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
delay_us(60);
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
delay_us(2);
}
}
/*uint8_t testb;
for(testb=0x01;testb!=0;testb<<=1)
{
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
delay_us(2);
if((testb&data)==0) HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
else HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
delay_us(60);
}*/
}
uint8_t DS18B20_Read_Bit(void)
{
uint8_t data=0;
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
delay_us(2);
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
delay_us(12);
if(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_11))
{
data=1;
}
delay_us(50);
return data;
}
uint8_t DS18B20_Read_Byte(void)
{
uint8_t i,b,data=0;
for(i=0; i<8; i++)
{
b=DS18B20_Read_Bit();
data |= b<<i;
}
return data;
}
void DS18B20_Start(void)
{
DS18B20_Reset();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);
DS18B20_Write_Byte(0x44);
}
float DS18B20_GetTemperture(void)
{
uint16_t temp;
uint8_t DataH,DataL;
float value;
DS18B20_Start(); //
DS18B20_Reset();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);
DS18B20_Write_Byte(0xbe);
DataL=DS18B20_Read_Byte();
DataH=DS18B20_Read_Byte();
temp=DataH;
temp=(temp<<8)+DataL;
if((temp&0xF800)==0xF800)
{
temp=(~temp)+1;
value=temp*0.0625;
}
else
{
value=temp*0.0625;
}
return value;
}
DS18B20.h
#ifndef DS18B20_DS18B20_H_
#define DS18B20_DS18B20_H_
#include "stm32f1xx_hal.h" //HAL库文件声明
#include "main.h" //IO定义与初始化函数在main.c文件中,必须引用
uint8_t DS18B20_Init(void);
float DS18B20_GetTemperture(void);
void DS18B20_Start(void);
void DS18B20_Write_Byte(uint8_t data);
uint8_t DS18B20_Check(void);//应答
uint8_t DS18B20_Read_Byte(void);
uint8_t DS18B20_Read_Bit(void);
void DS18B20_Reset(void);
#endif /* DS18B20_DS18B20_H_ */
main.c
int main()
{
uint16_t Value_T=0;
uint16_t D3[3];
float Temperture=0.0;
while(DS18B20_Init())
{
printf("等待 DS18B20 应答,请检查硬件!\r\n");
HAL_Delay(500);
}
printf("收到应答 DS18B20 初始化成功!\r\n");
while(1)
{
Temperture=DS18B20_GetTemperture();
Value_T=(uint16_t)100*Temperture;
D3[0]=Value_T/1000;
D3[1]=Value_T%1000/100;
D3[2]=Value_T%1000;
if(Temperture<0)
{
printf("检测温度为: ");
}
else
{
printf("数据采集实验 3:DAQ(DS18B20) 检测温度为: ");
}
printf("%.2f°C\r\n",Temperture);
}
}
引脚设置
注:侵权删!!