写STM32采集3个DS18B20数据的代码
时间: 2024-04-30 17:18:01 浏览: 79
STM32使用18B20温度探头采集温度代码_18B20温度探头_STM32单片机_
5星 · 资源好评率100%
以下是采集3个DS18B20数据的代码,以STM32F103C8T6为例:
```c
#include "stm32f10x.h"
#define DS18B20_GPIO GPIOB
#define DS18B20_PIN GPIO_Pin_12
void Delay_us(uint32_t us)
{
uint32_t i;
for(i = 0; i < us * 8; i++);
}
void DS18B20_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DS18B20_GPIO, &GPIO_InitStructure);
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(2);
GPIO_ResetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(480);
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(60);
}
void DS18B20_WriteBit(uint8_t data)
{
GPIO_ResetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(2);
if(data)
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(60);
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
}
uint8_t DS18B20_ReadBit(void)
{
uint8_t data;
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);
Delay_us(60);
return data;
}
void DS18B20_WriteByte(uint8_t data)
{
uint8_t i;
for(i = 0; i < 8; i++)
{
DS18B20_WriteBit(data & 0x01);
data >>= 1;
}
}
uint8_t DS18B20_ReadByte(void)
{
uint8_t i, data = 0;
for(i = 0; i < 8; i++)
{
data >>= 1;
if(DS18B20_ReadBit())
data |= 0x80;
}
return data;
}
void DS18B20_Start(void)
{
DS18B20_Init();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
}
void DS18B20_ReadTemp(uint8_t* temp)
{
uint8_t i;
DS18B20_Start();
DS18B20_Init();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
for(i = 0; i < 9; i++)
temp[i] = DS18B20_ReadByte();
}
int main(void)
{
uint8_t temp[9];
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while(1)
{
DS18B20_ReadTemp(temp);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
Delay_us(temp[0] * 200);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
GPIO_SetBits(GPIOC, GPIO_Pin_14);
Delay_us(temp[1] * 200);
GPIO_ResetBits(GPIOC, GPIO_Pin_14);
GPIO_SetBits(GPIOC, GPIO_Pin_15);
Delay_us(temp[2] * 200);
GPIO_ResetBits(GPIOC, GPIO_Pin_15);
Delay_ms(1000);
}
}
```
这个程序中,我们使用GPIOB的第12号引脚作为DS18B20的数据引脚,使用GPIOC的13、14、15号引脚作为LED输出引脚。在main函数中,我们循环执行读取DS18B20数据的操作,然后根据读取到的数据控制三个LED的亮灭。在DS18B20_ReadTemp函数中,我们先发送读取温度的命令,然后再读取DS18B20返回的数据,将其存放在temp数组中。每个DS18B20返回的数据有9个字节,其中第1个字节为温度的低8位,第2个字节为温度的高8位,第3个字节为温度的符号位(0表示正数,1表示负数),后面6个字节为保留字节,不需要使用。
阅读全文