沉浸式学习51单片机(6)-单总线温度采集-程序员宅基地

技术标签: 学习  51单片机  嵌入式硬件  

一. 作者小课堂

(一)单总线串行扩展

单总线(也称1-Wire bus)由美国DALLAS公司推出的外围串行扩展总线。只有一条数据输入/输出线DQ,总线上所有器件都挂在DQ上,电源也通过这条信号线供给。      

单总线系统中配置的各种器件,由DALLAS公司提供的专用芯片实现。每个芯片都有64位ROM,厂家对每一芯片都用激光烧写编码,其中存有16位十进制编码序列号,它是器件的地址编号,确保它挂在总线上后,可以唯一被确定。除了器件的地址编码外,芯片内还包含收发控制和电源存储电路。这些芯片耗电量都很小(空闲时几µW,工作时几mW),工作时从总线上馈送电能到大电容中就可以工作,故一般不需另加电。

(二)单总线温度传感器DB18B20

1.简介

 DS18B20是美国DALLAS公司生产的数字温度传感器,体积小、低功耗、抗干扰能力强。可直接将温度转化成数字信号传送给单片机处理,因而可省去传统的信号放大、A/D转换等外围电路。

DS18B20转换时间与分辨率有关。当设定为9位时,转换时间为93.75ms;设定10位时,转换时间为187.5 ms;当设定11位时,转换时间为375ms;当设定为12位时,转换时间为750ms。

2.原理

①DS18B20转换时间

当设定为9位时,转换时间为93.75ms;设定10位时,转换时间为187.5 ms;当设定11位时,转换时间为375ms;当设定为12位时,转换时间为750ms。下表列出了DS18B20温度转换后所得到的16位转换结果的典型值。

②温度转换的计算方法

当DS18B20采集的温度为+125℃时,输出为0x07d0,则:  

实际温度=(0x07d0)/16=(0×163+7×162+13×161+0×160)/16=125℃    

当DS18B20采集的温度为-55℃时,输出为0xfc90,由于是补码,则先将11位数据取反加1得0x0370,注意符号位不变,也不参加运算,则    

实际温度=(0x0370)/16=(0×163+3×162+7×161+0×160)/16=55℃    

注意,负号则需对采集的温度进行判断后,再予以显示。 

3.DS18B20的工作时序

DS18B20的工作时序包括初始化时序、写时序和读时序。

(1)初始化时序,单片机将数据线电平拉低480960µs后释放,等待1560µs,单总线器件即可输出一持续60~240µs的低电平,单片机收到此应答后即可进行操作。

(2)写时序,当单片机将数据线电平从高拉到低时,产生写时序,有写“0”和写“1”两种时序。写时序开始后,DS18B20在15~60µs期间从数据线上采样。如果采样到低电平,则向DS18B20写的是“0”;如果采样到高电平,则向DS18B20写的是“1”。这两个独立时序间至少需拉高总线电平1µs时间。

(3)读时序,当单片机从DS18B20读取数据时,产生读时序。此时单片机将数据线电平从高拉到低使读时序被初始化。如果在此后15µs内,单片机在数据线上采样到低电平,则从DS18B20读的是“0”;如果在此后的15µs内,单片机在数据线上采样到高电平,则从DS18B20读的是“1”。


4. DS18B20的命令

DS18B20片内都有唯一的64位光刻ROM编码,出厂时已刻好。它是DS18B20的地址序列码,目的是使每个DS18B20的地址都不相同,这样就可实现在一根总线上挂接多个DS18B20的目的。64位光刻ROM的各位定义如下:

 DS18B20所有命令均为8位长,常用的命令代码见下表:

 当主机需要对多个单总线上的某一DS18B20进行操作时,首先应将主机逐个与DS18B20挂接,读出其序列号(33H);然后再将所有的DS18B20挂接到总线上,单片机发出匹配ROM命令(55H),紧接着主机提供的64位序列号之后的操作就是针对该DS18B20的。      如果主机只对一个DS18B20进行操作,就不需要读取ROM编码以及匹配ROM编码,只要用跳过ROM(CCH)命令,就可按表10-4执行如下温度转换和读取命令。

二、实践出真知

(一) 实验要求

利用DS18B20和LED数码管实现单总线温度测量系统,原理电路见图11-3。DS18B20测量范围是−55~128℃。本例只显示00~99。通过本例读者应掌握DS18B20特性及单片机I/O实现单总线协议的方法。        

Proteus仿真时,用手动,即用鼠标单击DS18B20图标上的“↑”或“↓”来改变温度,注意手动调节温度同时,LED数码管会显示出与DS18B20窗口相同的2位温度数值。        

电路中74LS47是BCD-7段译码器/驱动器,用于将单片机P0口输出欲显示的BCD码转化成相应的数字显示的段码,并直接驱动LED数码管显示。

(二)实验演示

1.Proteus

