STC89C52 驱动 DS18B20+LCD1602 温度显示完整教程

一、教程前言

本教程将带领大家实现 STC89C52 单片机 驱动 DS18B20 数字温度传感器 采集环境温度,并将实时温度数据显示在 LCD1602 液晶屏幕 上。整个项目原理清晰、步骤详细,从硬件接线到软件编程全程拆解,适合单片机初学者入门实践,同时可作为温控项目、环境监测项目的基础模块。

通过本教程你将掌握:

  1. DS18B20 单总线通信协议与温度采集原理
  2. LCD1602 并行接口驱动与字符 / 数字显示方法
  3. STC89C52 单片机 GPIO 口配置与延时函数编写
  4. 传感器数据处理与液晶显示的联动逻辑

二、准备材料

元件名称数量备注
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 - VCC5V外部电源供电(推荐)
DS18B20 - GNDGND系统共地
DS18B20 - DQP3.7单总线数据引脚,串联 4.7KΩ 上拉电阻到 5V
LCD1602 - RSP2.6寄存器选择引脚
LCD1602 - RWP2.5读写选择引脚
LCD1602 - ENP2.7使能引脚
LCD1602 - D0P0.0数据总线最低位
LCD1602 - D1P0.1数据总线位 1
LCD1602 - D2P0.2数据总线位 2
LCD1602 - D3P0.3数据总线位 3
LCD1602 - D4P0.4数据总线位 4
LCD1602 - D5P0.5数据总线位 5
LCD1602 - D6P0.6数据总线位 6
LCD1602 - D7P0.7数据总线最高位
LCD1602 - VCC5V液晶供电
LCD1602 - GNDGND系统共地
LCD1602 - V010KΩ 电位器电位器两端接 5V 和 GND,中间脚接 V0
USB-TTL - VCC5V给单片机 / 传感器供电(可选)
USB-TTL - GNDGND系统共地(必须连接)
USB-TTL - TXDP3.0(RXD)单片机接收端
USB-TTL - RXDP3.1(TXD)单片机发送端(仅烧录 / 串口用)

3.3 接线注意事项

  1. 所有模块必须 共地(GND 相连),否则会出现数据乱码、模块不响应等问题,共地是单片机系统稳定工作的基础
  2. DS18B20 的 DQ 引脚务必串联 4.7KΩ 上拉电阻(部分集成模块已内置,可目视检查模块上是否有 “472” 标识电阻),无下拉电阻会导致单总线通信失败
  3. LCD1602 的 V0 引脚必须接电位器,上电后先旋转电位器调节对比度,直到屏幕字符清晰显示,避免因对比度不当误以为模块损坏
  4. 杜邦线接线需牢固,面包板接线时尽量插入孔位底部,避免接触不良导致的 “时好时坏”
  5. DS18B20 的 VCC 和 GND 切勿接反,否则会直接烧毁传感器

四、软件设计(Keil C51 编程)

4.1 编程思路梳理

  1. 初始化阶段:完成 LCD1602 的初始化配置(显示模式、开关控制、光标设置)
  2. 主循环流程:
    • 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 位原始温度数据格式如下(高位在前,低位在后):

bit15bit14-bit11bit10-bit4bit3-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 凭借其优异的性能,在以下场景中得到广泛应用:

  1. 智能家居领域:室内温度监测、空调 / 暖气温控系统、冰箱温度检测
  2. 工业控制领域:设备温度监控(如电机、电路板)、车间环境温度采集、冷链运输温度跟踪
  3. 医疗设备领域:体温计、孵化器温度控制、医疗冰箱温度监测
  4. 农业领域:大棚温度监测、土壤温度采集、水产养殖水温控制
  5. 消费电子领域:电脑主板温度检测、家电温度保护、智能穿戴设备(如手环测温)
  6. 汽车电子领域:车内温度监测、发动机水温检测、电池温度监控

其核心优势在于单总线接线简单、抗干扰能力强,适合远距离测温(配合屏蔽线可传输 100 米),且支持多点测温,成本较低,是入门级温度采集项目的首选传感器。

六、烧录与测试步骤

6.1 软件准备

  1. 安装 Keil C51 编译器(推荐 V5 版本),新建项目时选择 “STC89C52RC” 型号
  2. 将上述代码复制到项目中,保存为 “main.c” 文件
  3. 点击 Keil 工具栏 “Build” 按钮编译代码,生成 “.hex” 烧录文件(确保编译日志无错误)
  4. 安装 USB-TTL 驱动(CH340 芯片驱动,官网或第三方平台均可下载)

6.2 烧录程序

  1. 连接 USB-TTL 与 STC89C52 单片机:TXD→P3.0(单片机 RXD)、RXD→P3.1(单片机 TXD)、GND→GND、VCC→5V
  2. 打开 STC-ISP 烧录软件(STC 官方免费工具):
    • 单片机型号选择:STC89C52RC
    • 串口号选择:电脑设备管理器中查看 USB-TTL 对应的 COM 口(如 COM4)
    • 波特率默认:9600bps(无需修改)
    • 点击 “打开程序文件”,选择 Keil 生成的 “.hex” 文件
    • 点击 “下载 / 编程”,然后给单片机上电(或按复位键),等待烧录进度条完成(提示 “编程成功”)

6.3 测试验证

  1. 按接线表连接 DS18B20、LCD1602 与单片机,确保接线无松动
  2. 上电后旋转 LCD1602 的电位器,调节对比度至字符清晰显示
  3. 正常情况下,LCD1602 显示:Temp:    25.0 C
  4. 测试用例:
    • 用手握住 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 上实时显示,涵盖了单总线通信、液晶驱动、数据处理等核心知识点,是单片机入门的经典实践项目。

扩展方向:

  1. 串口上传温度:在代码中添加串口发送函数,将温度数据上传到电脑(串口助手显示)
  2. 温度报警功能:添加 LED 灯和蜂鸣器,设置阈值(如高于 30℃),超标时触发报警
  3. 多点测温:在同一总线上挂接多个 DS18B20,通过 ROM 地址寻址,实现多区域温度采集
  4. 精度调整:修改 DS18B20 的配置寄存器(0x4e 命令),切换测温精度(如 0.5℃精度可缩短转换时间)
  5. LCD1602 显示优化:添加温度最大值 / 最小值记录、采集时间显示等功能
  6. 改用 I2C 接口 LCD1602:将并行 LCD1602 改为 I2C 接口版本,减少接线数量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值