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;
}