Ds18B20理解与运用

news2025/1/18 16:59:25

在51单片机中,DS18B20是一个十分重要的外设,它是一个温度传感器,可以读取温度并以16位的数据输出。这个数据由四位符号位,7位整数位和4位小数位组成。当符号位都是0的时候,温度是零上温度;当符号位都是1的时候,表示温度是零下温度。

在51单片机中运用DS18b20模块,有一套较为固定的用法,首先,我们先引入DS18B20厂家所提供的底层驱动代码,写好头文件。第二部,我们需要先初始化ds18b20,接着向模块里写入0xcc,跳过ROM指令,接着写入0x44,0x44将收集到的温度数据转换,这需要大概800ms的时间,所以我们后面可以跟上一个Delay函数,这个函数由自己编写或者使用isp软件提供的方法生成。延时结束以后我们在复位一下DS18b20传感器,接着继续写入0xcc,跳过ROM指令,在写入0xbe,读取告诉暂存器。在最开始我们设立了俩个变量,LSB与HSB,LSB是用来暂存数据的第一字节的,HSB是用来暂存数据的第二字节的。我们先将数据同时赋给这俩个变量,然后用一个在外面创建的int 类型全局变量Temp来接受数据HSB,接着将HSB左移8位,那么就会空出8位为0,接着或上LSB的数值,0或上任何数就是任何数,于是现在Temp中的数值就是温度的数值了。

接着,我想要得到一个由两位整数和一位小数组成的数据,要如何实现呢?首先,我们先来判断该数据的正负,我们先将该数据与上0xf800,判断符号位是否为0,若符号位都为0,表示温度为正数,则if通过,进入下面的语句,先将Temp右移4位,舍弃4位小数位,保留整数位,接着将Temp放大十倍,有人会疑惑为什么放大十倍,若我们的数据假设是23.3,这是一个浮点数,不好处理,我们将数据放大10倍以后就是一个整数了,处理起来比较容易。后面再让LSB与上0x0f,取出LSB的低4位,再乘以0.0625(分辨率)再乘以10,最终加上已经是整数的Temp,就得到了一个要求的小数。

void DS18b20()
{
	unsigned char LSB,HSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay1(1000);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB = Read_DS18B20();
	HSB = Read_DS18B20();
	
	Temp = HSB;
	Temp = (Temp<<8) | LSB;
	if((Temp & 0xf800) == 0x0000)
	{
		Temp >>= 4;
		Temp *= 10;
		Temp = Temp + (LSB & 0x0f)*0.625;
	}
}

 整体代码最终实现如图所示

main.c 

#include <REG52.H>
#include "onewire.h"


unsigned int Temp;

code unsigned char SMG1[20] = {0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e };

code unsigned char code SMG2[20] = {0xc0, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10, 0x03, 0x46, 0x21, 0x06,0x0e};





void Delay(unsigned int t)
{
	while(t--);
}

void SelectHC573(unsigned char channel)
{
	switch (channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
			break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
			break;	
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
			break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
			break;
		case 0:
			P2 = 0xff;
			break;
	}
}

void SMG_Bit(unsigned char pos,unsigned char dat)
{
	SelectHC573(6);
	P0 = 0x01 << pos;
	SelectHC573(7);
	P0 = dat;
	SelectHC573(0);
}

void Init_SMG(unsigned char dat)
{

	SelectHC573(6);
	P0 = 0xff;
	SelectHC573(7);
	P0 = dat;
	SelectHC573(0);
}

void SHOWSMG()
{
	SMG_Bit(7,SMG1[Temp%10]);
	Delay(100);
	SMG_Bit(6,SMG1[(Temp%100)/10]);
	Delay(100);	
	SMG_Bit(5,SMG1[(Temp/100)%10]);
	Delay(100);	
	

	
	Init_SMG(0xff);
	Delay(100);
}

void Delay1(unsigned int t)
{
	while(t--)
	{
		SHOWSMG();
	}
}

void DS18b20()
{
	unsigned char LSB,HSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay1(1000);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB = Read_DS18B20();
	HSB = Read_DS18B20();
	
	Temp = HSB;
	Temp = (Temp<<8) | LSB;
	if((Temp & 0xf800) == 0x0000)
	{
		Temp >>= 4;
		Temp *= 10;
		Temp = Temp + (LSB & 0x0f)*0.625;
	}
}

void main()
{
	
	while(1)
	{
		DS18b20();
		SHOWSMG();
	}
	
}

onewire.h

#ifndef _ONEWIRE_H
#define _ONEWIRE_H

#include "reg52.h"

sbit DQ = P1^4;
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);



#endif 

onewire.c

#include "onewire.h"
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

//
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于隐私保护的可追踪可撤销密文策略属性加密方案论文阅读

论文是2022年发表的A Traceable and Revocable Ciphertext-Policy Attribute-based Encryption Scheme Based on Privacy Protection 摘要 本篇论文提出了一种具有用户撤销、白盒追踪、策略策略隐藏功能的CP-ABE方案。在该方案中密文被分为两个部分&#xff1a;第一个部分是和…

ros小问题之rosdep update time out问题

在另外一篇ROS 2边学边练系列的文章里有写碰到这种问题的解决方法&#xff08;主要参考了其他博主的文章&#xff0c;只是针对ROS 2做了些修改调整&#xff09;&#xff0c;此处单拎出来方便查找。 在ROS 2中执行rosdep update时&#xff0c;报出如下错误&#xff1a; 其实原因…

