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

相关推荐
羽获飞15 小时前
从零开始学嵌入式之STM32——5.GPIO外设
stm32·单片机·嵌入式硬件
望眼欲穿的程序猿15 小时前
串口通信---串口2定时器2
stm32·单片机·嵌入式硬件
望眼欲穿的程序猿16 小时前
STC/Ai8051U 中断列表
单片机·嵌入式硬件·stc
国科安芯16 小时前
航空级PMSM驱动系统中MCU的故障诊断与容错控制策略研究
单片机·嵌入式硬件·安全·架构·制造·安全性测试
帅次16 小时前
系统分析师-信息物理系统分析与设计
stm32·单片机·嵌入式硬件·mcu·物联网·iot·rtdbs
澜莲Alice17 小时前
STM32 MPLAB X IDE 软件安装-玩转单片机-英文版沉浸式安装
stm32·单片机·嵌入式硬件
良许Linux17 小时前
IIC总线的硬件部分的两个关键点:开漏输出+上拉电阻
单片机·嵌入式硬件
✎ ﹏梦醒͜ღ҉繁华落℘17 小时前
单片机基础知识 -- ADC分辨率
单片机·嵌入式硬件
Q_219327645517 小时前
车灯控制与报警系统设计
人工智能·嵌入式硬件·无人机
雾削木18 小时前
树莓派部署 HomeAssistant 教程
stm32·单片机·嵌入式硬件