stm32f103 连接ds18b20的c语言代码
时间: 2023-09-24 22:03:28 浏览: 65
连接DS18B20传感器需要使用单总线协议,需要连接到STM32的GPIO口上。
以下是连接DS18B20传感器的C语言代码:
```c
#include "stm32f10x.h"
#include "delay.h"
#define DS18B20_PIN GPIO_Pin_5
#define DS18B20_GPIO GPIOA
#define DS18B20_RCC RCC_APB2Periph_GPIOA
void Delay_us(uint32_t us)
{
SysTick->LOAD = us * 9;
SysTick->VAL = 0;
SysTick->CTRL = 5;
while((SysTick->CTRL & 0x10000) == 0);
SysTick->CTRL = 0;
}
void DS18B20_Init(void)
{
RCC_APB2PeriphClockCmd(DS18B20_RCC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DS18B20_GPIO, &GPIO_InitStructure);
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
}
uint8_t DS18B20_Reset(void)
{
uint8_t i;
GPIO_ResetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(500);
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(30);
i = GPIO_ReadInputDataBit(DS18B20_GPIO, DS18B20_PIN);
Delay_us(470);
return i;
}
void DS18B20_WriteByte(uint8_t data)
{
uint8_t i;
for (i = 0; i < 8; i++)
{
GPIO_ResetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(2);
GPIO_WriteBit(DS18B20_GPIO, DS18B20_PIN, (BitAction)(data & 0x01));
Delay_us(60);
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(2);
data >>= 1;
}
}
uint8_t DS18B20_ReadByte(void)
{
uint8_t i;
uint8_t data = 0;
for (i = 0; i < 8; i++)
{
GPIO_ResetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(2);
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(8);
data |= GPIO_ReadInputDataBit(DS18B20_GPIO, DS18B20_PIN) << i;
Delay_us(120);
}
return data;
}
float DS18B20_ReadTemp(void)
{
uint8_t tl, th;
float temp;
DS18B20_Reset();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
while (!DS18B20_ReadByte());
DS18B20_Reset();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
tl = DS18B20_ReadByte();
th = DS18B20_ReadByte();
temp = tl | (th << 8);
temp = (float)temp * 0.0625;
return temp;
}
int main(void)
{
float temp;
DS18B20_Init();
while (1)
{
temp = DS18B20_ReadTemp();
// 处理温度数据
}
}
```
代码中的`DS18B20_Init()`函数用于初始化GPIO口,`DS18B20_Reset()`函数用于复位传感器,`DS18B20_WriteByte()`函数用于写入数据,`DS18B20_ReadByte()`函数用于读取数据,`DS18B20_ReadTemp()`函数用于读取温度数据。在主函数中可以调用`DS18B20_ReadTemp()`函数读取温度数据并进行处理。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)