stm32f103zet6 ds18b20

main.c

c 复制代码
// main.c
#include "sys.h"
#include "ds18b20.h"
 int main(void)
 {	
	uart_init(9600);
	delay_init();
	while(DS18B20_Init())	//DS18B20初始化	
	{
		printf("error");
		delay_ms(200);

	}
   	while(1){
		printf("%4.2f\r\n",Get_Temp());
	}
 }

ds18b20.h

c 复制代码
// ds18b20.h
#ifndef __DS18B20_H
#define __DS18B20_H 
#include "sys.h"   
//DS18B20引脚宏定义						
#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
//控制DS18B20引脚输出高低电平
#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);//初始化DS18B20
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);//DS18B20引脚输出模式控制
u8 DS18B20_Check(void);//检测是否存在DS18B20
void DS18B20_Rst(void);//复位DS18B20   
float Get_Temp(void);
#endif

ds18b20.c

c 复制代码
// ds18b20.c
#include "ds18b20.h"
#include "delay.h"			
void DS18B20_Rst(void)	   
{                 
	DS18B20_Mode(OUT); 	//SET OUTPUT
    DS18B20_Low; 				//拉低DQ
    delay_us(750);    	//拉低750us
    DS18B20_High; 			//DQ=1 
	delay_us(15);     	//15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
/*
复位脉冲执行完之后,总线已经被拉高了;
此时,从机需要给总线拉高;
因此,逻辑是:
	主机切换为输入模式
	判断总线是否仍为高点平,如果超过200us,表示从机没反应,初始化失败;
	如果200us内,总线被从机拉低了,则开始计时拉低的时间,<240us初始化成功,超时则失败
*/
u8 DS18B20_Check(void) 	   
{   
	u8 retry=0;
	DS18B20_Mode(IN);	//SET  INPUT	 
    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;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) 	 
{
    u8 data;
	DS18B20_Mode(OUT);	//SET OUTPUT
    DS18B20_Low; 
	delay_us(2);
    DS18B20_High; 
	DS18B20_Mode(IN);	//SET INPUT
	delay_us(12);
	if(GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN))data=1;
    else data=0;	 
    delay_us(50);           
    return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
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;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 ByteData)     
 {             
    u8 j;
    u8 LastBit;
	DS18B20_Mode(OUT);	//SET OUTPUT;
    for (j = 1;j <= 8;j++){
		//取最后一位 
        LastBit = ByteData&0x01;
        ByteData = ByteData >> 1;
        if (LastBit) {
            DS18B20_Low;	// Write 1
            delay_us(2);                            
            DS18B20_High;
            delay_us(60);             
        }else{
            DS18B20_Low;	// Write 0
            delay_us(60);             
            DS18B20_High;
            delay_us(2);                          
        }
    }
}
//开始温度转换
void DS18B20_Start(void) {   						               
    DS18B20_Rst();	   
	DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);	// skip rom
    DS18B20_Write_Byte(0x44);	// convert
} 

//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在    	 
u8 DS18B20_Init(void)
{
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(DS18B20_GPIO_CLK, ENABLE);	 //使能PORTA口时钟 
 	GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;				//PORTA.6 推挽输出
 	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();
}  
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
	short tem;
    DS18B20_Start ();  			// ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);	// skip rom
    DS18B20_Write_Byte(0xbe);	// convert	    
    TL=DS18B20_Read_Byte(); 	// LSB   
    TH=DS18B20_Read_Byte(); 	// MSB  
	    	  
    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);	 //使能PORTA口时钟
	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;
}

 
相关推荐
aloneboyooo4 小时前
SPI通信-(STM32)
stm32·单片机·嵌入式硬件
唯创知音5 小时前
基于W2605C语音识别合成芯片的智能语音交互闹钟方案-AI对话享受智能生活
人工智能·单片机·物联网·生活·智能家居·语音识别
爱学电子的刻刻帝6 小时前
STM32传感器系列:GPS定位模块
stm32·单片机·嵌入式硬件·gps
lucy153027510797 小时前
DC-DC 降压转换器设计提示和技巧
单片机·嵌入式硬件·智能手机·便携式视盘播放器·cd-rom
沐欣工作室_lvyiyi8 小时前
基于单片机的核辐射探测系统设计(论文+源码)
stm32·单片机·嵌入式硬件·物联网·智能家居
就叫飞六吧8 小时前
STC单片机内部常见寄存器及其作用
单片机·嵌入式硬件
ElePower95278 小时前
STM32学习(四)
stm32·嵌入式硬件
沐欣工作室_lvyiyi8 小时前
基于单片机的智慧农业大棚系统(论文+源码)
单片机·嵌入式硬件·fpga开发·毕业设计·单片机毕业设计
云山工作室11 小时前
基于单片机设计了居家智能音箱系统(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设·智能音箱
WU-有点东13 小时前
U8G2库使用案例(stm32)
stm32·单片机·嵌入式硬件