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

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

  • 背景介绍
    • 效果展示
    • 完整版的项目代码+仿真文件
  • 下面是项目原理图
  • 具体管脚定义如下图
  • 18B20温度原理
  • HS1101湿度传感器
  • 红外测距报警模块我用到的是GP2D12,通过数模转化器ADC0832来寻找阈值进行报警

背景介绍

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

效果展示

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

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

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

下面是项目原理图

基于DS18B20和HS1101的仓库自动报警系统_第1张图片
为了减少电脑负担,我做的分为演示版和最终版,其实都差不多,因为那些从动器(加热,冷却,加湿,祛湿,蜂鸣器)都是低电平驱动,所以我换成红色led来减少Proteus的仿真时间,实际效果除了最终版所计算时间更长一些并无差别。
基于DS18B20和HS1101的仓库自动报警系统_第2张图片

具体管脚定义如下图

基于DS18B20和HS1101的仓库自动报警系统_第3张图片

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倍。
我的调用如下:
基于DS18B20和HS1101的仓库自动报警系统_第4张图片
我用到了一个定时器,有冲突的朋友注意,具体代码如下:

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来寻找阈值进行报警

基于DS18B20和HS1101的仓库自动报警系统_第5张图片
我采用ADC0832的原因是它的读取管脚很少,只有三个就可以读出来它的值,具体代码也很简单,只需要注意时序就可以了,具体见我的源码。

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

“一个看帖子的人。”

“看帖子不点赞啊?”

“你点赞吗?”

“当然点了。”

“我也会点。”

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

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

“上流!”
cheer!!!

基于DS18B20和HS1101的仓库自动报警系统_第6张图片

你可能感兴趣的:(51单片机,单片机,编程语言,嵌入式)