51单片机DS18B20温度传感器及数码管显示温度

MATLAB与51单片机进行串口通信详解 目录一、51单片机与电脑进行串口通信二、MATLAB串口通信函数三、串口属性四、示例Demo4.1 MATLAB接收单片机发来的数据4.2 MATLAB向单片机发送数据控制LED五、总结 一、51单片机与电脑进行串口通信 关于51单片机与电脑进行串口通信在前文已经介绍过了,有兴趣的可以参考文章:51单片机之串口通信详解及代码示例。 二、MATLAB串口通信函数 Matlab并不具备直接访问硬件的能力,但是支持面向对象技术,通过调用Instrument Control Toolbox中的serial类函数来创 阅读详情
AI摘要

本文介绍了如何使用51单片机读取DS18B20温度传感器数据,并在数码管上显示温度。详细解释了单总线通信原理,包括初始化、写入和读取数据的过程。

51单片机DS18B20温度传感器及数码管显示温度

大家好,今天给大家带来的代码及原理解释是,在51单片机在接收DS18B20温度传感器数据,并且在数码管上实时显示温度

DS18B20作用

								我们常用的DS18B20长什么样呢

它一共有3个角,分别是
GND(接地)
DQ(数据总线,与单片机的一个IO口相连)
Vdd(电源供应)
在这里插入图片描述
我使用的单片机是清翔的V3.21 单片机,采用的芯片是STC89C52

DS18N20的电路原理图

在这里插入图片描述
因此,我会在C语言中用 sbit DS = P2^2 声明这个IO口叫做DS(DS18B20的数据总线),也就是我们可以写DS为 1或0 来控制它为低电平还是高电平

在这里插入图片描述
传感器输出的信号不可能是一个我们人类一眼就看的出的十进制数字,因此,我们需要将DS18B20输出的数字信号转换成一个十进制数字,让我们人类看的懂

那么,我们应该怎样去读出DS18B20的数字信号呢,前提当然是我们首先得发出指令,让DS18B20知道我们要让它做什么

怎么读取DS18B20的“1”和“0”

DS18B20采用1-wire Bus(单总线时序),与之前的I2C和SPI(ADDA中光敏电阻和热敏电阻)不同,它只有一条线,因此,我们在给DS18B20发出和接收信号时,任何时序都必须非常严格以确保读出数据的准确,对我个人而言,SPI总线让我觉得非常舒服,因为它只有三个函数(89C52),虽然1-wire也只有三个函数,但它有非常严格的时序要求,写或读data要多少微秒以内才可以成功不出差错运行等等,待会大家就明白为什么了

我先给大家看三个步骤,然后告诉大家怎么在C语言上实现这三个步骤

  1. 初始化DS18B20
  2. 写入ROM操作指令(在初学中我们一般只使用忽略ROM指令)
  3. 写入DS18B20功能指令(一般用温度准换指令和读取快速暂存器指令)

如何初始化DS1820呢

bit DSInit()
{
  bit i;
  DS = 1;
  _nop_();
  DS = 0;
  delay_us(75);//拉低总线499.45us延时,在DQ总线上的DS18B20全部被复位
  DS = 1; //释放总线
  delay_us(4);  //37.95us
  i = DS;
  delay_us(20);   //141.95us,等待18b返回低电平存在信号
  DS = 1;//释放总线
  _nop_();
  return (i);
}
//us执行函数,执行一次us所需6.5us进入一次11.95us
void delay_us(uchar us)
{
  while(us--);
}
图为初始化时序

在这里插入图片描述
初始化时序里面包含了复位DS18B20和接收DS218B20的存在信号

主机和DS18B20做任何通讯前都需要对其初始化,初始化期间,总线控制器拉低总线并保持480us以上,挂在总线上的器件将被复位,然后释放总线,等到15-60us,此时18B20将返回一个60-240us的低电平存在信号,我们需要等待60-240us,来接收完这个低电平存在信号
如何进行写时序和读时序操作

void DSWriteByte(uchar dat)    //总线每次只能写一位进去
{
  uchar i;
  for(i = 0;i<8;i++)
  {
    DS = 0;   //下拉总线
    _nop_();    //产生一点时序
    DS = dat & 0x01;    //0x01  00000001
    delay_us(10);   //76.95us
    DS = 1;   //上拉总线
    _nop_();
    dat >>= 1;    //dat右移一位
  }
}
//读一个字节
uchar DSReadByte()
{
  uchar i,dat,j;
  for(i = 0;i<8;i++)
  {
    DS = 0;
    _nop_();    //产生读时序
    DS = 1;     //释放总线
    _nop_();
    j = DS;
    delay_us(10);   //76.95us
    DS = 1;
    _nop_();
    dat = ((j<<7)|(dat>>1) );
  }
  return (dat);
}
图为写时序和读时序

