首页 > 其他分享 >17_DS18B20温度传感器

17_DS18B20温度传感器

时间:2023-11-30 15:12:13浏览次数:28  
标签:温度传感器 OneWire 17 DS18B20 void unsigned char include

DS18B20温度传感器

介绍

image-20231119202941485

引脚及应用电路

image-20231119203400784

原理图

image-20231121194656170

内部结构框图

image-20231119203451129

存储器结构

image-20231120140220081

单总线介绍

image-20231120140737757

单总线电路规范

image-20231120141054513

单总线时序结构

image-20231120143507866

image-20231120173206417

image-20231121132932880

DS18B20操作流程

image-20231121133111096

DS18B20数据帧

image-20231121133626763

温度存储格式

image-20231121133931641

获取温度用LCD显示

OneWire.c

#include <REGX52.H>
#include <intrins.h>

sbit OneWire_DQ=P3^7;

void Delay500us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	i = 247;
	while (--i);
}

void Delay70us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	i = 32;
	while (--i);
}

void Delay10us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	i = 2;
	while (--i);
}

void Delay50us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	i = 22;
	while (--i);
}

void Delay5us(void)	//@12.000MHz
{
	_nop_();
}

unsigned char OneWire_Init()
{
	bit AckBit;
	OneWire_DQ=1;
	OneWire_DQ=0;
	Delay500us();
	OneWire_DQ=1;
	Delay70us();
	AckBit=OneWire_DQ;
	Delay500us();
	return AckBit;
}

void OneWire_SendBit(unsigned char Bit)
{
	OneWire_DQ=0;
	Delay10us();
	OneWire_DQ=Bit;
	Delay50us();
	OneWire_DQ=1;
}

unsigned char OneWrie_ReceiveBit()
{
	unsigned char Bit;
	OneWire_DQ=0;
	Delay5us();
	OneWire_DQ=1;
	Delay5us();
	Bit=OneWire_DQ;
	Delay50us();
	return Bit;
}

void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		OneWire_SendBit(Byte&(0x01<<i));
	}
}

unsigned char OneWire_ReceiveByte()
{
	unsigned char i;
	unsigned char Byte=0x00;
	for(i=0;i<8;i++)
	{
		if(OneWrie_ReceiveBit())
		{
			Byte|=(0x01<<i);
		}
	}
	return Byte;
}

OneWire.h

#ifndef __ONEWIRE_H__
#define __ONEWIRE_H__

unsigned char OneWire_Init();
void OneWire_SendBit(unsigned char Bit);
unsigned char OneWrie_ReceiveBit();
void OneWire_SendByte(unsigned char Byte);
unsigned char OneWire_ReceiveByte();

#endif

DS18B20.c

#include <REGX52.H>
#include "OneWire.h"

#define DS18B20_SKIP_ROM 			0xCC
#define DS18B20_CONVERT_T 			0x44
#define DS18B20_READ_SCRATCHPAD		0xBE

void DS18B20_ConvertT()
{
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_CONVERT_T);
}

float DS18B20_ReadT()
{
	unsigned char TLSB,TMSB;
	int Temp;
	float T;
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);
	TLSB=OneWire_ReceiveByte();
	TMSB=OneWire_ReceiveByte();
	Temp=(TMSB<<8)|TLSB;
	T=Temp/16.0;
	return T;
}

DS18B20.h

#ifndef __DS18B20_H__
#define __DS18B20_H__

void DS18B20_ConvertT();
float DS18B20_ReadT();

#endif

main.c

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "OneWire.h"
#include "DS18B20.h"

float T;

void main()
{
	DS18B20_ConvertT();
	Delay(1000);
	LCD_Init();
	LCD_ShowString(1,1,"Temperature:");
	while(1)
	{
		DS18B20_ConvertT();
		T=DS18B20_ReadT();
		if(T<0)
		{
			LCD_ShowChar(2,1,'-');
			T=-T;
		}
		else
		{
			LCD_ShowChar(2,1,'+');
		}
		LCD_ShowNum(2,2,T,3);
		LCD_ShowChar(2,5,'.');
		LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);
	}
}

运行效果

image-20231123152036530

温度报警器

Key.c

#include <REGX52.H>
#include "Delay.h"

unsigned char Key_KeyNumber;

unsigned char Key()
{
	unsigned char Temp;
	Temp=Key_KeyNumber;
	Key_KeyNumber=0;
	return Temp;
}

unsigned char Key_GetState()
{
	unsigned char KeyNumber=0;
	if(P3_1==0){KeyNumber=1;}
	if(P3_0==0){KeyNumber=2;}
	if(P3_2==0){KeyNumber=3;}
	if(P3_3==0){KeyNumber=4;}
	return KeyNumber;
}

