// 直接用数字引脚D2(对应STM32的PA2,无映射坑)
#define DS18B20_PIN 2
// 单总线复位
uint8_t ds18b20_reset(void) {
uint8_t presence;
pinMode(DS18B20_PIN, OUTPUT);
digitalWrite(DS18B20_PIN, LOW);
delayMicroseconds(500);
pinMode(DS18B20_PIN, INPUT);
delayMicroseconds(70);
presence = !digitalRead(DS18B20_PIN);
delayMicroseconds(430);
return presence;
}
// 写1位
void ds18b20_write_bit(uint8_t bit) {
pinMode(DS18B20_PIN, OUTPUT);
digitalWrite(DS18B20_PIN, LOW);
delayMicroseconds(1);
if (bit) {
pinMode(DS18B20_PIN, INPUT);
}
delayMicroseconds(60);
pinMode(DS18B20_PIN, INPUT);
delayMicroseconds(1);
}
// 读1位
uint8_t ds18b20_read_bit(void) {
uint8_t bit = 0;
pinMode(DS18B20_PIN, OUTPUT);
digitalWrite(DS18B20_PIN, LOW);
delayMicroseconds(1);
pinMode(DS18B20_PIN, INPUT);
delayMicroseconds(15);
bit = digitalRead(DS18B20_PIN);
delayMicroseconds(45);
return bit;
}
// 写1字节
void ds18b20_write_byte(uint8_t dat) {
for (uint8_t i = 0; i < 8; i++) {
ds18b20_write_bit(dat & 0x01);
dat >>= 1;
}
}
// 读1字节
uint8_t ds18b20_read_byte(void) {
uint8_t dat = 0;
for (uint8_t i = 0; i < 8; i++) {
if (ds18b20_read_bit()) {
dat |= (1 << i);
}
}
return dat;
}
// 读取并转换温度
float ds18b20_read_temp(void) {
uint8_t tempL, tempH;
int16_t raw_temp;
if (!ds18b20_reset()) {
return -999.0f;
}
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0x44);
delay(800);
ds18b20_reset();
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0xBE);
tempL = ds18b20_read_byte();
tempH = ds18b20_read_byte();
raw_temp = (int16_t)((tempH << 8) | tempL);
return raw_temp / 16.0f;
}
void setup() {
Serial.begin(115200);
Serial.println("DS18B20 启动成功");
}
void loop() {
float temp = ds18b20_read_temp();
Serial.print("当前温度: ");
Serial.print(temp, 2);
Serial.println(" °C");
delay(1000);
}