在这里插入图片描述
在这里插入图片描述

  1. 写时序分为写0时序和写1时序
  2. 总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。
  3. 总线控制器要产生一个写时序,必须将总线拉低最少1us,产生写0时序时总线必须保持低电平60~120us之间,然后释放总线,产生写1时序时在总线产生写时序后的15us内允许把总线拉高。注意:2次写周期之间至少间隔1us(完成一个for循环大概就1us)
  4. 各位谨记上拉总线电压来释放总线
  5. 每一次 DS18B20 的操作都必须满足以上步骤,若是缺少步骤或是顺序混乱,器件
    将不会返回值。例如这样的顺序:发起 ROM 搜索指令[F0h]和报警搜索指令[ECh]
    之后,总线控制器必须返回步骤 1。

因为我本身也是一个初学者,所以我对SPI总线和I2C还有UART串口通信,还比较模糊,我也建议各位认真,并且重复揣摩芯片手册,或者能读懂芯片手册,按照芯片手册来写出我们想要的效果,这样,我觉得我们才能成为一名合格的单片机学习者


怎么让数码管显示在单片机的数码管上

这里就直接给大家上代码吧!

代码很长,但希望大家能够仔细对照着时序图阅读

/*DS18B20只在一根通信线上 1-Wire
只有唯一的64位序列码储存在板载ROM(方便识别DS18B20)
12位分辨率对应为0.0625度*/
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

//共阴数码管段选表0-9
uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//数码管位选码
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb, 0xf7};

sbit DS = P2^2;     //DS18B20  DQ数据角
sbit DU= P2^6;
sbit WE = P2^7;

void delay_us(uchar);
/*1.初始化
  2.ROM操作指令
  3.功能指令*/

/*if i == 0 那么18b20在总线上并且准备就绪*/
bit DSInit()
{
  bit i;
  DS = 1;
  _nop_();
  DS = 0;
  delay_us(75);//拉低总线499.45us延时,在DQ总线上的DS18B20全部被复位
  DS = 1; //释放总线
  delay_us(4);  //37.95us
  i = DS;
  delay_us(20);   //141.95us,等待18b返回低电平存在信号
  DS = 1;//释放总线
  _nop_();
  return (i);
}
//写一个字节
void DSWriteByte(uchar dat)    //总线每次只能写一位进去
{
  uchar i;
  for(i = 0;i<8;i++)
  {
    DS = 0;   //下拉总线
    _nop_();    //产生一点时序
    DS = dat & 0x01;    //0x01  00000001
    delay_us(10);   //76.95us
    DS = 1;   //上拉总线
    _nop_();
    dat >>= 1;    //dat右移一位
  }
}
//读一个字节
uchar DSReadByte()
{
  uchar i,dat,j;
  for(i = 0;i<8;i++)
  {
    DS = 0;
    _nop_();    //产生读时序
    DS = 1;     //释放总线
    _nop_();
    j = DS;
    delay_us(10);   //76.95us
    DS = 1;
    _nop_();
    dat = ((j<<7)|(dat>>1) );
  }
  return (dat);
}
//us执行函数,执行一次us所需6.5us进入一次11.95us
void delay_us(uchar us)
{
  while(us--);
}
void display(uint i)
{
	uchar b, s, g;
	static uchar wei;
	b = i / 100;
	s = i % 100 / 10;
	g = i % 10;
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = SMGwei[wei];
	WE = 0;//锁存位选数据
	P0 = 0XFF;//清除断码
	switch(wei)
	{
		case 0: DU = 1; P0 = SMGduan[b]; 	DU = 0; break;
		case 1: DU = 1; P0 = SMGduan[s]|0x80; 	DU = 0; break;
		case 2: DU = 1; P0 = SMGduan[g]; 	DU = 0; break;
	}
	wei++;
	if(wei == 3)
		wei = 0;
}
void main()
{
  uchar L,M;
	uint i;
  while(1)
  {
    DSInit();   //初始化
    DSWriteByte(0xcc);    //发送忽略ROM指令
    DSWriteByte(0x44);    //发送完指令后,DS18B20开始转换并且存储到高速寄存器
    DSInit();
    DSWriteByte(0xcc);    //发送忽略ROM指令
    DSWriteByte(0xbe);    //读取DS18B20暂存器指令
    L = DSReadByte();   //读取LS BYTE
    M = DSReadByte();   //读取MS BYTE
    i = M;
    i<<=8;
    i |= L;		//效果为	假设M为00000111 左移八位变为 0000011100000000(<<自动补全0)然后或上L,相当于M+L 
    i = i*0.0625*10 +0.5;   //+0.5 为了四舍五入。因为if为int型,自动抛掉小数点后面
		display(i);
  }
}

