利用DS18B20和LED数码管实现单总线温度测量系统

本文介绍了DS18B20数字温度传感器的特性,如1-Wire接口、多路采集和自定义精度等,并展示了如何使用51单片机配合Proteus和Keil进行温度检测与显示的示例,强调了时序在通信中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

1.1一般说明

DS18B20数字温度传感器提供9-Bit到12-Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。DS18B20采用的1-Wire通信即仅采用一个数据线(以及地)与微控制器进行通信。该传感器的温度检测范围为-55℃至+125℃,并且在温度范围超过-10℃至85℃之外时还具有±0.5℃的精度。此外,DS18B20可以直接由数据线供电而不需要外部电源供电。

每片DS18B20都有一个独一无二的64位序列号,所以一个1-Wire总线上可连接多个DS18B20设备。因此,在一个分布式的大环境里用一个微控制器控制多个DS18B20是非常简单的。这些特征使得其在HVAC环境控制,在建筑、设备及机械的温度监控系统,以及温度过程控制系统中有着很大的优势。

1.2特性

· 独特的1-Wire总线接口仅需要一个管脚来通信。
· 每个设备的内部ROM上都烧写了一个独一无二的64位序列号。
· 多路采集能力使得分布式温度采集应用更加简单。
· 无需外围元件。
· 能够采用数据线供电;供电范围为3.0V至5.5V。
· 温度可测量范围为:-55℃至+125℃(-67℉至+257℉)。
· 温度范围超过-10℃至85℃之外时具有±0.5℃的精度。
· 内部温度采集精度可以由用户自定义为9-Bits至12-Bits。

二、使用DS18B20温度传感器、数码管显示检测的温度值

在Proteus中绘制仿真图:

pro
实现代码:

#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int 
#define out P0
sbit smg1 = out ^ 4;
sbit smg2 = out ^ 5;
sbit DQ = P3 ^ 7;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void);
void main(void)			     
{
	uchar i, temp;
	delay5(1000);
	while (1)
	{
		temp = retemp();
		for (i = 0; i < 10; i++)			
		{
			out = (temp / 10) & 0x0f;
			smg1 = 0;
			smg2 = 1;
			delay5(1000);		
			out = (temp % 10) & 0x0f;
			smg1 = 1;
			smg2 = 0;
			delay5(1000);			
		}
	}
}
void delay5(uchar n)			
{
	do
	{
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		n--;
	}
	while (n);
}

void init_ds18b20(void)		
{
	uchar x = 0;
	DQ = 0;
	delay5(120);
	DQ = 1;
	delay5(16);
	delay5(80);
}
uchar readbyte(void) 			
{
	uchar i = 0;
	uchar date = 0;
	for (i = 8; i > 0; i--)
	{
		DQ = 0;
		delay5(1);
		DQ = 1;			
		date >>= 1;
		if (DQ)
		date |= 0x80;
		delay5(11);
	}
	return(date);
}
void writebyte(uchar dat) 			
{
	uchar i = 0;
	for (i = 8; i > 0; i--)
	{
		DQ = 0;
		DQ = dat & 0x01;			
		delay5(12);	   		
		DQ = 1;
		dat >>= 1;
		delay5(5);
	}
}
uchar retemp(void)			
{
	uchar a, b, tt;
	uint t;
	init_ds18b20();
	writebyte(0xCC);
	writebyte(0x44);
	init_ds18b20();
	writebyte(0xCC);
	writebyte(0xBE);
	a = readbyte();
	b = readbyte();
	t = b;
	t <<= 8;
	t = t | a;
	tt = t * 0.0625;
	return(tt);
}

(需要注意数码管刷新速度,过慢就会看起来是乱“跳”的)
演示结果:
在这里插入图片描述
普中开发板演示:
在这里插入图片描述
(温度在LCD1602A中成功显示,并且与实际温度相符,演示成功。)

三、总结

本实验学习了DS18B20温度传感器的原理和单总线通信时序,通过51单片机的IO口模拟时序,成功在Proteus和普中开发板上实现了环境温度采集。在Keil中仿真运行代码,通过虚拟逻辑分析仪分析时序,验证了其符合技术要求。故意修改时序后,DS18B20无法正确响应,证明时序的重要性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一大Cpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值