一、教程前言
本教程将带领大家实现 STC89C52 单片机 驱动 DS18B20 数字温度传感器 采集环境温度,并将实时温度数据显示在 LCD1602 液晶屏幕 上。整个项目原理清晰、步骤详细,从硬件接线到软件编程全程拆解,适合单片机初学者入门实践,同时可作为温控项目、环境监测项目的基础模块。
通过本教程你将掌握:
- DS18B20 单总线通信协议与温度采集原理
- LCD1602 并行接口驱动与字符 / 数字显示方法
- STC89C52 单片机 GPIO 口配置与延时函数编写
- 传感器数据处理与液晶显示的联动逻辑

二、准备材料
| 元件名称 | 数量 | 备注 |
|---|---|---|
| STC89C52 单片机最小系统板 | 1 块 | 核心控制单元 |
| DS18B20 温度传感器 | 1 个 | 数字式单总线,测温范围 - 55℃~+125℃ |
| LCD1602 液晶模块(并行) | 1 块 | 16 列 2 行字符显示,5V 供电 |
| USB-TTL 烧录器 | 1 个 | 用于给单片机烧录程序(CH340 芯片即可) |
| 10KΩ 电位器 | 1 个 | 调节 LCD1602 对比度 |
| 5V 直流电源 | 1 个 | 给整个系统供电(或通过 USB-TTL 取电) |
| 杜邦线(公对母 / 公对公) | 若干 | 连接各模块引脚 |
| 面包板(可选) | 1 块 | 方便临时接线与调试 |
| 4.7KΩ 电阻(可选) | 1 个 | DS18B20 上拉电阻(模块内置则无需) |
三、硬件原理与接线说明
3.1 核心模块原理简介
3.1.1 DS18B20 温度传感器(详细解析)
DS18B20 是美国 Dallas 半导体公司推出的单总线数字温度传感器,凭借其接线简单、抗干扰能力强、测量精度高的特点,广泛应用于各类温度检测场景。
核心特性:
- 通信方式:单总线(1-Wire Bus),仅需 1 根数据线即可实现单片机与传感器的双向通信,极大简化接线
- 测温范围:-55℃ ~ +125℃,满足绝大多数民用 / 工业场景需求
- 测温精度:默认 0.5℃,可通过编程配置为 0.1℃(最高精度)、0.25℃、1℃,适配不同精度要求
- 供电方式:支持两种模式
- 外部电源供电(VCC 接 5V/3.3V):稳定性高,推荐本项目使用
- 寄生电源供电(无需 VCC,依赖 DQ 引脚数据线供电):接线更简洁,但远距离传输时稳定性较差
- 多点测温:支持在同一总线上挂接多个 DS18B20(最多 256 个),通过唯一 ROM 地址区分,可扩展为多点测温系统
- 数据输出:16 位数字量输出,直接转换为温度值,无需 AD 转换,减少单片机运算压力
技术参数表:
| 参数项 | 规格值 |
|---|---|
| 供电电压 | 3.0V ~ 5.5V |
| 工作电流(测量时) | ≤1mA |
| 待机电流 | ≤1μA |
| 响应时间(0.1℃精度) | 最大 750ms |
| 探头封装 | TO-92(直插)/SOP(贴片)/ 不锈钢封装(防水型) |
| 通信距离 | 普通导线≤50m,屏蔽线≤100m |
3.1.2 LCD1602 液晶模块
LCD1602 是工业上常用的字符型液晶显示模块,能显示 16 列 2 行 ASCII 字符,成本低、操作简单,适合显示温度、时间等简单数据。
核心特性:
- 接口类型:并行接口,需 8 位数据总线(D0-D7)+2 位控制总线(RS、EN)
- 控制逻辑:
- RS(寄存器选择):RS=0 时写命令(如初始化、清屏),RS=1 时写数据(如显示字符)
- EN(使能端):高电平有效,下降沿触发数据写入,需配合延时保证时序
- 供电电压:5V(兼容 3.3V,但显示效果较差)
- 对比度调节:通过 V0 引脚外接电位器实现,避免屏幕全黑 / 全白
3.2 详细接线表(关键!)
| 模块引脚 | STC89C52 引脚 | 辅助接线说明 |
|---|---|---|
| DS18B20 - VCC | 5V | 外部电源供电(推荐) |
| DS18B20 - GND | GND | 系统共地 |
| DS18B20 - DQ | P3.7 | 单总线数据引脚,串联 4.7KΩ 上拉电阻到 5V |
| LCD1602 - RS | P2.6 | 寄存器选择引脚 |
| LCD1602 - RW | P2.5 | 读写选择引脚 |
| LCD1602 - EN | P2.7 | 使能引脚 |
| LCD1602 - D0 | P0.0 | 数据总线最低位 |
| LCD1602 - D1 | P0.1 | 数据总线位 1 |
| LCD1602 - D2 | P0.2 | 数据总线位 2 |
| LCD1602 - D3 | P0.3 | 数据总线位 3 |
| LCD1602 - D4 | P0.4 | 数据总线位 4 |
| LCD1602 - D5 | P0.5 | 数据总线位 5 |
| LCD1602 - D6 | P0.6 | 数据总线位 6 |
| LCD1602 - D7 | P0.7 | 数据总线最高位 |
| LCD1602 - VCC | 5V | 液晶供电 |
| LCD1602 - GND | GND | 系统共地 |
| LCD1602 - V0 | 10KΩ 电位器 | 电位器两端接 5V 和 GND,中间脚接 V0 |
| USB-TTL - VCC | 5V | 给单片机 / 传感器供电(可选) |
| USB-TTL - GND | GND | 系统共地(必须连接) |
| USB-TTL - TXD | P3.0(RXD) | 单片机接收端 |
| USB-TTL - RXD | P3.1(TXD) | 单片机发送端(仅烧录 / 串口用) |
3.3 接线注意事项
- 所有模块必须 共地(GND 相连),否则会出现数据乱码、模块不响应等问题,共地是单片机系统稳定工作的基础
- DS18B20 的 DQ 引脚务必串联 4.7KΩ 上拉电阻(部分集成模块已内置,可目视检查模块上是否有 “472” 标识电阻),无下拉电阻会导致单总线通信失败
- LCD1602 的 V0 引脚必须接电位器,上电后先旋转电位器调节对比度,直到屏幕字符清晰显示,避免因对比度不当误以为模块损坏
- 杜邦线接线需牢固,面包板接线时尽量插入孔位底部,避免接触不良导致的 “时好时坏”
- DS18B20 的 VCC 和 GND 切勿接反,否则会直接烧毁传感器
四、软件设计(Keil C51 编程)
4.1 编程思路梳理
- 初始化阶段:完成 LCD1602 的初始化配置(显示模式、开关控制、光标设置)
- 主循环流程:
- DS18B20 初始化 → 发送温度转换命令 → 等待转换完成
- 读取 DS18B20 的 16 位原始温度数据
- 数据处理:将原始数据转换为实际温度值(分离整数部分和小数部分)
- LCD1602 显示更新:清除原有数据,显示新的温度值(格式:XX.X℃)
- 延时 500ms,重复上述流程,实现实时刷新
4.2 DS18B20.c(部分代码)
/*******************************************************************************
* 函 数 名 : ds18b20_read_temperture
* 函数功能 : 从ds18b20得到温度值
* 输 入 : 无
* 输 出 : 温度数据
*******************************************************************************/
float ds18b20_read_temperture(void)
{
float temp;
u8 dath=0;
u8 datl=0;
u16 value=0;
ds18b20_start();//开始转换
ds18b20_reset();//复位
ds18b20_check();
ds18b20_write_byte(0xcc);//SKIP ROM
ds18b20_write_byte(0xbe);//读存储器
datl=ds18b20_read_byte();//低字节
dath=ds18b20_read_byte();//高字节
value=(dath<<8)+datl;//合并为16位数据
if((value&0xf800)==0xf800)//判断符号位,负温度
{
value=(~value)+1; //数据取反再加1
temp=value*(-0.0625);//乘以精度
}
else //正温度
{
temp=value*0.0625;
}
return temp;
}
4.3 DS18B20.h
/**
****************************************************************************************************
* @file ds18b20.H
* @author 送外卖的工程师
* @version V1.0
* @date 2025-11-23
* @brief DS18B20数字温度传感器 驱动代码
****************************************************************************************************
* @attention
*
* 实验平台:STC89C52
* CSDN:送外卖的工程师
* 技术指导VX:wmz14026
* 淘宝店铺:小马科技
* 闲鱼店铺:送外卖的工程师
*
* 修改说明
* V1.0.0.251123
* 第一次发布
* 注:长期接各种项目设计,提供仿真、实物、原理图、PCB、代码工程、后期指导、操作视频、
说明文档、各种报告、后期指导等。
****************************************************************************************************
*/
#ifndef _ds18b20_H
#define _ds18b20_H
#include "public.h"
//管脚定义
sbit DS18B20_PORT=P3^7; //DS18B20数据口定义
//函数声明
u8 ds18b20_init(void);
float ds18b20_read_temperture(void);
#endif
4.4 LCD1602.c(部分)
/*******************************************************************************
* 函 数 名 : lcd1602_show_string
* 函数功能 : LCD1602显示字符
* 输 入 : x,y:显示坐标,x=0~15,y=0~1;
str:显示字符串
* 输 出 : 无
*******************************************************************************/
void lcd1602_show_string(u8 x,u8 y,u8 *str)
{
u8 i=0;
if(y>1||x>15)return;//行列参数不对则强制退出
if(y<1) //第1行显示
{
while(*str!='\0')//字符串是以'\0'结尾,只要前面有内容就显示
{
if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示
{
lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置
}
else
{
lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置
}
lcd1602_write_data(*str);//显示内容
str++;//指针递增
i++;
}
}
else //第2行显示
{
while(*str!='\0')
{
if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示
{
lcd1602_write_cmd(0x80+0x40+i+x);
}
else
{
lcd1602_write_cmd(0x80+i+x-16);
}
lcd1602_write_data(*str);
str++;
i++;
}
}
}
4.5 LCD1602.h
/**
****************************************************************************************************
* @file lcd1602.h
* @author 送外卖的工程师
* @version V1.0
* @date 2025-11-23
* @brief 屏幕驱动代码
****************************************************************************************************
* @attention
*
* 实验平台:STC89C52
* CSDN:送外卖的工程师
* 技术指导VX:wmz14026
* 淘宝店铺:小马科技
* 闲鱼店铺:送外卖的工程师
*
* 修改说明
* V1.0.0.251123
* 第一次发布
* 注:长期接各种项目设计,提供仿真、实物、原理图、PCB、代码工程、后期指导、操作视频、
说明文档、各种报告、后期指导等。
****************************************************************************************************
*/
#ifndef _lcd1602_H
#define _lcd1602_H
#include "public.h"
//LCD1602数据口4位和8位定义,若为1,则为LCD1602四位数据口驱动,反之为8位
#define LCD1602_4OR8_DATA_INTERFACE 0 //默认使用8位数据口LCD1602
//管脚定义
sbit LCD1602_RS=P2^6;//数据命令选择
sbit LCD1602_RW=P2^5;//读写选择
sbit LCD1602_E=P2^7; //使能信号
#define LCD1602_DATAPORT P0 //宏定义LCD1602数据端口
//函数声明
void lcd1602_init(void);
void lcd1602_clear(void);
void lcd1602_show_string(u8 x,u8 y,u8 *str);
#endif
4.6 代码关键说明
(1)DS18B20 温度数据格式
DS18B20 的 16 位原始温度数据格式如下(高位在前,低位在后):
| bit15 | bit14-bit11 | bit10-bit4 | bit3-bit0 |
|---|---|---|---|
| 符号位 | 整数部分高 4 位 | 整数部分低 4 位 | 小数部分(0.0625℃/ 位) |
- 正温度:符号位 = 0,数值 =(高字节 <<4 | 低字节>>4) + (低字节 & 0x0f)×0.0625
- 负温度:符号位 = 1,数据以补码存储,需先取反 + 1 得到绝对值再计算
(2)负温度支持
本代码新增负温度处理逻辑:
- 用返回值的 bit15 标记负温度(1 = 负,0 = 正)
- 负温度显示时先输出 “-” 号,再显示绝对值
- 适配 - 55℃~+125℃全量程测温
(3)错误检测
- 当 DS18B20 初始化失败时,返回错误码 0xffff
- LCD1602 第二行显示 “Error”,方便快速排查问题
(4)LCD 显示优化
- 采用固定格式占位符,避免刷新时字符闪烁
- 正温度用空格占位,负温度显示 “-” 号,格式统一美观
五、DS18B20 适用范围
DS18B20 凭借其优异的性能,在以下场景中得到广泛应用:
- 智能家居领域:室内温度监测、空调 / 暖气温控系统、冰箱温度检测
- 工业控制领域:设备温度监控(如电机、电路板)、车间环境温度采集、冷链运输温度跟踪
- 医疗设备领域:体温计、孵化器温度控制、医疗冰箱温度监测
- 农业领域:大棚温度监测、土壤温度采集、水产养殖水温控制
- 消费电子领域:电脑主板温度检测、家电温度保护、智能穿戴设备(如手环测温)
- 汽车电子领域:车内温度监测、发动机水温检测、电池温度监控
其核心优势在于单总线接线简单、抗干扰能力强,适合远距离测温(配合屏蔽线可传输 100 米),且支持多点测温,成本较低,是入门级温度采集项目的首选传感器。
六、烧录与测试步骤
6.1 软件准备
- 安装 Keil C51 编译器(推荐 V5 版本),新建项目时选择 “STC89C52RC” 型号
- 将上述代码复制到项目中,保存为 “main.c” 文件
- 点击 Keil 工具栏 “Build” 按钮编译代码,生成 “.hex” 烧录文件(确保编译日志无错误)
- 安装 USB-TTL 驱动(CH340 芯片驱动,官网或第三方平台均可下载)
6.2 烧录程序
- 连接 USB-TTL 与 STC89C52 单片机:TXD→P3.0(单片机 RXD)、RXD→P3.1(单片机 TXD)、GND→GND、VCC→5V
- 打开 STC-ISP 烧录软件(STC 官方免费工具):
- 单片机型号选择:
STC89C52RC - 串口号选择:电脑设备管理器中查看 USB-TTL 对应的 COM 口(如 COM4)
- 波特率默认:9600bps(无需修改)
- 点击 “打开程序文件”,选择 Keil 生成的 “.hex” 文件
- 点击 “下载 / 编程”,然后给单片机上电(或按复位键),等待烧录进度条完成(提示 “编程成功”)
- 单片机型号选择:
6.3 测试验证
- 按接线表连接 DS18B20、LCD1602 与单片机,确保接线无松动
- 上电后旋转 LCD1602 的电位器,调节对比度至字符清晰显示
- 正常情况下,LCD1602 显示:Temp: 25.0 C
- 测试用例:
- 用手握住 DS18B20 传感器探头,观察温度是否缓慢上升(约 1~2 秒刷新一次)
- 将传感器靠近冰水混合物(0℃),观察温度是否接近 0.0℃