①原理图
②代码
#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++)            //连续扫描数码管10次
         {
             out=(temp/10)&0x0f;
             smg1=0;
             smg2=1;
             delay5(1000);            //延时5ms
             out=(temp%10)&0x0f;
             smg1=1;
             smg2=0;
             delay5(1000);            //延时5ms
         }
    }
}
void delay5(uchar n)            //函数功能:延时5μs    
{
     do
     {
         _nop_();
         _nop_();
         _nop_();
         n--;
     }
     while(n);
}

void init_ds18b20(void)        //函数功能:18B20初始化
{
     uchar x=0; 
     DQ =0;    
     delay5(120); 
     DQ =1;    
     delay5(16);
     delay5(80);
}
uchar readbyte(void)             //函数功能:读取1字节数据
{
    uchar i=0;
    uchar date=0;
    for (i=8;i>0;i--)
    {
          DQ =0;
          delay5(1);
          DQ =1;            //15μs内拉释放总线
          date>>=1;
          if(DQ)
          date|=0x80;
          delay5(11);
     }
     return(date);
}
void writebyte(uchar dat)             //函数功能:写1字节
{
 uchar i=0;
 for(i=8;i>0;i--)
 {
      DQ =0;
      DQ =dat&0x01;                //写"1" 在15μs内拉低
      delay5(12);                   //写"0" 拉低60μs
      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);
}
③实验结果

2.普中开发板

①原理图
②代码
/**************************************************************************************
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN
 普中

实验名称:DS18B20温度传感器实验
接线说明:	
实验现象:下载程序后,插上DS18B20温度传感器,数码管显示检测的温度值
注意事项:注意温度传感器的方向,在接口处我们已经用丝印画了一个凸起,
		  所以只需要将温度传感器对应插入即可																				  
***************************************************************************************/
#include "public.h"
#include "smg.h"
#include "ds18b20.h"


/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	u8 i=0;
   	int temp_value;
	u8 temp_buf[5];

	ds18b20_init();//初始化DS18B20

	while(1)
	{				
		i++;
		if(i%50==0)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间
			temp_value=ds18b20_read_temperture()*10;//保留温度值小数后一位
		if(temp_value<0)//负温度
		{
			temp_value=-temp_value;
			temp_buf[0]=0x40;//显示负号	
		}
		else
			temp_buf[0]=0x00;//不显示
		temp_buf[1]=gsmg_code[temp_value/1000];//百位
		temp_buf[2]=gsmg_code[temp_value%1000/100];//十位
		temp_buf[3]=gsmg_code[temp_value%1000%100/10]|0x80;//个位+小数点
		temp_buf[4]=gsmg_code[temp_value%1000%100%10];//小数点后一位
		smg_display(temp_buf,4);
	}		
}
③实验结果

DS18B20升温视频

DS18B20降温视频

(三)Keil中的仿真运行

将上述实验成功的代码在Keil中进行仿真运行,使用虚拟逻辑分析仪显示单片机与DS18B20的DQ数据线连接引脚的波形,分析其“初始化-->写--->读”总线时序,与原理进行对比分析:

三.总结

通过这次学习,我掌握了:

1.学习单总线温度传感器DB18B20的原理和通信时序;

2.使用51单片机的一个 IO 口模拟单总线时序与温度传感器DS18B20通信,将检测的环境温度读取出来。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Cynthia040330/article/details/137924897

智能推荐

multipartfile上传文件 大小限制_multipartfile 大小限制-程序员宅基地

文章浏览阅读1.4w次,点赞7次,收藏15次。关于文件上传大小 主要看一个错误org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size (59500387) exceeds the configured maximum (10485760) at org.apache.tomcat.util.http.fileupload.impl.FileItemIteratorImpl.ini_multipartfile 大小限制

基于python的信用卡评分模型_python 信用 评分卡模型-程序员宅基地

文章浏览阅读4.4w次,点赞45次,收藏418次。基于python的信用卡评分模型1. 项目背景介绍1.1 信用风险和评分卡模型的基本概念 信用风险指的是交易对手未能履行约定合同中的义务造成经济损失的风险,即受信人不能履行还本付息的责任而使授信人的预期收益与实际收益发生偏离的可能性,它是金融风险的主要类型。 借贷场景中的评分卡是一种以分数的形式来衡量风险几率的一种手段,也是对未来一段时间内违约、逾期、失联概率的预测。一般来说..._python 信用 评分卡模型

linux 下 tcpdump 详解 前篇(libpcap库源码分析)_libcap 源码-程序员宅基地

文章浏览阅读1.7k次,点赞3次,收藏22次。一 概述用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 至于tcpdump参数如何使用,这不是本章讨论的重点。liunx系统抓包工具,毫无疑问就是tcpdump。而windows的抓包工具,wireshark也是一款主流的抓包工具。wireshark 使用了winpcap库。tcpdump..._libcap 源码

http://mirrors.aliyun.com/epel/6/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 --程序员宅基地

