/* USER CODE BEGIN Includes */
#include <stdlib.h> // 用于数值转字符串
#include <string.h> // 用于字符串操作
#include <stdio.h> //snprintf
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
//温度显示;
#define DS18B20_PIN GPIO_PIN_8
#define DS18B20_PORT GPIOA
uint8_t Temp_Buffer[10]; // 温度显示缓冲区
int16_t temp_raw;
float temperature;
/* USER CODE END PV */
/* USER CODE BEGIN 0 */
// 自定义微秒级延时函数(基于72MHz主频)
static inline void Delay_us(uint32_t us) {
uint32_t delay = us * (SystemCoreClock / 1000000) / 5; // 根据实际主频调整
while(delay--) {
__NOP(); // 空操作指令
}
}
/* DS18B20 底层驱动 */
void DS18B20_Init(void) {
// 配置PA8为开漏输出(已在CubeMX配置)
}
void DS18B20_WriteBit(uint8_t bit) {
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(2); // 保持至少1us
if(bit) HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(60); // 保持60-120us
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
}
void DS18B20_WriteByte(uint8_t byte) {
for(uint8_t i=0; i<8; i++) {
DS18B20_WriteBit(byte & 0x01);
byte >>= 1;
}
}
uint8_t DS18B20_ReadBit(void) {
uint8_t bit = 0;
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(2); // 保持至少1us
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(12); // 等待15us后采样
bit = HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN);
Delay_us(45); // 总周期至少60us
return bit;
}
uint8_t DS18B20_ReadByte(void) {
uint8_t byte = 0;
for(uint8_t i=0; i<8; i++) {
byte >>= 1;
if(DS18B20_ReadBit()) byte |= 0x80;
}
return byte;
}
uint8_t DS18B20_Start(void) {
if(HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN) == GPIO_PIN_RESET) return 0;
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(480);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(60);
if(!HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN)) {
Delay_us(420);




#include <stdlib.h> // 用于数值转字符串
#include <string.h> // 用于字符串操作
#include <stdio.h> //snprintf
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
//温度显示;
#define DS18B20_PIN GPIO_PIN_8
#define DS18B20_PORT GPIOA
uint8_t Temp_Buffer[10]; // 温度显示缓冲区
int16_t temp_raw;
float temperature;
/* USER CODE END PV */
/* USER CODE BEGIN 0 */
// 自定义微秒级延时函数(基于72MHz主频)
static inline void Delay_us(uint32_t us) {
uint32_t delay = us * (SystemCoreClock / 1000000) / 5; // 根据实际主频调整
while(delay--) {
__NOP(); // 空操作指令
}
}
/* DS18B20 底层驱动 */
void DS18B20_Init(void) {
// 配置PA8为开漏输出(已在CubeMX配置)
}
void DS18B20_WriteBit(uint8_t bit) {
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(2); // 保持至少1us
if(bit) HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(60); // 保持60-120us
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
}
void DS18B20_WriteByte(uint8_t byte) {
for(uint8_t i=0; i<8; i++) {
DS18B20_WriteBit(byte & 0x01);
byte >>= 1;
}
}
uint8_t DS18B20_ReadBit(void) {
uint8_t bit = 0;
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(2); // 保持至少1us
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(12); // 等待15us后采样
bit = HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN);
Delay_us(45); // 总周期至少60us
return bit;
}
uint8_t DS18B20_ReadByte(void) {
uint8_t byte = 0;
for(uint8_t i=0; i<8; i++) {
byte >>= 1;
if(DS18B20_ReadBit()) byte |= 0x80;
}
return byte;
}
uint8_t DS18B20_Start(void) {
if(HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN) == GPIO_PIN_RESET) return 0;
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(480);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(60);
if(!HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN)) {
Delay_us(420);



