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

相关推荐
EVERSPIN44 分钟前
分享国产32位单片机的电机控制方案
单片机·嵌入式硬件
每天一杯冰美式oh1 小时前
51单片机的家用煤气报警系统【proteus仿真+程序+报告+原理图+演示视频】
嵌入式硬件·51单片机·proteus
芯橦4 小时前
【瑞昱RTL8763E】音频
单片机·嵌入式硬件·mcu·物联网·音视频·visual studio code·智能手表
夜间去看海8 小时前
基于单片机的智能浇花系统
单片机·嵌入式硬件·智能浇花
VirtuousLiu8 小时前
LM74912-Q1用作电源开关
单片机·嵌入式硬件·ti·电源设计·lm74912·电源开关
打地基的小白8 小时前
软件I2C-基于江科大源码进行的原理解析和改造升级
stm32·单片机·嵌入式硬件·通信模式·i2c
Echo_cy_9 小时前
STM32 DMA+AD多通道
stm32·单片机·嵌入式硬件
朴人9 小时前
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
stm32·单片机·嵌入式硬件·foc
追梦少年时9 小时前
STM32中断——外部中断
stm32·单片机·嵌入式硬件
bai_lan_ya9 小时前
stm32定时器中断和外部中断
stm32·单片机·嵌入式硬件