void Key_Loop()
{
	static unsigned char NowState,LastState;
	LastState=NowState;
	NowState=Key_GetState();
	
	if(NowState==0)
	{
		switch(LastState) //按下后松手
		{
			case 1:Key_KeyNumber=1;break;
			case 2:Key_KeyNumber=2;break;
			case 3:Key_KeyNumber=3;break;
			case 4:Key_KeyNumber=4;break;
		}
	}
}

Key.h

#ifndef __KEY_H__
#define __KEY_H__


unsigned char Key();
unsigned char Key_GetState();
void Key_Loop();

#endif

OneWire.c

#include <REGX52.H>
#include <intrins.h>

sbit OneWire_DQ=P3^7;

void Delay500us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	i = 247;
	while (--i);
}

void Delay70us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	i = 32;
	while (--i);
}

void Delay10us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	i = 2;
	while (--i);
}

void Delay50us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	i = 22;
	while (--i);
}

void Delay5us(void)	//@12.000MHz
{
	_nop_();
}

unsigned char OneWire_Init()
{
	bit AckBit;
	EA=0;
	OneWire_DQ=1;
	OneWire_DQ=0;
	Delay500us();
	OneWire_DQ=1;
	Delay70us();
	AckBit=OneWire_DQ;
	Delay500us();
	EA=1;
	return AckBit;
}

void OneWire_SendBit(unsigned char Bit)
{
	EA=0;
	OneWire_DQ=0;
	Delay10us();
	OneWire_DQ=Bit;
	Delay50us();
	OneWire_DQ=1;
	EA=1;
}

unsigned char OneWrie_ReceiveBit()
{
	unsigned char Bit;
	EA=0;
	OneWire_DQ=0;
	Delay5us();
	OneWire_DQ=1;
	Delay5us();
	Bit=OneWire_DQ;
	Delay50us();
	EA=1;
	return Bit;
}

void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		OneWire_SendBit(Byte&(0x01<<i));
	}
}

unsigned char OneWire_ReceiveByte()
{
	unsigned char i;
	unsigned char Byte=0x00;
	for(i=0;i<8;i++)
	{
		if(OneWrie_ReceiveBit())
		{
			Byte|=(0x01<<i);
		}
	}
	return Byte;
}

OneWire.h

#ifndef __ONEWIRE_H__
#define __ONEWIRE_H__

unsigned char OneWire_Init();
void OneWire_SendBit(unsigned char Bit);
unsigned char OneWrie_ReceiveBit();
void OneWire_SendByte(unsigned char Byte);
unsigned char OneWire_ReceiveByte();

#endif

DS18B20.c

#include <REGX52.H>
#include "OneWire.h"

#define DS18B20_SKIP_ROM 			0xCC
#define DS18B20_CONVERT_T 			0x44
#define DS18B20_READ_SCRATCHPAD		0xBE

void DS18B20_ConvertT()
{
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_CONVERT_T);
}

float DS18B20_ReadT()
{
	unsigned char TLSB,TMSB;
	int Temp;
	float T;
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);
	TLSB=OneWire_ReceiveByte();
	TMSB=OneWire_ReceiveByte();
	Temp=(TMSB<<8)|TLSB;
	T=Temp/16.0;
	return T;
}

Ds18B20.h

#ifndef __DS18B20_H__
#define __DS18B20_H__

void DS18B20_ConvertT();
float DS18B20_ReadT();

#endif

main.c

#include <REGX52.H>
#include "DS18B20.h"
#include "LCD1602.h"
#include "Delay.h"
#include "Key.h"
#include "AT24C02.h"
#include "Timer0.h"

float T;
char TLow=-15,THigh=20;
unsigned char KeyNum;

