基于单片机DHT11湿度测量与控制-CO2-光照报警系统程序和仿真

news/2024/7/23 23:49:09 标签: 单片机, 嵌入式硬件

一、系统方案
1、本设计采用这51单片机作为主控器。
2、DHT11温湿度、CO2、光照强度送到液晶1602显示。
3、按键设置报警值。
4、蜂鸣器报警。
在这里插入图片描述

二、硬件设计
原理图如下:
在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化
//初始化LCD************************************************************
void LCD_Initial()
{
E=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,57点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
2、液晶显示程序
//1602程序
//内部等待函数
************************************************************
unsigned char LCD_Wait(void)
{
RS=0;
RW=1; nop();
E=1; nop();
E=0;
return DBPort;
}
//向LCD写入命令或数据********************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
E=0;
RS=style;
RW=0; nop();
DBPort=input; nop();//注意顺序
E=1; nop();//注意顺序
E=0; nop();
LCD_Wait();
}
3、按键程序
void key()
{
uchar m;
if (k10) //调整按键检测
{
delay(10);
if (k1
0)
{
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
presskeynum++;
if(presskeynum==8)
{
presskeynum=0;

			 }
     while(k1==0);
     
  }

}
if(presskeynum1)//温度上限设置
{
if(k2
0)// 加
{
delay(300);
temp_high++;
if (temp_high>99)
temp_high=0;
if (temp_high<0)
temp_high=99;
while(k20); //加上此句必须松按键才处理
}
if(k3
0)//减
{
delay(300);
temp_high–;
if (temp_high>99)
temp_high=0;
if (temp_high<0)
temp_high=99;
while(k30); //加上此句必须松按键才处理
}
}
if(presskeynum
2)//温度下限设置
{
if(k20)// 加
{
delay(300);
temp_low++;
if (temp_low>99)
temp_low=0;
if (temp_low<0)
temp_low=99;
while(k2
0);
}
if(k30)
{
delay(300);
temp_low–;
if (temp_low>99)
temp_low=0;
if (temp_low<0)
temp_low=99;
while(k3
0);
}
}
if(presskeynum3)//湿度上限设置
{
if(k2
0)// 加
{
delay(300);
humi_high++;
if (humi_high>99)
humi_high=0;
if (humi_high<0)
humi_high=99;
while(k20);
}
if(k3
0)
{
delay(300);
humi_high–;
if (humi_high>99)
humi_high=0;
if (humi_high<0)
humi_high=99;
while(k30);
}
}
if(presskeynum
4)//湿度下限设置
{
if(k20)//加
{
delay(300);
humi_low++;
if (humi_low>99)
humi_low=0;
if (humi_low<0)
humi_low=99;
while(k2
0);
}
if(k30)// 减
{
delay(300);
humi_low–;
if (humi_low>99)
humi_low=0;
if (humi_low<0)
humi_low=99;
while(k3
0);
}
}
if(presskeynum5)//湿度下限设置
{
if(k2
0)//加
{
delay(300);
gh++;
if (gh>99)
gh=0;

      while(k2==0);
  }
  if(k3==0)// 减
  {
      delay(300);
     gh--;
    
     gh=99;
      while(k3==0);
  }

}
if(presskeynum6)//湿度下限设置
{
if(k2
0)//加
{
delay(300);
gl++;
if (gl>99)
gl=0;

      humi_low=99;
      while(k2==0);
  }
  if(k3==0)// 减
  {
      delay(300);
      gl--;
    
      if (gl<0)
     gl=99;
      while(k3==0);
  }

}
if(presskeynum7)//湿度下限设置
{
if(k2
0)//加
{
delay(300);
CO2++;
if (CO2>99)
CO2=0;

      while(k2==0);
  }
  if(k3==0)// 减
  {
      delay(300);
      CO2--;
     
      if (CO2<0)
      CO2=99;
      while(k3==0);
  }

}

if(k40)// 退出键
{
delay(10);
if(k4
0)
{
while(k4==0);
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
presskeynum=0;
temp_humi_cache[0]=temp_high;

      temp_humi_cache[1]=temp_low;
 
 
      temp_humi_cache[2]=humi_high;
      temp_humi_cache[3]=humi_low;
      
			
			   temp_humi_cache[4]=gh;
    
      temp_humi_cache[5]=gl;
  
      temp_humi_cache[6]=CO2;
     
			
			
				
			
      for(m=0;m<=6;m++)
      {  
           WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]);      	//设定值写入24c02
					
      }
      
   }

 
 }

}
4、核心算法程序
unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0;
DATI = 1;
nop();
CS = 0;
nop();
Clk = 1;
nop();
if ( CH == 0x00 )
{
Clk = 0;
DATI = 1;
nop();
Clk = 1;
nop();
Clk = 0;
DATI = 0;
nop();
Clk = 1;
nop();
}
else
{
Clk = 0;
DATI = 1;
nop();
Clk = 1;
nop();
Clk = 0;
DATI = 1;
nop();
Clk = 1;
nop();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ )
{
nop();
adval <<= 1;
Clk = 1;
nop();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++)
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
nop();
Clk = 1;
nop();
Clk = 0;
}
if (adval == test)
dat = test;
nop();
CS = 1;
DATO = 1;
Clk = 1;
return dat;
}

