// SPDX-License-Identifier: GPL-3.0-only /* * Copyright (c) 2008-2023 100askTeam : Dongshan WEI * Discourse: https://forums.100ask.net */ /* Copyright (C) 2008-2023 深圳百问网科技有限公司 * All rights reserved * * * 免责声明: 百问网编写的文档,仅供学员学习使用,可以转发或引用(请保留作者信息),禁止用于商业用途! * 免责声明: 百问网编写的程序,可以用于商业用途,但百问网不承担任何后果! * * 摘要: * 本程序遵循GPL V3协议,使用请遵循协议许可 * 本程序所用的开发板: DShanMCU-F103 * 百问网嵌入式学习平台:https://www.100ask.net * 百问网技术交流社区: https://forums.100ask.net * 百问网官方B站: https://space.bilibili.com/275908810 * 百问网官方淘宝: https://100ask.taobao.com * 联系我们(E-mail): weidongshan@qq.com * * 版权所有,盗版必究。 * * 修改历史 版本号 作者 修改内容 *----------------------------------------------------- * 2023.08.04 v01 百问科技 创建文件 *----------------------------------------------------- */ #include "driver_ds18b20.h" #include "driver_lcd.h" #include "driver_timer.h" #include "stm32f1xx_hal.h" /* rom commands */ #define SEARCH_ROM 0xF0 #define READ_ROM 0x33 #define MATCH_ROM 0x55 #define SKIP_ROM 0xCC #define ALARM_ROM 0xEC /* functions commands */ #define CONVERT_TEAMPERATURE 0x44 #define WRITE_SCRATCHPAD 0x4E #define READ_SCRATCHPAD 0xBE #define COPY_SCRATCHPAD 0x48 #define RECALL_EEPROM 0xB8 #define READ_POWER_SUPPLY 0xB4 /* 先实现GPIO的基本操作 */ /********************************************************************** * 函数名称: DS18B20_PinCfgAsOutput * 功能描述: 把DS18B20的数据引脚配置为输出 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 无 * 修改日期 版本号 修改人 修改内容 * ----------------------------------------------- * 2023/08/03 V1.0 韦东山 创建 ***********************************************************************/ static void DS18B20_PinCfgAsOutput(void) { /* 对于STM32F103, 已经把DS18B20的引脚配置为"open drain, pull-up" */ } /********************************************************************** * 函数名称: DS18B20_PinCfgAsInput * 功能描述: 把DS18B20的数据引脚配置为输入 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 无 * 修改日期 版本号 修改人 修改内容 * ----------------------------------------------- * 2023/08/03 V1.0 韦东山 创建 ***********************************************************************/ static void DS18B20_PinCfgAsInput(void) { /* 对于STM32F103, 已经把DS18B20的引脚配置为"open drain, pull-up" * 让它输出1就不会驱动这个引脚, 并且可以读入引脚状态 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); } /********************************************************************** * 函数名称: DS18B20_PinSet * 功能描述: 设置DS18B20的数据引脚的输出值 * 输入参数: val - 输出电平 * 输出参数: 无 * 返 回 值: 无 * 修改日期 版本号 修改人 修改内容 * ----------------------------------------------- * 2023/08/03 V1.0 韦东山 创建 ***********************************************************************/ static void DS18B20_PinSet(int val) { if (val) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); } /********************************************************************** * 函数名称: DS18B20_PinRead * 功能描述: 读取DS18B20的数据引脚 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 1-高电平, 0-低电平 * 修改日期 版本号 修改人 修改内容 * ----------------------------------------------- * 2023/08/03 V1.0 韦东山 创建 ***********************************************************************/ static int DS18B20_PinRead(void) { if (GPIO_PIN_SET == HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)) return 1; else return 0; } /********************************************************************** * 函数名称: DS18B20_PinSetForTime * 功能描述: 设置DS18B20的数据引脚,并维持一定时间 * 输入参数: val - 输出电平 * us - 维持多少us * 输出参数: 无 * 返 回 值: 无 * 修改日期: 版本号 修改人 修改内容 * ----------------------------------------------- * 2023/08/03 V1.0 韦东山 创建 ***********************************************************************/ static void DS18B20_PinSetForTime(int val, int us) { DS18B20_PinCfgAsOutput(); DS18B20_PinSet(val); udelay(us); } /********************************************************************** * 函数名称: DS18B20_PinRelease * 功能描述: 释放引脚,就是不再驱动引脚,配置为输入即可 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 无 * 修改日期: 版本号 修改人 修改内容 * ----------------------------------------------- * 2023/08/03 V1.0 韦东山 创建 ***********************************************************************/ static void DS18B20_PinRelease(void) { DS18B20_PinCfgAsInput(); } /* ds18b20的代码 */ /********************************************************************** * 函数名称: DS18B20_Start * 功能描述: 给DS18B20发出启动信号,并返回响应值 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 1-无响应, 0-有响应 * 修改日期: 版本号 修改人 修改内容 * ----------------------------------------------- * 2023/08/03 V1.0 韦东山 创建 ***********************************************************************/ static int DS18B20_Start(void) { int val; DS18B20_PinSetForTime(0, 500); DS18B20_PinRelease(); udelay(80); val = DS18B20_PinRead(); udelay(250); return val; } /********************************************************************** * 函数名称: DS18B20_WriteBit * 功能描述: 给DS18B20发送1bit数据 * 输入参数: val - 数据 * 输出参数: 无 * 返 回 值: 无 * 修改日期: 版本号 修改人 修改内容 * ----------------------------------------------- * 2023/08/03 V1.0 韦东山 创建 ***********************************************************************/ static void DS18B20_WriteBit(int val) { if (0 == val) { DS18B20_PinSetForTime(0, 60); DS18B20_PinRelease(); udelay(2); } else { DS18B20_PinSetForTime(0, 2); DS18B20_PinRelease(); udelay(60); } } /********************************************************************** * 函数名称: DS18B20_ReadBit * 功能描述: 读取DS18B20 1bit数据 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 1/0 - 数据 * 修改日期: 版本号 修改人 修改内容 * ----------------------------------------------- * 2023/08/03 V1.0 韦东山 创建 ***********************************************************************/ static int DS18B20_ReadBit(void) { int val; DS18B20_PinSetForTime(0, 2); DS18B20_PinRelease(); udelay(10); val = DS18B20_PinRead(); udelay(50); return val; } /********************************************************************** * 函数名称: DS18B20_WriteByte * 功能描述: 给DS18B20发送1 byte数据 * 输入参数: data - 数据 * 输出参数: 无 * 返 回 值: 无 * 修改日期: 版本号 修改人 修改内容 * ----------------------------------------------- * 2023/08/03 V1.0 韦东山 创建 ***********************************************************************/ static void DS18B20_WriteByte(unsigned char data) { int i; for (i = 0; i < 8; i++) { DS18B20_WriteBit(data & (1<