void main()
{
	LCD_Init();
	Timer0_Init();
	LCD_ShowString(1,1,"T:");
	LCD_ShowString(2,1,"TH:");
	LCD_ShowString(2,9,"TL:");
	DS18B20_ConvertT();
	Delay(1000);
	THigh=AT24C02_ReadByte(0);
	TLow=AT24C02_ReadByte(1);
	if(THigh>125 || TLow<-55 || THigh<=TLow)
	{
		THigh=20;
		TLow=-15;
	}
	while(1)
	{
		//温度读取及显示
		DS18B20_ConvertT();
		T=DS18B20_ReadT();
		LCD_ShowSignedNum(1,3,T,3);
		LCD_ShowChar(1,7,'.');
		
		if(T<0)
		{
			LCD_ShowNum(1,8,(unsigned int)(-T*100)%100,2);
		}
		else
		{
			LCD_ShowNum(1,8,(unsigned int)(T*100)%100,2);
		}
		
		//阈值判断及显示
		KeyNum=Key();
		switch(KeyNum)
		{
			case 1:
				THigh++;
				if(THigh>125)
				{
					THigh=125;
				}
				break;
			case 2:
				if(THigh>TLow+1)
				{
					THigh--;
				}
				break;
			case 3:
				if(TLow<THigh-1)
				{
					TLow++;
				}
				break;
			case 4:
				TLow--;
				if(TLow<-55)
				{
					TLow=-55;
				}
				break;
		}
		LCD_ShowSignedNum(2,4,THigh,3);
		LCD_ShowSignedNum(2,12,TLow,3);
		AT24C02_WriteByte(0,THigh);
		Delay(5);
		AT24C02_WriteByte(1,TLow);
		Delay(5);
		if(T>THigh)
		{
			LCD_ShowString(1,13,"OV:H");
		}
		else if(T<TLow)
		{
			LCD_ShowString(1,13,"OV:L");
		}
		else
		{
			LCD_ShowString(1,13,"    ");
		}
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;
	TH0 = 0xFC;
	T0Count++;
	if(T0Count>=20)
	{
		T0Count=0;
		Key_Loop();
		
	}
}

运行效果

image-20231124135050568

标签:温度传感器,OneWire,17,DS18B20,void,unsigned,char,include
From: https://www.cnblogs.com/mzx233/p/17867413.html

相关文章

  • odoo17.0 快递鸟模块
    快递鸟是国内使用较为广泛的快递集成查询平台之一,提供了600+的物流公司对接接口,是比较不错的物流查询服务选择。随着odoo17.0的发布,我们最近也将快递鸟模块升级到了17.0。下面我们来详细看一下如何使用。注册快递鸟账号要使用快递鸟的查询服务,我们首先需要在快递鸟平台注册一个......
  • P4017 最大食物链计数
    P4017最大食物链计数记忆化搜索DP角度解从捕食者向被捕食者建边维护每个生物的捕食eat,和被捕食数量beat。对每一个食物链顶端dfs,向下搜索直到找到最低级的生物,记忆化当前结点对应的食物链长度。#include<iostream>#include<algorithm>#include<cstring>#defin......
  • C:\Users\17482\Desktop\ERP——test1\SpringBoot-ERP-master\src\main\java
    这个错误表明在你的Java类文件UserImp.java中,找不到MyBatis的注解包org.apache.ibatis.annotations。这个包中包含了MyBatis的注解,比如@Select、@Insert等。首先,请确保你的项目正确引入了MyBatis的依赖。在你的pom.xml文件中应该包含类似以下的依赖配置:<dependency......
  • Cadence IC617 开发环境搭建
    本文主要介绍虚拟机安装方式,内容主要讲述虚拟机的使用,文末会补充手动安装的注意事项。如果你熟悉Linux的使用,可以试试手动安装。如果不熟悉,建议使用现成的虚拟机。资料和资源方面,推荐eetop和Google,eetop需要10快钱注册,花钱注册就好了,以后经常用得上。注意!注意!下载和访问可......
  • Kali安装JDK8和JDK17并切换
    Kali安装JDK8和JDK17切换在进行漏洞复现的时候,发现kali中JDK为17,所以一些POC用不了,需要JDK低版本安装JDK1.8[下载地址]mkdir-p/usr/local/javacpjdk-8u251-linux-x64.tar.gz/usr/local/javatar-zxvfjdk-8u251-linux-x64.tar.gz配置环境变量vim/etc/profile#......
  • 如何正确的在AIX 7上正确开启大页内存(large page)on oracle 11.2.0.4 rac 转发 https:
    1、关于大页有个客户的业务系统上要开启大页,提高系统性能,研究了一下,网上文章太多,自己做了一些测试,经过实机测试,整理了一下操作记录。关于AIX上为什么要开启大页,借用MOS里的说明原文:StartingwiththeAIXV5.1operatingsystemwhenrunningonIBMPOWER4orPOWER5proces......
  • C++17 更通用的 union:variant
    References现代C++学习——实现多类型存储std::variant如何优雅的使用std::variant与std::optionalstd::variant是C++17中,一個新加入標準函式庫的template容器;他的概念基本上是和union(參考)一樣,是一個可以用來儲存多種型別資料的容器。比如說:std::variant<int,d......
  • C\C++ 设置Visual Studio编译器使用C++17标准
    文章作者:里海简介:        使用ISOC++17标准可以为开发人员带来许多好处,包括更简洁的代码、更高的运行效率、更好的硬件支持、更好的兼容性和可移植性,以及更好的多线程编程支持等。那么如何设置vs使用c++标准呢?下面是方法。注意需要vs2017及以上版本。方法:打开VisualStud......
  • Weblogic < 10.3.6 'wls-wsat' XMLDecoder 反序列化漏洞(CVE-2017-10271)
    Weblogic<10.3.6'wls-wsat'XMLDecoder反序列化漏洞(CVE-2017-10271)Weblogic的WLSSecurity组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。环境搭建cdweblogic/CVE-2017-10271docker-compose......
  • 20231117上机编程[高可靠在线视频]
    某电信公司推出高可靠的在线视频业务。为了保证可靠性,公司针对不同视频类型,准备了不同的专用网络通道,并对指定视频类型服务进行通道分配。一个用户在一个时段只能使用一个视频服务,可以多次申请。请实现以下功能:VideoService(int[]channels,int[]charge) :初始化系统channel......