当前位置: 首页 > news >正文

51单片机使用DS18B20温度传感器

基于51单片机的DS18B20温度传感器程序

#include <reg51.h>

// 定义DS18B20的接口引脚
sbit DS18B20_GPIO = P3^7;

// 延时函数
void DelayMs(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 120; j++);
    }
}

// DS18B20初始化函数
unsigned char DS18B20_Init(void) {
    unsigned char i = 0;
    // 发送复位信号
    DS18B20_GPIO = 0; // 将总线拉低
    i = 50;
    while (i--) {} // 延时600us,最少480us
    DS18B20_GPIO = 1; // 释放总线
    // 等待DS18B20拉低总线
    while (DS18B20_GPIO) {
        i++;
        if (i > 10) return 1; // 失败,大概120us
    }
    // 等待DS18B20释放总线
    while (!DS18B20_GPIO) {
        i++;
        if (i > 20) return 1; // 失败,大概240us
    }
    return 0; // 初始化成功
}

// 向DS18B20写入一个字节
void DS18B20_WriteByte(unsigned char byte) {
    unsigned char i, j;
    for (j = 0; j < 8; j++) {
        DS18B20_GPIO = 0; // 拉低总线
        i = 1; // 延时1us
        while (i--) {}
        DS18B20_GPIO = byte & 0x01; // 写入数据
        i = 6; // 持续时间最少60us
        while (i--) {}
        DS18B20_GPIO = 1; // 释放总线
        byte >>= 1; // 准备写入下一位
    }
}

// 从DS18B20读取一个字节
unsigned char DS18B20_ReadByte(void) {
    unsigned char byte = 0;
    unsigned char i, j;
    for (j = 0; j < 8; j++) {
        DS18B20_GPIO = 0; // 拉低总线
        i = 1; // 延时1us
        while (i--) {}
        DS18B20_GPIO = 1; // 释放总线
        i = 2; // 至少等待15us
        while (i--) {}
        byte >>= 1; // 准备读取下一位
        if (DS18B20_GPIO) byte |= 0x80; // 读取数据
        i = 4; // 读取完之后等待48us
        while (i--) {}
    }
    return byte;
}

// 读取DS18B20的温度值
int DS18B20_ReadTemp(void) {
    int temp = 0; // 存放温度数据
    unsigned char TH, TL;

    // 启动温度转换
    DS18B20_Init(); // 发送复位脉冲并检测应答信号
    DS18B20_WriteByte(0xCC); // 跳过ROM操作命令
    DS18B20_WriteByte(0x44); // 温度转换命令

    // 读取温度
    DS18B20_Init(); // 发送复位脉冲并检测应答信号
    DS18B20_WriteByte(0xCC); // 跳过ROM操作命令
    DS18B20_WriteByte(0xBE); // 发送读取温度命令
    TL = DS18B20_ReadByte(); // 读取温度值低字节
    TH = DS18B20_ReadByte(); // 读取温度值高字节
    temp = (TH << 8) | TL; // 合并成16位
    return temp;
}

void main(void) {
    int temp = 0;

    while (1) {
        temp = DS18B20_ReadTemp(); // 读取温度
        
        DelayMs(1000); // 延时1秒
    }
}

相关文章:

  • day27 第八章 贪心算法 part01
  • 深度学习R8周:RNN实现阿尔兹海默症(pytorch)
  • 补丁供应链案例:CVE-2024-7254. Protobuf. Google
  • FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解)
  • FastGPT 引申:如何基于 LLM 判断知识库的好坏
  • cesium+vue3自定义HTML实体弹窗、加高德路网、防实体漂浮、让用户画圆、鹰眼
  • 51c自动驾驶~合集53
  • 从建筑设计到施工工具:软件体系结构与框架的协同之道
  • el-input 设置类型为number时,输入中文后光标会上移,并且会出现上下箭头
  • RK3568平台(GPIO篇)libgpiod的使用
  • 为AI聊天工具添加一个知识系统 之133 详细设计之74通用编程语言 之4 架构及其核心
  • AI学习笔记:LM studio大模型加载参数说明
  • Hutool一个类型转换工具类 `Convert`,
  • Redis——缓存穿透、击穿、雪崩
  • 力扣-动态规划-115 不同子序列
  • 线代[9]|线性代数主要内容及其发展简史(任广千《线性代数的几何意义》的附录1)
  • FastGPT 引申:混合检索完整实例
  • SSL: CERTIFICATE_VERIFY_FAILED Error in Python 是什么问题?
  • AES/CBC/PKCS5Padding加密
  • A-LOAM工程笔记(一):工程编译及运行(ubuntu20.04 + ros_noetic)
  • 广西南宁做网站/淘宝运营培训课程免费
  • 亿星网站建设/网上营销策略有哪些
  • 上海网站设计工具/百度竞价是什么
  • 中企动力官网网站/徐州网站设计
  • 什么行业需要做网站和推广/佛山做网站推广的公司
  • 个人做网站平台/怎样在网上推广