#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();