大家有不懂的都可以私信博主!

代码成功运行图:  				 坐标苏州,室内温度20度左右

坐标苏州,室内温度20度左右

51单片机DS18B20温度读取 本文是武汉市海联天下物联网有限公司技术团队内部学习笔记,将详细讲解DS18B20温度显示以及51单片机如何利用单总线与DS18B20通信,DS18B20重要时序掌握。——技术部 张傲 现象描述 使用DS18B20测量温度,并在数码管中显示出来。 阅读详情

相关推荐

51单片机 | DS18B20 温度传感器实验

DS18B20 温度传感器实验

F4_Family的博客 4326

oled显示屏+ds18b20 显示温度和时间.zip

51单片机+ds18b20温度模块,采集出来的温度显示在oled液晶屏显示 。

51单片机温度传感器DS18B20(数码管动态显示)的使用笔记

若有错误欢迎指正,共同学习。本次经验分享当成自己的一次学习记录。 使用的开发板为普中开发板,stc89c52,晶振频率为11.0592MHZ。 单总线的初始化时序相当严格,精确到了微秒。

u011454061的博客 4808

六、51单片机 使用Proteus仿真实现用DS18B20测量温度并用数码管显示(仿真及代码)

使用Proteus仿真实现用DS18B20测量温度并用数码管显示

m0_47235364的博客 3223

51单片机DS18B20温度传感器实战:从单总线协议解析到LCD1602/数码管双显示系统设计

本文详细解析了51单片机驱动DS18B20温度传感器的单总线协议,并实现了LCD1602和数码管双显示系统的设计。从严格的时序控制到温度数据处理,再到双显示系统的资源分配与优化,提供了完整的实战指南和代码示例,帮助开发者快速掌握高精度温度测量与显示技术。

weixin_30561177的博客 397

DS18B20测温与数码管显示

原本要写一篇DS18B20测温LCD1602显示的实验,应关注者的要求先写了一篇DS18B20测温与数码管显示的实验。DS18B20测温与数码管显示是通过51单片机读取DS18B20的温度值,然后实时的通过数码管显示当前温度值。 1.系统原理图(回复关键字DS18B20,自动获取原理图代码下载连接) 数码管采用的共阳极数码管,数据口段码接单片机的P0口,位选信号接的单片机的P2.0、P2.1、P2.2、P2.3。其中P2.0控制百位显示,P2.1控制十位显示,P2.2控制各位...

8823

51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示代码详解

51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示

m0_73931287的博客 1万+

51单片机+DS18b20+数码管显示

51单片机+DS18b20+数码管显示 Proteus仿真 主程序代码 //#include <reg51.h> #include <AT89X52.H> #include "temp.h" sbit DULA=P2^0; sbit WELA=P2^1; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar

perseverance51博客 861

基于51单片机及DS18B20温度传感器数码管显示程序

#include #include sbit DQ=P1^4;//温度采集 sbit latch1=P2^2;//段锁存 sbit latch2=P2^3;//位锁存 unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码0~9 unsigned cha

小破孩不懂AI 3万+

51单片机DS18B20温度传感器与数码管显示实战详解

在嵌入式系统与物联网应用中,传感器数据采集与显示是基础且核心的技术环节。其原理在于通过微控制器的通用输入输出(GPIO)引脚,遵循特定的通信协议与传感器交互,获取物理世界的模拟或数字信息,再经由显示器件直观呈现。这项技术的价值在于打通了从物理信号感知到人机信息交互的完整链路,是实现智能监控、环境感知等功能的基石。典型的应用场景包括智能家居中的温湿度监测、工业现场的数据采集仪表等。本文将以经典的51单片机平台为例,深入剖析如何利用单总线协议驱动DS18B20温度传感器,并结合动态扫描技术驱动数码管进行实时温度

weixin_29175469的博客 338

