stm32f103 连接ds18b20的c语言代码和头文件
时间: 2023-09-27 22:08:33 浏览: 112
STM32F103实验: DS18B20数字温度传感器程序源代码.rar
以下是使用STM32F103连接DS18B20的C语言代码和头文件示例:
### 头文件
```c
#ifndef __DS18B20_H
#define __DS18B20_H
#include "stm32f10x.h"
#define DS18B20_DQ_OUT() GPIOB->CRL &= 0X0FFFFFFF; GPIOB->CRL |= 0X30000000
#define DS18B20_DQ_IN() GPIOB->CRL &= 0X0FFFFFFF; GPIOB->CRL |= 0X80000000
#define DS18B20_DQ_0() GPIOB->BSRR = 1<<16
#define DS18B20_DQ_1() GPIOB->BSRR = 1<<0
uint8_t DS18B20_Init(void);
float DS18B20_GetTemp_SkipRom(void);
#endif
```
### 代码
```c
#include "ds18b20.h"
#include "delay.h"
//初始化DS18B20
uint8_t DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
DS18B20_DQ_1();
delay_us(2);
DS18B20_DQ_OUT();
DS18B20_DQ_0();
delay_us(750); // 延时750us
DS18B20_DQ_1();
delay_us(15);
DS18B20_DQ_IN();
uint8_t i = 0;
while (DS18B20_DQ_IN() && i < 200)
{
i++;
delay_us(1);
}
if (i >= 200)
return 1;
else
i = 0;
while (!DS18B20_DQ_IN() && i < 240)
{
i++;
delay_us(1);
}
if (i >= 240)
return 2;
delay_us(60);
DS18B20_DQ_OUT();
DS18B20_DQ_1();
return 0;
}
//从DS18B20读取温度值
float DS18B20_GetTemp_SkipRom(void)
{
uint8_t i;
uint8_t j;
uint8_t flag;
uint8_t temp;
uint8_t TH;
uint8_t TL;
float temperature;
DS18B20_Init();
DS18B20_DQ_OUT();
DS18B20_DQ_0();
delay_us(750); // 延时750us
DS18B20_DQ_1();
delay_us(15);
DS18B20_DQ_IN();
delay_us(4);
flag = DS18B20_DQ_IN();
if (flag)
return -1;
delay_us(40);
DS18B20_DQ_OUT();
DS18B20_DQ_0();
delay_us(2);
DS18B20_DQ_1();
DS18B20_DQ_IN();
for (i = 0; i < 8; i++)
{
delay_us(4);
DS18B20_DQ_OUT();
DS18B20_DQ_0();
delay_us(2);
DS18B20_DQ_1();
delay_us(8);
DS18B20_DQ_IN();
temp |= DS18B20_DQ_IN() << i;
delay_us(40);
}
TH = temp;
temp = 0;
for (i = 0; i < 8; i++)
{
delay_us(4);
DS18B20_DQ_OUT();
DS18B20_DQ_0();
delay_us(2);
DS18B20_DQ_1();
delay_us(8);
DS18B20_DQ_IN();
temp |= DS18B20_DQ_IN() << i;
delay_us(40);
}
TL = temp;
if (TH > 7)
{
TH = ~TH;
TL = ~TL;
flag = 0;
}
else
flag = 1;
temperature = (float)((TH << 4) + (TL >> 4));
temperature += (float)(TL & 0x0f) * 0.0625f;
if (!flag)
temperature = -temperature;
return temperature;
}
```
其中,`delay.h` 头文件中定义了一个 `delay_us()` 函数,用于延时微秒级别的时间。
阅读全文