基于DS18B20和HS1101的仓库自动报警系统

2023-11-19

背景介绍

   接到了一个外包项目,具体要求如下:
   本设计系统要实现的功能:可以测量出仓库库房实时环境温度和相对湿度值,仓库管理工作人员可以
   根据各个库房的实际情况设定出温度湿度限值,当温度、湿度数据出现异常,蜂鸣器就会释放出明
   显的报警信号,以此警示工作人员及时处理。当在休息时间段(可自行设定休息时间段)有人进出
   时要进行声光报警处理。通过对于各种类型的湿度,温度传感器原理深刻了解后,根据设计的要求
   以及刚确定的设计参数,选择出合适的单片机控制芯片以及温湿度两种传感器。以单片机为核心而
   设计的温度湿度监测系统,将由AT89C51单片机进行控制,并且以温度传感器DS18B20和湿度传
   感器HS1101作为温湿度的检测部件,同时选择合适的传感器进行人的识别。最后作为仓库温湿度
   监测的设备,设计系统所选择的元器件的成本高低,系统本身的实用性,灵敏度,也是我们设计时
   必须要考虑的要素。

效果展示

老规矩:因为我做的是基于Proteus的仿真文件,电路较为复杂,仿真较慢,就没有做演示视频,可以看一下我的说明文档(免费)——传送门

完整版的项目代码+仿真文件

我自己做的时候也查阅了大量的资料,也去搜集了别人做的资料,面对市面大多数付费资料都是15-30元,特别是一些公众号或者电路城资料,我应该更为实惠些,你下载后可以来找我咨询(+V HeKang2583),或者添加你的要求进行改进之类的。
项目源码——传送门

下面是项目原理图

在这里插入图片描述
为了减少电脑负担,我做的分为演示版和最终版,其实都差不多,因为那些从动器(加热,冷却,加湿,祛湿,蜂鸣器)都是低电平驱动,所以我换成红色led来减少Proteus的仿真时间,实际效果除了最终版所计算时间更长一些并无差别。
在这里插入图片描述

具体管脚定义如下图

在这里插入图片描述

1602驱动代码也借用于之前分享的1602函数库文件,对于控制命令的写入和数据命令的写入均按照时序
图严格编写,不能用来砍我。。
另外比较有亮点的是我在1602创新性的使用了二级菜单对数据大小进行控制调整,有很大的延展性。
比如你按下设置键,进入设置模式,多次按下选中不同数据,使用加或者减键盘来调整,再次按下
设置键进行确定。这种命令我参考了很多写法,最终得到了这种具有很多延展性的初级控制程序,
感兴趣的同学可以戳我了解,我有空之后可能会写一篇教程下来。

18B20温度原理

这位大佬写的很详细----传送门
我只贴我的初始化和读取等函数(需要说明的是我里面用到的软件延时,集合让我比较好写程序,如果想让代码更为简洁的话建议多开一个delay.h专门定义延时函数,18b20.h我就不赘述了,可以在我的整合包里读取)

void Delay10us(void)//10us延时函数
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=1;a>0;a--);
}
void Delay600us(void)//600us延时函数
{
    unsigned char a,b;
    for(b=119;b>0;b--)
        for(a=1;a>0;a--);
}
/********************************DS18B20初始化函数*************************/
void Init_Ds(void)//DS18B20初始化
{
	Bus=0;//主动拉低480-960us(此处选择600us)
	Delay600us();
	Bus=1;//释放总线,传感器15-60us后拉低总线
	while(Bus);//等待传感器拉低;
	while(!Bus);//度过传感器被拉低的时间(60-240us)后主动拉高
	Bus=1;//主动拉高
}
/********************************向DS18B20写入一字节***********************/
void Write_Ds(uchar com)//从低位开始写入
{
	uchar mask;
	for(mask=0x01;mask!=0;mask<<=1)
	{
		//该位为0,先拉低,15us后在拉高,并通过延时使整个周期为60us
	    //该位为1,先拉低并在15us内(此处选择5us)拉高,并通过延时使整个周期为60us	
		Bus=0;
		_nop_();_nop_();_nop_();_nop_();_nop_();//先拉低5us
		if((com&mask)==0)//该位是0
		{
			Bus=0;	
		}
		else//该位是1
		{
			Bus=1;		
		}
		Delay10us();Delay10us();Delay10us();Delay10us();Delay10us();;//延时60us
		_nop_();_nop_();_nop_();_nop_();_nop_();
		Bus=1;//拉高
		_nop_();_nop_();//写两个位之间至少有1us的间隔(此处选择2us)
	}
}
/********************************从DS18B20读出一字节***********************/
uchar Read_Ds(void)//先读的是低位,整个读周期至少为60us,但控制器采样要在15us内完成,相邻“位”之间至少间隔1us
{
	uchar value=0,mask;
	for(mask=0x01;mask!=0;mask<<=1)
	{
		Bus=0;//先把总线拉低超过1us(此处选择2us)后释放
		_nop_();_nop_();
		Bus=1;
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//再延时6us后读总线数据
		if(Bus==0)//如果该位是0
		{
			value&=(~mask);
		}
		else
		{
			value|=mask;
		}
		Delay10us();Delay10us();Delay10us();Delay10us();Delay10us();//再延时52us,凑够至少60us的采样周期
		_nop_();_nop_();
		Bus=1;
		_nop_();_nop_();//写两个位之间至少有1us的间隔(此处选择2us)
	}
	return value;	
}
/**********************************获取温度值函数***************************/
uint Get_Tem(void)
{
	uint temp=0;
	float tp;
	uchar LSB=0,MSB=0;
	delay(10);//延时10ms度过不稳定期
 
	Init_Ds();//Ds18b20初始化
	delay(1);
	Write_Ds(0xcc);//跳过ROM寻址
	Write_Ds(0x44);//启动一次温度转换
	delay(1000);//延时1s等待转化
 
	Init_Ds();//Ds18b20初始化
	delay(1);
	Write_Ds(0xcc);//跳过ROM寻址
	Write_Ds(0xbe);//发送读值命令·
	LSB=Read_Ds();
	MSB=Read_Ds();
	temp=MSB;
	temp<<=8;
	temp|=LSB;
	tp=temp*0.0625;
	temp=tp;
	if(tp-temp>=0.5)
	{
		temp+=1;
	}
	return temp;
}