51单片机DS18B20温度传感器与数码管动态显示系统全解析

在嵌入式系统与物联网应用中,传感器数据采集与实时显示是基础且核心的技术环节。其原理在于通过微控制器(如经典的51单片机)的GPIO口,遵循特定的通信协议(如单总线协议)与传感器交互,获取物理量数据,再经过数据处理算法,最终通过显示器件(如数码管)进行人机交互。这项技术的价值在于将抽象的物理信号转化为直观的数字信息,是实现智能监控、环境感知等功能的基石。其应用场景广泛,从工业测温到智能家居温控系统无处不在。本文聚焦于一个经典的工程实践案例:使用51单片机驱动DS18B20数字温度传感器,并利用动态扫描技术驱动

weixin_32770423的博客 274

51单片机实战:DS18B20温度传感器的高精度测温与数码管显示

本文详细介绍了51单片机驱动DS18B20数字温度传感器实现高精度测温的完整实战过程。从单总线协议时序解析、核心代码编写到温度数据处理与数码管动态显示,提供了清晰的避坑指南与精度提升技巧,帮助开发者快速掌握这一经典传感器应用。

weixin_29174013的博客 455

51单片机DS18B20温度传感器与数码管显示:时序、中断与状态机实战

在嵌入式系统与物联网应用中,传感器数据采集与人机交互是核心基础。单总线通信协议作为一种节省IO资源的串行通信方式,其关键在于严格的时序控制,通过主机与从机在单一数据线上按照特定时间槽进行复位、读写操作来完成数据交换。理解其底层原理,特别是如何实现不依赖于特定主频的稳健时序,是确保通信可靠性的技术重点。这项技术的价值在于为分布式传感网络提供了简洁高效的连接方案,广泛应用于环境监测、智能家居等需要多点测温的场景。以经典的DS18B20数字温度传感器为例,其单总线协议要求精确的微秒级延时和正确的总线释放机制,否则

weixin_30162121的博客 227

单片机51采集18B20温度并控制LCD1602显示

单片机利用P1口对液晶LCD1602进行控制,并将所得数据通过18B20进行显示,内含LCD1620的文档(中文),18B20的中英文文档,以后将上传将温度存储在IIC,通过串口显示到PC,通过USB传到上位机以及传到上位机后,通过网络传到服务器并进行网页登陆式访问(开发中)。

基于51单片机的DS18B20温度读取与数码管显示项目

通信协议是网络设备之间交换数据时所遵循的规则集。在单线通信协议中,只使用一根数据线来传输数据与控制信号。这种协议的优势在于简化了布线需求,降低了系统的复杂度和成本。不过,它也引入了额外的挑战,包括信号同步、冲突检测和错误处理等问题。单线通信协议使用一种称为“单线技术”的方法,它通过时间多路复用的方式来区分不同类型的信号。比如,在DS18B20数字温度传感器中,使用单根线既发送命令也读取数据。该协议定义了各种时间窗口来确定是否为初始化脉冲、写时序或读时序。

weixin_42388898的博客 833

DS18B20代码51单片机代码

DS18B20代码51单片机源码,以及资料。。。51、51单片机,DS18B20是常用的数字温度传感器

简易数码管显示温度计设计,简单易上手-电路方案

硬件只需STC单片机+DS18B20+3位共阴数码管即可实现一个精简温度计的设计。单片机STC15W408AS(内部集成了高精度可调晶振)通过DS18B20读取温度,用推挽方式直接驱动3位共阴数码管显示温度。(0-99.9摄氏度) 单片机和数码管叠罗汉(单片机插在面包板上后数码管插在面包板单片机引脚对应的位置) 程序中DS18B20.H驱动不适合直接用于STC89/STC90系列及其他公司的单片机(延时时间不同需修改) 如何读取负温度: DS18B20测温范围 -55℃~+125℃ 温度的读取 DS18B20在出厂时以配置为11位,读取温度时共读取16位,前5个位为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正数。温度为正时读取方法为:将16进制数转换成10进制即可。温度为负时读取方法为:将16进制取反后加1,再转换成10进制即可。例:0550H = +85 度,FC90H = -55 度。 所以你只需把转化和显示负温度的程序加进去就可以了。

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 552
上一篇: ## 51单片机通过模拟PWM信号输出,利用光敏电阻控制led10
下一篇: 51单片机红外通信及控制LED灯(LCD1602显示)
knbroken
博客等级 码龄8年 104粉丝 9原创
评论 34
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值