stm32 驅動DS18B20溫度感測器
阿新 • • 發佈:2019-01-23
#include "temp.h"
#defineu8 uint8_t
#defineu16 uint16_t
#defineu32 uint32_t
#define DS18B20_PORT GPIOA
#define DS18B20_PIN GPIO_Pin_1
#define DS18B20_CLK RCC_APB2Periph_GPIOA
#define RW1820_DQ_HIGH GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
#define RW1820_DQ_LOW GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);
//---------------------------------------------------------------------------//
void _delay_us(uint16_t nCount)
{
nCount *= 3;
while(--nCount);
}
//-----------------------------------------------------------------------------//
static void RW1820_DQ_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
//--------------------------------------------------------
static void RW1820_DQ_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
//--------------------------------------------------------
void RW1820_Init(void)
{
u8 retry=0;
RW1820_DQ_OUT();
RW1820_DQ_HIGH;
_delay_us(50);
RW1820_DQ_LOW;
_delay_us(500); //480 - 960
RW1820_DQ_HIGH;
_delay_us(40);//15-60
RW1820_DQ_IN(); //
while(RW1820_DQ_VALUE==1&& (retry<100))
{
retry++;
_delay_us(10);
}
RW1820_DQ_OUT();
RW1820_DQ_HIGH;
_delay_us(400);
}
//-------------
void RW1820_WriteByte(unsigned char _data)
{
int i = 0;
RW1820_DQ_OUT();
_delay_us(10);
for (i = 0; i < 8; i++)
{
RW1820_DQ_LOW; //
_delay_us(2); //
if (_data & 0x01)
{
RW1820_DQ_HIGH; //
}
else RW1820_DQ_LOW;
_delay_us(60); //60
RW1820_DQ_HIGH;
_data = _data >> 1;
}
}
//-------------
unsigned char RW1820_ReadByte(void)
{
int i = 0, _data = 0;
_delay_us(10);
for (i = 0; i < 8; i++)
{
RW1820_DQ_OUT();
RW1820_DQ_LOW;
_data >>= 1;
_delay_us(2);
RW1820_DQ_HIGH;
RW1820_DQ_IN();
if(RW1820_DQ_VALUE)
{
_data |= 0x80;
}
_delay_us(60); //60us
}
return _data;
}
int RW1820_ReadTemperature(void)
{
unsigned char temp;
unsigned int t;
RW1820_Init(); //
RW1820_WriteByte(0xcc);//
RW1820_WriteByte(0x44);//
_delay_us(10);
RW1820_Init();
RW1820_WriteByte(0xcc);//
RW1820_WriteByte(0xbe);//
temp = RW1820_ReadByte();
t = (int)(((temp & 0xf0) >> 4) + (temp & 0x07) * 0.125);
temp = RW1820_ReadByte();
t += ((temp & 0x0f) << 4);
return t;
}
#defineu8 uint8_t
#defineu16 uint16_t
#defineu32 uint32_t
#define DS18B20_PORT GPIOA
#define DS18B20_PIN GPIO_Pin_1
#define DS18B20_CLK RCC_APB2Periph_GPIOA
#define RW1820_DQ_HIGH GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
#define RW1820_DQ_LOW GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);
#define RW1820_DQ_VALUEGPIO_ReadInputDataBit(DS18B20_PORT,DS18B20_PIN)
void _delay_us(uint16_t nCount)
{
nCount *= 3;
while(--nCount);
}
//-----------------------------------------------------------------------------//
static void RW1820_DQ_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
//--------------------------------------------------------
static void RW1820_DQ_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
//--------------------------------------------------------
void RW1820_Init(void)
{
u8 retry=0;
RW1820_DQ_OUT();
RW1820_DQ_HIGH;
_delay_us(50);
RW1820_DQ_LOW;
_delay_us(500); //480 - 960
RW1820_DQ_HIGH;
_delay_us(40);//15-60
RW1820_DQ_IN(); //
while(RW1820_DQ_VALUE==1&& (retry<100))
{
retry++;
_delay_us(10);
}
RW1820_DQ_OUT();
RW1820_DQ_HIGH;
_delay_us(400);
}
//-------------
void RW1820_WriteByte(unsigned char _data)
{
int i = 0;
RW1820_DQ_OUT();
_delay_us(10);
for (i = 0; i < 8; i++)
{
RW1820_DQ_LOW; //
_delay_us(2); //
if (_data & 0x01)
{
RW1820_DQ_HIGH; //
}
else RW1820_DQ_LOW;
_delay_us(60); //60
RW1820_DQ_HIGH;
_data = _data >> 1;
}
}
//-------------
unsigned char RW1820_ReadByte(void)
{
int i = 0, _data = 0;
_delay_us(10);
for (i = 0; i < 8; i++)
{
RW1820_DQ_OUT();
RW1820_DQ_LOW;
_data >>= 1;
_delay_us(2);
RW1820_DQ_HIGH;
RW1820_DQ_IN();
if(RW1820_DQ_VALUE)
{
_data |= 0x80;
}
_delay_us(60); //60us
}
return _data;
}
int RW1820_ReadTemperature(void)
{
unsigned char temp;
unsigned int t;
RW1820_Init(); //
RW1820_WriteByte(0xcc);//
RW1820_WriteByte(0x44);//
_delay_us(10);
RW1820_Init();
RW1820_WriteByte(0xcc);//
RW1820_WriteByte(0xbe);//
temp = RW1820_ReadByte();
t = (int)(((temp & 0xf0) >> 4) + (temp & 0x07) * 0.125);
temp = RW1820_ReadByte();
t += ((temp & 0x0f) << 4);
return t;
}