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

发布于:2025-03-05 ⋅ 阅读:(116) ⋅ 点赞:(0)

基于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秒
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到