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