四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述


http://www.niftyadmin.cn/n/5217293.html

相关文章

面试题目总结(一)

1. 谈谈数据库的乐观锁和悲观锁 乐观锁和悲观锁是数据库并发控制中常用的两种策略&#xff0c;用于处理多个事务同时访问和修改同一个数据时的并发冲突问题。 数据库的乐观锁是指在读取数据时&#xff0c;不对数据进行加锁&#xff0c;而是在更新数据时检查数据版本是否发生变…

梦回吹角连营(超1e18的快速幂模板,两大数相乘处理)

Description 给定f(n)n^an^(a1)...n^(b-1)n^b 求f(n)%MOD Input 输入一个正整数T(T<10),表示有T组数据&#xff0c;每组数据包括三个整数a,b,n(0<n,a,b<1e9) Output 输出 f(n)%10000000033 的结果Sample Input 2 1 2 3 2 1 3 Sample Output 12 12 思路&#…

Stable Diffusion绘画系列【1】:炫酷机甲美女

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

攻防非对称问题| 当前企业面临的网络攻防非对称问题及其解决途径

随着信息技术的不断发展&#xff0c;网络已经成为我们日常生活和商业活动中不可或缺的一部分。然而&#xff0c;随之而来的是网络安全问题的不断升级。网络攻防非对称问题是当前亟待解决的一个复杂而严峻的挑战。其主要的表现是攻击成本远低于防御成本以及相同投入带来的攻击能…

持续集成部署-k8s-配置与存储-存储类:动态创建NFS-PV案例

动态创建NFS-PV案例 1. 前置条件2. StorageClass 存储类的概念和使用3. RBAC 配置4. storageClass 配置5. 创建应用&#xff0c;测试 PVC 的自动配置6. 解决 PVC 为 Pending 状态问题7. 单独测试自动创建 PVC 1. 前置条件 这里使用 NFS 存储的方式&#xff0c;来演示动态创建 …

数据结构——带头循环双向链表(List)

1、带头双向循环链表介绍 在上一篇博客中我们提到了链表有三个特性&#xff0c;可以组合成为8种不同类型的链表。单链表是其中比较重要的一种&#xff0c;那么这次我们选择和带头双向循环链表会会面&#xff0c;这样我们就见识过了所有三种特性的呈现。 带头双向循环链表&#…

掌握文件夹重命名技巧:字母大小写批量转换的实用操作

在这个数字化时代&#xff0c;经常要与各种文件和文件夹打交道。有时候&#xff0c;为了提高工作效率或整理文件&#xff0c;要对文件夹名称进行修改。其中&#xff0c;字母大小写的转换是一个常见的需求。例如&#xff0c;将所有文件夹名称中的大写字母转换为小写字母&#xf…

存算一体还是存算分离?谈谈数据库基础设施的架构选择

从一则用户案例说起 某金融用户问&#xff0c;数据库用服务器本地盘性能好还是外置存储好&#xff1f;直觉上&#xff0c;本地盘路径短性能应该更好。然而测试结果却出乎意料&#xff1a;同等中等并发压力&#xff0c;混合随机读写模型&#xff0c;服务器本地SSD盘合计4万 IOPS…