DS18B20 STM32F103 程序
时间: 2023-06-25 07:02:39 浏览: 87
下面是一个简单的DS18B20温度传感器程序,使用了STM32F103系列的单片机:
```
#include "stm32f10x.h"
#include "delay.h"
#define DS18B20_GPIO GPIOB
#define DS18B20_PIN GPIO_Pin_12
void DS18B20_Init(void);
void DS18B20_WriteBit(uint8_t bit);
uint8_t DS18B20_ReadBit(void);
void DS18B20_WriteByte(uint8_t byte);
uint8_t DS18B20_ReadByte(void);
float DS18B20_GetTemperature(void);
int main(void)
{
float temperature;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
DS18B20_Init();
while(1)
{
temperature = DS18B20_GetTemperature();
// do something with temperature value
}
}
void DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(DS18B20_GPIO, &GPIO_InitStructure);
GPIO_WriteBit(DS18B20_GPIO, DS18B20_PIN, Bit_RESET);
delay_us(480);
GPIO_WriteBit(DS18B20_GPIO, DS18B20_PIN, Bit_SET);
delay_us(480);
}
void DS18B20_WriteBit(uint8_t bit)
{
GPIO_WriteBit(DS18B20_GPIO, DS18B20_PIN, Bit_RESET);
delay_us(1);
if(bit)
{
GPIO_WriteBit(DS18B20_GPIO, DS18B20_PIN, Bit_SET);
delay_us(60);
}
else
{
delay_us(60);
GPIO_WriteBit(DS18B20_GPIO, DS18B20_PIN, Bit_SET);
}
}
uint8_t DS18B20_ReadBit(void)
{
uint8_t bit = 0;
GPIO_WriteBit(DS18B20_GPIO, DS18B20_PIN, Bit_RESET);
delay_us(1);
GPIO_WriteBit(DS18B20_GPIO, DS18B20_PIN, Bit_SET);
delay_us(14);
bit = GPIO_ReadInputDataBit(DS18B20_GPIO, DS18B20_PIN);
delay_us(45);
return bit;
}
void DS18B20_WriteByte(uint8_t byte)
{
uint8_t i;
for(i = 0; i < 8; i++)
{
DS18B20_WriteBit(byte & 0x01);
byte >>= 1;
}
}
uint8_t DS18B20_ReadByte(void)
{
uint8_t i, byte = 0;
for(i = 0; i < 8; i++)
{
byte >>= 1;
if(DS18B20_ReadBit())
byte |= 0x80;
}
return byte;
}
float DS18B20_GetTemperature(void)
{
uint8_t temp_l, temp_h;
int16_t temp;
float temperature;
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
delay_ms(800);
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
temp_l = DS18B20_ReadByte();
temp_h = DS18B20_ReadByte();
temp = temp_h;
temp <<= 8;
temp |= temp_l;
temperature = (float)temp * 0.0625;
return temperature;
}
```
这个程序使用了GPIOB的12号引脚作为DS18B20温度传感器的数据线,你需要根据实际使用情况修改相关的引脚和端口号。
在主函数中,我们调用DS18B20_GetTemperature函数来获取当前的温度值,并进行相应的处理。DS18B20_GetTemperature函数中的代码实现了向DS18B20发送温度转换命令、读取温度数据并计算温度值的过程。
注意:此程序仅供参考,具体实现要根据自己的实际情况进行修改和优化。