最近想用stm32做个温度检测的小作品 用的是DS18B20 出现了一点问题实在是搞不定了 希望各位大神指点指点
1:开发板每次上电都显示85度 且温度不会改变
2:每次重新下载程序 都会显示温度 显示的温度和室温接近 但是温度不会改变
自己感觉是DS18B20不能更新温度 只显示第一次检测到的温度 不知道是程序哪里出了问题
程序如下
----------------------------DS18B20.C------------------------------------------------
#include "DS18B20.h"
#define Reset_DQ() GPIO_ResetBits(GPIOG,GPIO_Pin_14);
#define Set_DQ() GPIO_SetBits(GPIOG,GPIO_Pin_14);
#define Get_DQ() GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_14);
void GPIO_DQ_Out_Mode(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
}
void GPIO_DQ_Input_Mode(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
}
unsigned char Init_DS18B20(void)
{
unsigned char dat = 0;
GPIO_DQ_Out_Mode();
Set_DQ();
Delay_us(5);
Reset_DQ();
Delay_us(50);
Set_DQ();
Delay_us(4);
GPIO_DQ_Input_Mode();
while(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_14));
while(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_14)==0);
Delay_us(50);
GPIO_DQ_Out_Mode();
// Set_DQ();
return dat;
}
unsigned char ReadOneChar(void)
{
unsigned char i = 0;
unsigned char dat = 0;
for(i=0;i<8;i++)
{
GPIO_DQ_Out_Mode();
dat>>=1;
Reset_DQ();
Delay_us(0.2);
Set_DQ();
GPIO_DQ_Input_Mode();
Delay_us(0.1);
if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_14))
{dat|=0x80;}
Delay_us(7);
}
GPIO_DQ_Out_Mode();
Set_DQ();
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
GPIO_DQ_Out_Mode();
for(i=0;i<8;i++)
{
if(dat&0x01)
{
Reset_DQ();
Delay_us(1);
Set_DQ();
Delay_us(7);
}
else
{
Reset_DQ();
Delay_us(7);
Set_DQ();
Delay_us(0.5);
}
dat>>=1;
}
}
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0x33);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Delay_us(1000);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
b<<=8;
t=a+b;
return(t);
}
----------------------------------------------------------------
------------------------------------------main.c----------------------------------------------------------
/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2013-xx-xx
* @brief óÃ3.5.0°æ±¾¿a½¨μÄ1¤3ìÄ£°å
******************************************************************************
* @attention
*
* êμÑéƽì¨:ò°»e iSO STM32 ¿a·¢°å
* ÂÛì3 :
http://www.123.com
* ìÔ±| :
http://32.taobao.com
*
******************************************************************************
*/
#include "stm32f10x.h"
#include "systick.h"
#include "lcd1602.h"
#include "DS18B20.h"
#include "stdio.h"
/**
* @brief Ö÷oˉêy
* @param ÎT
* @retval ÎT
*/
//unsigned int ReadTempFlag;
int main(void)
{
int temp;
float temperature;
char displaytemp[16];
GPIO_1602_Config();
SysTick_Init();
LCD_Init();
DelayMs(20);
LCD_Clear();
LCD_Write_Char(13,1,' ');
LCD_Write_Char(14,1,'C');
while (1)
{
int Ltemp=0;
temp=ReadTemperature();
if(Ltemp!=temp)
{
Ltemp=temp;
temperature=(float)Ltemp*0.0625;
sprintf(displaytemp,"Temp % 7.3f",temperature);
LCD_Write_String(0,1,displaytemp);
}
}
}
/*********************************************END OF FILE**********************/