HS1101湿度传感器

对于湿度传感器的一些说明:我的湿度传感器是使用网上移植到的代码,他设置了一些暂态数值,然后将暂态整型数值转化为单个的字符组成字符串,在放到1602库里面显示出来。具体对湿度的判断要读取RH参数,且RH的湿度分别率可达0.1,于是显示的时候要加小数点,同时对他判断的时候也要缩小10倍。
我的调用如下:
在这里插入图片描述
我用到了一个定时器,有冲突的朋友注意,具体代码如下:

void readfrequency()
{
	unsigned int ftequency,RH;
	TMOD=0x51;
	TH0=0x4C;
	TL0=0X00;
	TH1=0;
	TL1=0;
	TR1=1;
	TR0=1;
    ET0=1;
    ET1=0;
	EA=1;
	T0Over=0;
	while(!T0Over) 
	write_com(0x80+0x40);
	write_data(table[shuju1[0]]);
	write_com(0x80+0x41);
	write_data(table[shuju1[1]]);
	write_com(0x80+0x42);
	write_data(table[shuju1[2]]);
	write_com(0x80+0x43);
	write_data(table[shuju1[3]]);
	write_com(0x80+0x44);
	write_data(table[shuju1[4]]);
	write_com(0x80+0x45);
	write_data(table[shuju1[5]]);
	write_com(0x80+0x46);
	write_data(table[shuju1[6]]);
	write_data(table[shuju1[7]]);
	write_data(table[shuju1[8]]);
	ftequency=(TH1*256+TL1)*20;
	minrange=0;
	maxrange=0;
	if(ftequency)
	{
		if(ftequency<6033)
			maxrange=1;
		if(ftequency>7351) 
			minrange=1;					
		if(6330<ftequency<=7351)
			RH=5880-0.8*ftequency;
		if(6033<=ftequency<=6330)
			RH=5860-0.8*ftequency;
		shuju1[0]=10;
		shuju1[1]=11;
		shuju1[2]=12;
		shuju1[3]=15; 
		shuju1[4]=RH/100;
		shuju1[5]=(RH%100)/10;
		shuju1[6]=14;
		shuju1[7]=(RH%10);
		shuju1[8]=13;
	}
}

红外测距报警模块我用到的是GP2D12,通过数模转化器ADC0832来寻找阈值进行报警

在这里插入图片描述
我采用ADC0832的原因是它的读取管脚很少,只有三个就可以读出来它的值,具体代码也很简单,只需要注意时序就可以了,具体见我的源码。

编写不易,求个点赞!!!!!!!
“你是谁?”

“一个看帖子的人。”

“看帖子不点赞啊?”

“你点赞吗?”

“当然点了。”

“我也会点。”

“谁会把经验写在帖子里。”

“写在帖子里的那能叫经验贴?”

“上流!”
cheer!!!

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于DS18B20和HS1101的仓库自动报警系统 的相关文章

