Files
IS3/APP/DS18B20.c

262 lines
6.9 KiB
C
Raw Permalink Normal View History

2025-02-19 14:46:14 +08:00
#include "DS18B20.h"
#define DS18B20_PORT GPIOC
#define DS18B20_PIN GPIO_PIN_1
void DS18B20_OUTPUT(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DS18B20_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(DS18B20_PORT, &GPIO_InitStruct);
}
void DS18B20_INPUT(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DS18B20_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(DS18B20_PORT, &GPIO_InitStruct);
}
void DS18B20_Reset(void) {
DS18B20_OUTPUT();
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(750);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(15);
}
uint8_t DS18B20_Check(void)
{
uint8_t retry=0;
DS18B20_INPUT();
while ((HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN))&&retry<200)
{
retry++;
Delay_us(1);
};
if(retry>=200) return 0;
else retry=0;
while (!(HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN))&&retry<240)
{
retry++;
Delay_us(1);
};
Delay_us(480);
if(retry>=300) return 0;
return 1;
}
uint8_t DS18B20_Read_Bit(void) // read one bit
{
uint8_t data;
DS18B20_OUTPUT();
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(2);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
DS18B20_INPUT();
Delay_us(12);
if((HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN))) data=1;
else data=0;
Delay_us(50);
return data;
}
uint8_t DS18B20_ReadByte(void) {
uint8_t byte = 0;
uint8_t j=0;
for (uint8_t i = 0; i < 8; i++) {
j=DS18B20_Read_Bit();
byte=(j<<7)|(byte>>1);
}
return byte;
}
void DS18B20_Write_Bit(uint8_t bit) {
DS18B20_OUTPUT();
if (bit == 1) {
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(2);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(60);
}
else {
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(60);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(2);
}
}
void DS18B20_WriteByte(uint8_t data) {
DS18B20_OUTPUT();
for (uint8_t i = 0; i < 8; i++)
{
if (data & 0x01)
{
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(2);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(60);
}
else
{
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(60);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(2);
}
data >>= 1;
}
}
void DS18B20_Start(void)// ds1820 start convert
{
DS18B20_Reset();
DS18B20_Check();
DS18B20_WriteByte(0xcc);// skip rom
DS18B20_WriteByte(0x44);// convert
}
uint8_t DS18B20_Init()
{
Delay_Init() ;
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = DS18B20_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(DS18B20_PORT, &GPIO_InitStruct);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
HAL_Delay(1000);
DS18B20_Reset();
return DS18B20_Check();
}
void DS18B20_Stop() {
DS18B20_OUTPUT();
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
}
float DS18B20_GetTemperature() {
uint8_t Hight_Byte = 0;
uint8_t Low_Byte = 0;
uint16_t value = 0;
float temperture = 0;
DS18B20_Start();
DS18B20_Reset();
uint8_t check = DS18B20_Check();
// printf("check %d",check);
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
Low_Byte = DS18B20_ReadByte();
Hight_Byte = DS18B20_ReadByte();
DS18B20_Stop();
value = Hight_Byte;
value = (value << 8) + Low_Byte;
if ((value & 0xf800) == 0xf800) {
value = (~value)+1;
temperture = value*(-0.0625);
}
else {
temperture = value*(0.0625);
}
// printf("Temperature 111: %.2f\n", temperture);
return temperture;
}
//
// void DS18B20_SearchROM(uint8_t *roms, uint8_t *count) {
// uint8_t bit_value, complement_bit;
// uint8_t rom[8];
// uint8_t last_discrepancy = 0;
// uint8_t rom_index = 0;
// uint8_t search_complete = 0;
//
// *count = 0; // 设备数量清零
// printf("Starting DS18B20 SearchROM...\n");
//
// while (!search_complete) {
// DS18B20_Reset();
// // uint8_t aaa=DS18B20_Check();
// if (!DS18B20_Check()) { // 复位总线,检测是否有设备存在
// return; // 没有设备,直接返回
// }
//
// DS18B20_WriteByte(0xF0); // 发送 "搜索 ROM" 命令
//
// uint8_t bit_position = 1;
// uint8_t discrepancy_marker = 0; // 记录新的冲突位置
//
// for (uint8_t i = 0; i < 64; i++) {
// bit_value = DS18B20_Read_Bit();
// complement_bit = DS18B20_Read_Bit();
//
// if (bit_value == 1 && complement_bit == 1) {
// printf("No more devices found, stopping search.\n");
// return;
// }
//
// uint8_t chosen_bit;
// if (bit_value == 0 && complement_bit == 0) {
// // **发生冲突,选择路径**
// if (bit_position < last_discrepancy) {
// // 沿用之前的选择
// chosen_bit = (rom[i / 8] >> (i % 8)) & 0x01;
// } else if (bit_position == last_discrepancy) {
// // 选择 1 继续遍历新路径
// chosen_bit = 1;
// } else {
// // 选择 0 并记录新的冲突
// chosen_bit = 0;
// discrepancy_marker = bit_position;
// }
// } else {
// // 读取到 0 或 1直接存储
// chosen_bit = bit_value;
// }
//
// if (chosen_bit) {
// rom[i / 8] |= (1 << (i % 8));
// } else {
// rom[i / 8] &= ~(1 << (i % 8));
// }
//
// DS18B20_Write_Bit(chosen_bit);
// bit_position++;
// }
//
// // 存储找到的ROM地址
// for (uint8_t j = 0; j < 8; j++) {
// roms[rom_index * 8 + j] = rom[j];
// }
// rom_index++;
//
// // **搜索结束条件**
// if (discrepancy_marker == 0) {
// search_complete = 1;
// }
//
// last_discrepancy = discrepancy_marker;
// }
//
// *count = rom_index; // 返回找到的设备数量
// }
//