stm32f103采集DS18B20温度驱动程序

include "stm32f10x.h"
#include "delay.h"
#define DQ_READ GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)



//功能描述:DS18B20初始化
void DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

// 配置IO口
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //配置IO为浮空输入模式
GPIO_Init(GPIOC,&GPIO_InitStructure);

}



//函数名称:DQ_Mode
// 功能描述:DS18B20 IO控制脚

void DQ_Mode(u8 mode)
{

GPIO_InitTypeDef GPIO_InitStructure;
if(mode==DOUT)
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; // 配置IO为开漏输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //配置IO口的输出速率是50M
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_WriteBit(GPIOC,GPIO_Pin_5,Bit_RESET);

}
else
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}

}

//功能描述:DS18B20 初始化序列
u8 DS18B20_Reset(void)
{
u8 ack = 1;
DQ_Mode(DOUT);
Delay(480);
DQ_Mode(DIN);
Delay(60);
ack = DQ_READ;
Delay(250);
return ack;
}


// 函数名称:DS18B20_Write
//功能描述:向DS18B20写入一个字节

void DS18B20_Write (u8 dat )
{
u8 i = 0;
for(i=0;i<8;i++)
{
DQ_Mode(DOUT);
Delay(1);
if(dat&0x01)
DQ_Mode(DIN);
else DQ_Mode(DOUT);
Delay(40);
DQ_Mode(DIN);
dat >>= 1;
Delay(1);
}
}



//功能描述:读DS18B20 的数据

u8 DS18B20_Read (void)
{
u8 i = 0;
u8 dat = 0;
for(i=0;i<8;i++)
{
DQ_Mode(DOUT);
Delay(1);
DQ_Mode(DIN);
dat >>= 1;
Delay(7);
if(DQ_READ)
{
dat |= 0x80;
}
Delay(60);
}
return dat;
}
//功能描述:读DS18B20 的温度

u16 Get_DS18B20_Tmp(void)
{
u8 a[2];
u32 temp;
if(DS18B20_Reset()) return 0;
DS18B20_Write(0xCC);
DS18B20_Write(0x44);

if(DS18B20_Reset()) return 0;
DS18B20_Write(0xCC);
DS18B20_Write(0xBE);
a[0] = DS18B20_Read();
a[1]= DS18B20_Read();

temp = (a[1]<<8)|a[0];
if(temp&0xF000)
{
temp=(~temp+1)&0xffff;
temp = temp*625/1000;
temp =(~temp+1)&0xffff;
}
else
temp = temp*62

5/1000; //温度值

return (u16)temp;
}

int MAIN(viod)
{
DS18B20_Init();
while(1)
{

Temperature4=Get_DS18B20_Tmp()/10;
}


}

相关文档
最新文档