#include "stm8s.h"
#include "ds18b20.h"
#include "delay.h"
//-----复位-----
void resetOnewire(void)
{
OUT_DQ();
SET_DQ();
delay_us(750);
CLR_DQ();
delay_us(100);
IN_DQ();
//while(GET_DQ());
while(!(GET_DQ()));
OUT_DQ();
SET_DQ();
}
//-----读数据-----
u8 rOnewire(void)
{
u8 data=0,i=0;
OUT_DQ();
SET_DQ();
for(i=0;i<8;i++)
{
data=data>>1;
OUT_DQ();
CLR_DQ();
delay_us(5);
SET_DQ();
delay_us(5);
IN_DQ();
if(GET_DQ()) data|=0x80;
else data&=0x7f;
delay_us(65);
SET_DQ();
}
return(data);
}
//-----写数据-----
void wOnewire(u8 data)
{
u8 i=0;
OUT_DQ();
for(i=0;i<8;i++)
{
CLR_DQ();
delay_us(10);
if(data&0x01)
{
SET_DQ();
}
else
{
CLR_DQ();
}
delay_us(70); //65
SET_DQ();
delay_us(10);
data=data>>1;
}
}
//-----DS18B20转换温度-----
void convertDs18b20(void)
{
resetOnewire();
wOnewire(0xcc);
wOnewire(0x44);
}
//------------DS18BB0读温度----------
u8 readTemp(void)
{
u8 temp1,temp2;
convertDs18b20();
resetOnewire();
wOnewire(0xcc);
wOnewire(0xbe);
temp1=rOnewire();
temp2=rOnewire();
return (((temp2<<8)|temp1)*6.25);
}
这是.C部分#ifndef __DS18B20_H__
#define __DS18B20_H__
#define SET_DQ() GPIO_WriteHigh(GPIOD,GPIO_PIN_0) //拉高
#define CLR_DQ() GPIO_WriteLow(GPIOD,GPIO_PIN_0) //拉低
#define IN_DQ() GPIO_Init(GPIOD,GPIO_PIN_0,GPIO_MODE_IN_FL_NO_IT)//浮空
#define OUT_DQ() GPIO_Init(GPIOD,GPIO_PIN_0,GPIO_MODE_OUT_PP_HIGH_FAST)//推挽
#define GET_DQ() GPIO_ReadInputPin(GPIOD, GPIO_PIN_0)//DQ值
u8 readTemp(void);
void resetOnewire(void);
u8 rOnewire(void);
void wOnewire(u8 data);
void convertDs18b20(void) ;
#endif
这是IO的配置。就是无法显示温度,串口一直显示f9。
求各位大神帮忙!! |