温度检测一直读的数据为000,复位ds18b20和应答又没有问题。希望大佬教教
代码如下:
#include "bsp_ds18b20.h"
#include "bsp_systick.h"
#include "bsp_usart.h"
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(DS18B20_GPIO_CLK,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;//开漏
GPIO_InitStructure.GPIO_Pin=DS18B20_GPIO_PIN;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(DS18B20_GPIO_PORT,&GPIO_InitStructure);
GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN);
}
//复位DS18B20
void DS18B20_Reset(void)
{
DS18B20_0;
delay_us(750);//至少产生480us的低电位
DS18B20_1;
delay_us(15);
}
u8 DS18B20_Answer_Check(void)
{
u8 retry=0;
while(Read_GPIO_Pin && retry<200)
{
retry++;
delay_us(1);
}
if(retry>=200)//经过200us,存在脉冲还没到
{
return 1;
}
else
{
retry=0;
}
while(!Read_GPIO_Pin && retry<240)//存在脉冲到了,且时间不超240us
{
retry++;
delay_us(1);
}
if(retry>=240)
{
return 1;
}
else
{
return 0;
}
}
u8 DS18B20_Read_Bit(void)
{
u8 data;
DS18B20_0;
delay_us(2);//起始,产生1us ~15us的低电平
DS18B20_1;
delay_us(12);
if(Read_GPIO_Pin)
data=1;
else
data=0;
delay_us(50);
return data;
}
u8 DS18B20_Read_Byte(void)
{
u8 i=0,j,data=0;
for(i=0;i<8;i++)
{
j=Read_GPIO_Pin;
// data=data|(j<<i);
data=(j<<7)|(data>>1);
}
return data;
}
void DS18B20_Write_Byte(u8 data)
{
u8 i,temp;
for(i=0;i<8;i++)
{
temp=data & 0x01;
data=data>>1;
if(temp)
{
DS18B20_0;
delay_us(2);
DS18B20_1;
delay_us(60);
}
else
{
DS18B20_0;
delay_us(60);
DS18B20_1;
delay_us(2);
}
// data=data>>1;
}
}
void DS18B20_Start(void)
{
DS18B20_Reset();
DS18B20_Answer_Check();
DS18B20_Write_Byte(0xcc);
DS18B20_Write_Byte(0x44);
}
u8 DS18B20_Init(void)
{
GPIO_Config();
DS18B20_Reset();
return DS18B20_Answer_Check();
}
float DS18B20_Get_T(void)
{
u8 TL,TH;
u8 temp;
short tem;
DS18B20_Start();
DS18B20_Reset();
DS18B20_Answer_Check();
DS18B20_Write_Byte(0xcc);//skip rom
// DS18B20_Write_Byte(0x44);
DS18B20_Write_Byte(0xbe);//convert
TL=DS18B20_Read_Byte();
TH=DS18B20_Read_Byte();
// printf(&quot;%d,%d&quot;,TL,TH);
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0; //温度为负
}
else
temp=1; //温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL; //获得底八位
tem=(double)tem*0.625; //转换
if(temp)
return tem; //返回温度值
else
return -tem;
// tem=(TH<<8)|TL;
// temp=(~tem)+1;
// temp*=0.0625;
// }
// else
// {
// temp=((TH<<8)|TL)*0.0625;
// }
// return temp;
}
#include &quot;stm32f4xx.h&quot;
#include &quot;bsp_usart.h&quot;
#include &quot;bsp_ds18b20.h&quot;
#include &quot;bsp_systick.h&quot;
int main(void)
{
float temperature;
USART_Config();
SysTick_Init();
while(DS18B20_Init())
{
printf(&quot;DS18B20 Check failed\r\n&quot;);
}
printf(&quot;DS18B20 Check success\r\n&quot;);
while(1)
{
temperature=DS18B20_Get_T();
printf(&quot;%f&quot;,temperature);
delay_us(1000000);
}
} |