七、常见问题排查(初学者必看)
问题 1:LCD1602 无显示
- 排查 1:对比度未调节→旋转电位器,直到屏幕出现字符(顺时针旋转对比度增强,逆时针减弱)
- 排查 2:接线错误→重新核对 RS(P2.6)、EN(P2.7)、RW(P2.5)、D0-D7(P0 口)是否接对,VCC 和 GND 是否接反
- 排查 3:电源问题→确保 LCD1602 的 VCC 接 5V,且与单片机共地
- 排查 4:初始化失败→检查 LCD_Init () 函数中的命令是否正确(0x38、0x0c、0x06、0x01)
问题 2:温度显示固定值(0.0℃、85.0℃或错误码)
- 排查 1:DS18B20 接线错误→DQ 引脚是否接 P3.7,是否串联 4.7KΩ 上拉电阻,VCC 和 GND 是否接反
- 排查 2:传感器损坏→更换新的 DS18B20 重试,或用万用表测量传感器 VCC 和 GND 之间是否有 5V 电压
- 排查 3:时序错误→检查 DelayUs 函数是否适配 11.0592MHz 晶振(若晶振为 12MHz,需修改延时参数)
- 排查 4:转换延时不足→DS18B20_WriteByte (0x44) 后需延时 750ms,若延时过短会导致读取数据错误
问题 3:温度显示乱码或跳变严重
- 排查 1:电源不稳定→更换 5V 电源(避免 USB 供电电流不足),或给电源端并联 100nF 滤波电容
- 排查 2:接线松动→重新插拔杜邦线,面包板接线尽量插紧
- 排查 3:无共地→确保所有模块的 GND 相连,共地是解决数据乱码的关键
- 排查 4:环境干扰→若在强电磁环境下,将 DS18B20 的 DQ 线换成屏蔽线
问题 4:烧录失败
- 排查 1:串口号选择错误→在设备管理器中刷新,确认 USB-TTL 对应的 COM 口
- 排查 2:单片机未上电→烧录时需给单片机供电,部分 USB-TTL 的 5V 引脚电流不足,可单独给单片机供电
- 排查 3:驱动未安装→重新安装 CH340 驱动,若驱动安装失败,更换 USB 接口重试
- 排查 4:波特率不匹配→STC-ISP 中波特率默认 9600bps,无需修改,若修改后需重新选择
八、教程总结与扩展
本项目实现了 STC89C52 单片机驱动 DS18B20 采集温度并在 LCD1602 上实时显示,涵盖了单总线通信、液晶驱动、数据处理等核心知识点,是单片机入门的经典实践项目。
扩展方向:
- 串口上传温度:在代码中添加串口发送函数,将温度数据上传到电脑(串口助手显示)
- 温度报警功能:添加 LED 灯和蜂鸣器,设置阈值(如高于 30℃),超标时触发报警
- 多点测温:在同一总线上挂接多个 DS18B20,通过 ROM 地址寻址,实现多区域温度采集
- 精度调整:修改 DS18B20 的配置寄存器(0x4e 命令),切换测温精度(如 0.5℃精度可缩短转换时间)
- LCD1602 显示优化:添加温度最大值 / 最小值记录、采集时间显示等功能
- 改用 I2C 接口 LCD1602:将并行 LCD1602 改为 I2C 接口版本,减少接线数量
4206

被折叠的 条评论
为什么被折叠?



