stm32 ds18b20温度传感器
时间: 2023-05-01 19:00:56 浏览: 89
STM32 DS18B20温度传感器是一种基于STM32微控制器的数字温度传感器,它采用DS18B20芯片作为温度传感器,能够实现高精度、数字化的温度测量。该传感器具有体积小、功耗低、抗干扰能力强等特点,广泛应用于温度测量、环境监测、智能家居等领域。
相关问题
stm32ds18b20温度传感器代码
以下是使用STM32与DS18B20温度传感器通信的示例代码:
```c
#include "stm32f10x.h"
#include "ds18b20.h"
void delay_us(uint32_t nus)
{
uint32_t ticks = nus * (SystemCoreClock / 1000000);
while(ticks--);
}
void ds18b20_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_12);
delay_us(2);
GPIO_ResetBits(GPIOA, GPIO_Pin_12);
delay_us(500);
GPIO_SetBits(GPIOA, GPIO_Pin_12);
delay_us(60);
}
void ds18b20_write_byte(uint8_t dat)
{
uint8_t i;
for(i=0; i<8; i++)
{
if(dat & 0x01)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_12);
delay_us(10);
GPIO_SetBits(GPIOA, GPIO_Pin_12);
delay_us(60);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_12);
delay_us(60);
GPIO_SetBits(GPIOA, GPIO_Pin_12);
delay_us(10);
}
dat >>= 1;
}
}
uint8_t ds18b20_read_byte(void)
{
uint8_t i, dat = 0;
for(i=0; i<8; i++)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_12);
delay_us(2);
GPIO_SetBits(GPIOA, GPIO_Pin_12);
delay_us(8);
dat >>= 1;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))
dat |= 0x80;
delay_us(60);
}
return dat;
}
uint16_t ds18b20_read_temp(void)
{
uint8_t i;
uint8_t buf[9];
uint16_t temp;
ds18b20_init();
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0x44);
delay_us(750);
ds18b20_init();
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0xBE);
for(i=0; i<9; i++)
buf[i] = ds18b20_read_byte();
temp = buf[1];
temp <<= 8;
temp |= buf[0];
return temp;
}
int main(void)
{
uint16_t temp;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while(1)
{
temp = ds18b20_read_temp();
if(temp & 0x8000) //温度为负数
{
temp = ~temp + 1; //取反+1
GPIO_SetBits(GPIOC, GPIO_Pin_13);
}
else
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
printf("Temperature: %d.%d C\n", temp>>4, (temp&0x0f)*625/100);
delay_us(2000000);
}
}
```
在本代码中,我们使用了PA12引脚与DS18B20进行通信,PC13引脚用于指示温度是否为负数。在主函数中,我们通过`ds18b20_read_temp()`函数读取温度值,并通过串口输出。需要注意的是,由于DS18B20的温度值带有小数部分,因此我们需要对读取到的数值进行转换,才能得到实际的温度值。
stm32ds18b20温度传感器原理
STM32DS18B20 温度传感器是一种数字式温度传感器,能够基于单总线技术实现温度测量,并且符合标准的1-Wire总线协议,可以直接与STM32微控制器相连。传感器内部集成了一个16位的温度传感器及相关的控制电路,它能够测量出-55℃到+125℃范围内的温度,并通过数字信号传输给微控制器进行处理。 该传感器基于温度变化引起的电阻变化原理,使用了一个特制的探头进行测量。该探头包括一个高精度的温度传感器及加热元件,通过在传感器内部驱动加热元件,使其保持在一个恒定的温度,通过测量温度传感器电阻的变化,即可精确地测量出环境温度。传感器内部还具有一定的存储器,可以保存传感器芯片的唯一身份识别码和相关设置参数,即可实现多个传感器同时工作的情况下,确保传感器之间互不干扰。在STM32系统中使用该传感器时,需要使用专门的驱动程序,将传感器数据转换为数字温度值,并对数据进行校验和传输完整性校验等处理,以确保测量数据的准确性和传输的可靠性。
阅读全文