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

一、系统方案

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 (k10)

{

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏

presskeynum++;

if(presskeynum==8)

{

presskeynum=0;

复制代码
			 }
     while(k1==0);
     
  }

}

if(presskeynum1)//温度上限设置
{
if(k20)// 加

{

delay(300);

temp_high++;

if (temp_high>99)

temp_high=0;

if (temp_high<0)

temp_high=99;

while(k20); //加上此句必须松按键才处理
}
if(k30)//减

{

delay(300);

temp_high--;

if (temp_high>99)

temp_high=0;

if (temp_high<0)

temp_high=99;

while(k30); //加上此句必须松按键才处理
}
}
if(presskeynum2)//温度下限设置

{

if(k20)// 加
{
delay(300);
temp_low++;
if (temp_low>99)
temp_low=0;
if (temp_low<0)
temp_low=99;
while(k20);

}

if(k30)
{
delay(300);
temp_low--;
if (temp_low>99)
temp_low=0;
if (temp_low<0)
temp_low=99;
while(k30);

}

}

if(presskeynum3)//湿度上限设置
{
if(k20)// 加

{

delay(300);

humi_high++;

if (humi_high>99)

humi_high=0;

if (humi_high<0)

humi_high=99;

while(k20);
}
if(k30)

{

delay(300);

humi_high--;

if (humi_high>99)

humi_high=0;

if (humi_high<0)

humi_high=99;

while(k30);
}
}
if(presskeynum4)//湿度下限设置

{

if(k20)//加
{
delay(300);
humi_low++;
if (humi_low>99)
humi_low=0;
if (humi_low<0)
humi_low=99;
while(k20);

}

if(k30)// 减
{
delay(300);
humi_low--;
if (humi_low>99)
humi_low=0;
if (humi_low<0)
humi_low=99;
while(k30);

}

}

if(presskeynum5)//湿度下限设置
{
if(k20)//加

{

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(k20)//加

{

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(k20)//加

{

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(k40)

{

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仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

相关推荐
czwxkn1 小时前
PCB设计-器件:2.电感
嵌入式硬件
佳木逢钺2 小时前
从零开始:基于STM32H750的硬件设计与软件开发完整流程详解
stm32·单片机·嵌入式硬件
Deitymoon4 小时前
ESP8266——透传
单片机·网络协议·tcp/ip
zhangrelay4 小时前
云课实践速通系列-基础篇汇总-必修-通识基础和专业基础-2026--工科--自动化、电气、机器人、测控等
linux·笔记·单片机·学习·ubuntu·机器人·自动化
Deitymoon5 小时前
ESP8266——UDP传输
单片机·网络协议·udp
踏着七彩祥云的小丑5 小时前
嵌入式——认识电子元器件——光电器件系列
单片机·嵌入式硬件
羽获飞5 小时前
从零开始学嵌入式之STM32——31.高级定时器
stm32·单片机·嵌入式硬件
iCxhust8 小时前
一块电路板的自觉
单片机·嵌入式硬件·嵌入式·微机原理
学习者1234567898 小时前
Bootloader跳转APP代码流程
单片机·嵌入式硬件
ACP广源盛139246256738 小时前
一芯搞定多屏高清@ACP#GSV1221 DP 1.4 MST 转 HDMI 1.4 高集成转换芯片
网络·人工智能·嵌入式硬件·计算机外设·电脑