文章浏览阅读6.5k次,点赞14次,收藏11次。http://mirrors.aliyun.com/epel/6/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - “The requested URL returned error: 404 Not Found”Trying other mirror.Error: Cannot retrieve repository metadata (repomd.xml) for repository: epel. Please verify its_/epel/6/x86_64/repodata/repomd.xml: [errno 14] pycurl error 22 - "the reques

Audio System 九 之 AudioTrack_audiotrackserverproxy-程序员宅基地

文章浏览阅读1k次。Audio System 九 之 AudioTrack十四、AudioTrack & AudioFlinger 相关类14.1 AudioTrack & AudioFlinger 的类图14.1.1 AudioFlinger::PlaybackThread 回放线程基类14.1.2 AudioFlinger::PlaybackThread::Track 音频流管理类14.1...._audiotrackserverproxy

Redis 通用命令(keys,help,mset,exists,expire,ttl,tab补全)_redis如何添加help命令-程序员宅基地

文章浏览阅读874次。redis 通用命令 _redis如何添加help命令

随便推点

这台计算机似乎没有安装操作系统_前沿科技 | 浙江大学科学家联合之江实验室成功研制全球神经元规模最大的类脑计算机...-程序员宅基地

文章浏览阅读172次。1.6米高的三个标准机柜并排而立,黑色的外壳给人酷酷的感觉,红色的信号灯不停地闪烁,靠得近些似乎能听到里面脉冲信号飞速奔跑的声音。近日,浙江大学科学家团队联合之江实验室共同研制成功了我国首台基于自主知识产权类脑芯片的类脑计算机(Darwin Mouse)。这台类脑计算机包含792颗浙江大学研制的达尔文2代类脑芯片,支持1.2亿脉冲神经元、近千亿神经突触,与小鼠大脑神经元数量规模相当,典型..._浙江大学 类脑 方向

实现RTSP摄像机进行网页直播和微信直播的技术方案:EasyNVR版本免费更新方法_easynvr免费版-程序员宅基地

文章浏览阅读2.7k次。问题背景前文我们提过为保障服务器正常稳定运作,EasyNVR有专业的运维(售前支撑、商务咨询、售后维护)团队,随时对客户各种突发情况快速响应处理,保证互联网直播的顺利进行。这部分工作就包括技术问题咨询、需求分析、方案制定、版本更新、功能提升等,随着用户基数的增加,运维过程中或多或少存在一些回复延迟,主要包括以下几个方面:EasyNVR的用户越来越多,技术人员一一对应解答效率不高;随着Eas..._easynvr免费版

P1541 [NOIP2010 提高组] 乌龟棋 题解_乌龟棋2010-程序员宅基地

文章浏览阅读401次,点赞3次,收藏4次。更好的阅读体验蒟蒻的第一篇题解P1541 [NOIP2010 提高组] 乌龟棋简单的背包 首先确定状态,dp[a][b][c][d]用来存储使用a张爬行卡片1,b张爬行卡片2,c张爬行卡片3,d张爬行卡片4时的最大得分。 我们需要开一个桶的数组t存4种牌的个数,以便于暴力。 dp数组初始化。很显然,四种卡片都用0张时,在起点,分数为score[1] 即: dp[0][0][0][0]=score[1]; 状态转移。DP 4种卡片的个数,状态转移方程为_乌龟棋2010

计算机网络 | 划分子网_计算机网络子网划分-程序员宅基地

文章浏览阅读5.5k次,点赞11次,收藏69次。划分子网概念先知了解 什么是子网?了解 为什么要划分子网?划分子网的好处/优点是什么?介绍 子网掩码总结 子网掩码记住 IP 地址的自然分类问题求解一个网络,主机号有x位,则这个网络可以分配给主机的IP地址有多少个?子网划分实例问题1题目分析题目解题方法参考内容概念先知了解 什么是子网?子网或子网络是网络内部的网络。子网使网络更高效。通过子网划分,网络流量传播距离更短,无需通过不必要的路由器即可到达目的地。了解 为什么要划分子网?划分子网的好处/优点是什么?1.减少广播带来的负面影响2.节_计算机网络子网划分

Java利用JNA调用C#的dll-程序员宅基地

文章浏览阅读7.3k次,点赞2次,收藏23次。https://www.cnblogs.com/wyongbo/p/jnaTest.html本文参考以上链接,结合自己实际遇到的问题,做过一些修改(红色字体标注),主要是为了给自己做个笔记。一、需求阐述:  如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实...

linux查看系统编码和修改系统编码的方法_linux 机器编码设置-程序员宅基地

文章浏览阅读1.4w次。查看支持的字符编码使用locale命令,如:. 代码如下:# localeLANG=en_US.UTF-8LC_CTYPE="en_US.UTF-8"LC_NUMERIC="en_US.UTF-8"LC_TIME="en_US.UTF-8"LC_COLLATE="en_US.UTF-8"LC_MONETARY="en_US.UTF-8"LC_MESSAG_linux 机器编码设置