296个地级市GDP相关数据集(2000-2023年)

01、数据简介 GDP&#xff0c;即国内生产总值&#xff08;Gross Domestic Product&#xff09;&#xff0c;是指一个国家或地区所有常住单位在一定时期内生产活动的最终成果。 名义GDP&#xff0c;也称货币GDP&#xff0c;是指以生产物品和劳务的当年销售价格计算的全部最终产…

腾讯云4核8G服务器性能怎么样?大明白来说说

腾讯云4核8G服务器价格&#xff1a;轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线&#xff1f;支持30个并发数&#xff0c;可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

WPF中通过自定义Panel实现控件拖动

背景 看到趋时软件的公众号文章&#xff08;WPF自定义Panel&#xff1a;让拖拽变得更简单&#xff09;&#xff0c;发现可以不通过Drag的方法来实现ListBox控件的拖动&#xff0c;而是通过对控件的坐标相加减去实现控件的位移等判断&#xff0c;因此根据文章里面的代码,边理解边…

【随笔】Git 高级篇 -- 相对引用1(十二)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

腾讯云4核8G12M服务器和标准型S5服务器配置价格表

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

2024年干货分享!11个无版权免费可商用高清素材网站分享,含图片插画图标

在当今这个信息化的时代&#xff0c;图片已成为我们生活与工作中不可或缺的一部分。对于设计师、自媒体人&#xff0c;网站设计师&#xff0c;以及众多创作者而言&#xff0c;都迫切需要高品质的图片来提升作品的吸引力。 然而&#xff0c;寻觅无版权、免费且高清的图片资源实…

商品购买过程中,库存的抵扣过程是怎样的?如何防止超卖?

在商品购买的过程中&#xff0c;库存的抵扣过程&#xff0c;一般操作如下&#xff1a; 1、select根据商品id查询商品的库存。 2、根据下单的数量&#xff0c;计算库存是否足够&#xff0c;如果存库不足则抛出库存不足的异常&#xff0c;如果库存足够&#xff0c;则减去扣除的…

全栈的自我修养 ———— react中router入门+路由懒加载

router 下载router配置view创建目录配置index.js 下载router npm install react-router-dom配置view 如下将组件倒出 const Login () > {return <div>这是登陆</div> } export default Login创建目录 配置index.js React.lazy有路由懒加载的功能&#xff0…

全猎/暴漏攻击面搜索

推荐&#xff1a; FullHunt | Expose YourAttack Surface Discover, monitor, and secure your attack surface. FullHunt delivers the best platform in the market for attack surface security.https://fullhunt.io/

vue快速入门(五)v-show与v-if

注释很详细&#xff0c;直接上代码 上一篇 新增内容 v-if与v-show底层的区别v-if与v-show的效果 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

内部类(来自类和对象的补充)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

一分钟了解MOS管基础知识

场效应管&#xff08;Field-Effect Transistor&#xff0c;简称FET&#xff09;是电子技术中广泛使用的一种半导体器件&#xff0c;具有高输入阻抗、噪声低和低功耗等优点。 简介 场效应管是一种电压控制器件&#xff0c;其工作原理是通过改变栅极&#xff08;Gate&#xff09;…

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用

前言【Unity 实用工具篇】| Unity 实现背景模糊效果,简单易用一、实现背景模糊效果1.1 介绍1.2 效果展示1.3 使用说明及下载二、插件资源简单介绍2.1 导入下载好的资源2.2 功能介绍2.2.1 捕获特效2.2.2 高级选项

在集群中使用deepspeed如果端口被占用可以使用deepspeed参数更改

在集群中使用deepspeed如果端口被占用可以使用deepspeed参数更改 这一次G老师不好使了 在集群中使用deepspeed默认的端口号29500被占用&#xff0c;显示更改居然不起作用 G老师给的方法也不好使 #!/bin/bash MASTER_ADDRlocalhost MASTER_PORT29501 # 选择一个未被占用的端…

Spoon Taking Problem(c++题解)

题目描述 &#xfffd;N 人が円卓に座っており&#xff0c;各人は反時計回りに順に 1, …, &#xfffd;1, …, N と番号付けられています&#xff0e;各人はそれぞれ左右どちらか一方の利き手を持っています&#xff0e; 円卓上には 1, …, &#xfffd;1, …, N と番号付け…

企微知识库优缺点解析:如何让其效益最大化

企业搭建企微知识库&#xff0c;作为企业内部知识的集中存储和共享平台&#xff0c;为企业带来了很多便利。但是&#xff0c;任何事物都有其两面性&#xff0c;企微知识库也不例外。今天我们就来详细探讨搭建企微知识库的优点和缺点&#xff0c;如何在使用企微知识库时使其发挥…

谷歌(Google)技术面试——在线评估问题(三)

谷歌&#xff08;Google&#xff09;面试过程的第一步&#xff0c;你可能会收到一个在线评估链接。 评估有效期为 7 天&#xff0c;包含两个编码问题&#xff0c;需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处&#xff0c;还提供了有关 Google 面试不…

Python 爬虫基础——http请求和http响应

写本篇文章&#xff0c;我认为是能把自己所理解的内容分享出来&#xff0c;说不定就有和我一样有这样思维的共同者&#xff0c;希望本篇文章能帮助大家&#xff01;✨✨ 文章目录 一、 &#x1f308;python介绍和分析二、 &#x1f308;http请求三、 &#x1f308;http响应四、…