main.c
#include "sys.h"
#include "ds18b20.h"int main(void){ uart_init(9600);delay_init();while(DS18B20_Init()) {printf("error");delay_ms(200);}while(1){printf("%4.2f\r\n",Get_Temp());}}
ds18b20.h
#ifndef __DS18B20_H
#define __DS18B20_H
#include "sys.h"
#define DS18B20_GPIO_PORT GPIOB
#define DS18B20_GPIO_PIN GPIO_Pin_12
#define DS18B20_GPIO_CLK RCC_APB2Periph_GPIOB
#define OUT 1
#define IN 0
#define DS18B20_Low GPIO_ResetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)
#define DS18B20_High GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)
u8 DS18B20_Init(void);
short DS18B20_Get_Temp(void);
void DS18B20_Start(void);
void DS18B20_Write_Byte(u8 dat);
u8 DS18B20_Read_Byte(void);
u8 DS18B20_Read_Bit(void);
void DS18B20_Mode(u8 mode);
u8 DS18B20_Check(void);
void DS18B20_Rst(void);
float Get_Temp(void);
#endif
ds18b20.c
#include "ds18b20.h"
#include "delay.h"
void DS18B20_Rst(void)
{ DS18B20_Mode(OUT); DS18B20_Low; delay_us(750); DS18B20_High; delay_us(15);
}
u8 DS18B20_Check(void)
{ u8 retry=0;DS18B20_Mode(IN); while (GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)&&retry<200){retry++;delay_us(1);}; if(retry>=200)return 1;else retry=0;while (!GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1; return 0;
}
u8 DS18B20_Read_Bit(void)
{u8 data;DS18B20_Mode(OUT); DS18B20_Low; delay_us(2);DS18B20_High; DS18B20_Mode(IN); delay_us(12);if(GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN))data=1;else data=0; delay_us(50); return data;
}
u8 DS18B20_Read_Byte(void)
{ u8 i,j,dat;dat=0;for (i=1;i<=8;i++){j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);} return dat;
}
void DS18B20_Write_Byte(u8 ByteData) { u8 j;u8 LastBit;DS18B20_Mode(OUT); for (j = 1;j <= 8;j++){LastBit = ByteData&0x01;ByteData = ByteData >> 1;if (LastBit) {DS18B20_Low; delay_us(2); DS18B20_High;delay_us(60); }else{DS18B20_Low; delay_us(60); DS18B20_High;delay_us(2); }}
}
void DS18B20_Start(void) { DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc); DS18B20_Write_Byte(0x44);
}
u8 DS18B20_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS18B20_GPIO_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN); DS18B20_Rst();return DS18B20_Check();
}
short DS18B20_Get_Temp(void)
{u8 temp;u8 TL,TH;short tem;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; tem=TH; tem<<=8; tem+=TL; tem=(float)tem*0.625; if(temp)return tem; else return -tem;
}void DS18B20_Mode(u8 mode)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS18B20_GPIO_CLK, ENABLE); if(mode){GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;}else{GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;}GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);
}
float Get_Temp(void){short temperature = 0;temperature = DS18B20_Get_Temp(); float temp = (float)temperature/10;return temp;
}