随机推荐

  • 面向对象三大特性之一——多态详解

    目录 前言 一 多态的概念 二 多态的定义及实现 1 虚函数的概念 2 虚函数的重写 2 1概念 2 2虚函数重写的两个例外 3 多态的构成条件 4 c 11 override和final 4 1 final 4 2 override 5
  • Java(五)-Java集合(comparable,map,list

    集合 Collection集合 集合的概念 ArrayList就是一个集合 集合是Java提供的一种容器 可以用来存储多个数据 集合与数组的区别 1 数组的长度是固定的 集合的长度是可变的 2 数组中存储的是同一类型的元素 可以存储基本数据
  • C++ 和 C 使用的不同点(待定)

    1 结构体 C 中定义的结构体 不起别名的情况下使用时要添加 struct C 可以不用添加 struct 直接使用定义的结构体名称 struct Student int age char name C 不报错 C报错 Student Ge
  • JDK的监听 Spring的事件监听机制

    一 概述 使用场景 用户注册完成时 需要给该用户发送邮件 发送优惠劵等等操作 实现业务的解耦 MQ的异步 销峰 解耦 大体步骤 1 UserService 在完成自身的用户注册逻辑之后 仅仅只需要发布一个 UserRegisterEvent
  • 归一化与反归一化在Bi-LSTM多特征时序预测中应用(附实操代码)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 前言 一 Bi LSTM 是什么 二 为什么要归一化和反归一化 1 归一化的好处 2 反归一化的好处 三 归一化和反归一化使用的公式 1 归一化 2 反归一化 四 实操
  • 使用Pandas处理Excel文件

    Excel工作表是非常本能和用户友好的 这使得它们非常适合操作大型数据集 即使是技术人员也不例外 如果您正在寻找学习使用Python在Excel文件中操作和自动化内容的地方 请不要再找了 你来对地方了 在本文中 您将学习如何使用Pandas
  • forkjoin及其性能分析,是否比for循环快?

    最近看了网上的某公开课 其中有讲到forkjoin框架 在这之前 我丝毫没听说过这个东西 很好奇是什么东东 于是 就顺道研究了一番 总感觉这个东西 用的地方很少 也有可能是我才疏学浅 好吧 反正问了身边一堆猿 没有一个知道的 因此 我也没有
  • 怎么把树莓派连接到电脑上(基于window10)

    我相信对于刚玩树莓派的新手来说 尤其是没有带显示屏的同学来说 四处碰壁 可能出现的原因有很多种 ssh登录不上 wifi连接不上 内存不足 很多问题 而对于更多新手来说 如何给树莓派连接网络更是关键 今天我给大家讲一下如何用树莓派连接电脑
  • Real-time Linux

    所谓实时操作系统 Real time Opearting System 是指当外接世界或数据产生时 能够接受并以足够快的速度予以处理 其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应 调度一切可利用的资源完成实时任务
  • 数据链路层:Ethernet以太网协议

    首先Ethernet IEEE802 3 PPP和HDLC都是数据链路层的协议 只不过后面三个不常用而已 Ethernet和IEEE802 3属于以太链路层协议 数据链路层最常用的协议是Etnernet以太网协议 定义 Ethernet以太
  • 常用的加密算法

    整理一下常用的加密算法 加密算法我们整体可以分为 可逆加密和不可逆加密 可逆加密又可以分为 对称加密和非对称加密 一 不可逆加密 常见的不可逆加密算法有MD5 HMAC SHA1 SHA 224 SHA 256 SHA 384 和SHA 5
  • Flask(一)

    Flask 0 Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架 对于Werkzeug本质是Socket服务端 其用于接收http请求并对请求进行预处理 然后触发Fl
  • 设计模式——导论

    作为软件开发人员 我们在平时工作的过程中 往往需要编写很多的代码来实现我们的需求 很多的时候会造成代码臃肿和代码冗余的情况 这个时候我们需要引入一个理念 设计模式 设计模式存在的意义在于 1 使得我们的代码更加精炼 2 使我们代码的可读性更
  • 面试求职经历及遇到的部分问题

    转眼间已经工作一年多了 最近想换个工作环境 就选择了跳槽 跳槽对我们程序猿来说并没什么稀奇 但这是我第一次跳槽 也颇感激动 哈哈 总的来说 这次找工作还是相对去年来说比较容易的 毕竟已经工作一年了嘛 记得去年的时候投20份简历也不一定会有面
  • 开发者本地搭建性能监测工具(Windows)

    ElasticSearch 8 9 0 开发模式安装 JDK安装 官方提供版本与JDK支持关系 https www elastic co cn support matrix matrix jvm 我们安装Elasticsearch 8 9
  • ATT&CK实战系列——红队实战(一)红日靶场1

    目录 靶场搭建 拓扑图 配置网络 外网打点web服务器 信息搜集 nmap扫端口服务 dirsearch目录扫描 phpmyadmin日志getshell yxcms 后台getshell xss 关闭win7防火墙 上线msf cs 上线
  • 基于加密流量组建跨机房(混合云)k8s集群

    业务场景 解决服务同城 异地多活灾备 环境 a机房 私网 192 168 1 0 24 公网ip 111 111 111 111 b机房 私网 192 168 2 0 24 公网ip 222 222 222 222 c机房 私网 192 1
  • 传统目标检测算法综述

    传统目标检测算法综述
  • Node.Js基础知识

    Node Js架构 Natives modules 当前层内容由JS实现 提供 应用程序可直接调用库 例如 fs path http等 JS语言无法直接操作底层硬件设置 Builtin modules 胶水层 Builtin modules
  • 基于DS18B20和HS1101的仓库自动报警系统

    基于DS18B20和HS1101的仓库自动报警系统 背景介绍 效果展示 完整版的项目代码 仿真文件 下面是项目原理图 具体管脚定义如下图 18B20温度原理 HS1101湿度传感器 红外测距报警模块我用到的是GP2D12 通过数模转化器AD