stm32使用DS18B20带CRC校验代码
时间: 2023-08-21 15:01:48 浏览: 156
下面是使用STM32驱动DS18B20并带CRC校验的示例代码:
```c
#include "stm32f10x.h"
#include "delay.h"
GPIO_InitTypeDef GPIO_InitStructure;
#define DS18B20_DQ_OUT() {GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure);}
#define DS18B20_DQ_IN() {GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure);}
#define DS18B20_DQ_H() GPIO_SetBits(GPIOB,GPIO_Pin_10)
#define DS18B20_DQ_L() GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define DS18B20_DQ_READ() GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)
void DS18B20_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
DS18B20_DQ_OUT();
DS18B20_DQ_H();
delay_us(2);
}
unsigned char DS18B20_Reset(void)
{
unsigned char res=0;
DS18B20_DQ_OUT();
DS18B20_DQ_L();
delay_us(750);
DS18B20_DQ_IN();
delay_us(15);
if(!DS18B20_DQ_READ()) res=1;
delay_us(750);
return res;
}
void DS18B20_Write(unsigned char data)
{
unsigned char i;
DS18B20_DQ_OUT();
for(i=0;i<8;i++)
{
if((data&0x01)==0x01)
{
DS18B20_DQ_L();
delay_us(2);
DS18B20_DQ_H();
delay_us(60);
}
else
{
DS18B20_DQ_L();
delay_us(60);
DS18B20_DQ_H();
delay_us(2);
}
data>>=1;
}
}
unsigned char DS18B20_Read(void)
{
unsigned char i,res=0;
DS18B20_DQ_IN();
for(i=0;i<8;i++)
{
res>>=1;
DS18B20_DQ_OUT();
DS18B20_DQ_L();
delay_us(2);
DS18B20_DQ_IN();
if(DS18B20_DQ_READ()) res|=0x80;
delay_us(60);
DS18B20_DQ_H();
}
return res;
}
float DS18B20_Get_Temp(void)
{
unsigned char i,flag;
unsigned char buf[9];
float temp;
if(DS18B20_Reset())
{
DS18B20_Write(0xCC);
DS18B20_Write(0x44);
delay_us(750);
DS18B20_Reset();
DS18B20_Write(0xCC);
DS18B20_Write(0xBE);
for(i=0;i<9;i++) buf[i]=DS18B20_Read();
if((buf[0]^buf[1]^buf[2]^buf[3]^buf[4]^buf[5]^buf[6]^buf[7])==buf[8])
{
flag=1;
if(buf[1]&0x80)
{
flag=0;
buf[1]=~buf[1]+1;
}
if(buf[0]&0x80)
{
if(flag) temp=(float)buf[0]+((float)buf[1]/16.0);
else temp=(float)buf[0]-((float)buf[1]/16.0);
temp=~temp+1;
}
else temp=(float)buf[0]+((float)buf[1]/16.0);
}
else
{
temp=-999;
}
}
else
{
temp=-999;
}
return temp;
}
```
在使用前,需要先调用 `DS18B20_Init()` 进行初始化。然后,调用 `DS18B20_Get_Temp()` 函数即可获取温度值,该函数会返回一个浮点数,单位为摄氏度。函数内部会执行 DS18B20 的初始化、发送温度转换指令、读取温度值并进行 CRC 校验等操作。
阅读全文