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

相关推荐
959y8 小时前
[STM32] 串口通信 (十一)
stm32·单片机·嵌入式硬件
逝灮9 小时前
【蓝桥杯——物联网设计与开发】拓展模块5 - 光敏/热释电模块
stm32·单片机·mcu·物联网·蓝桥杯·光敏电阻·人体热释电传感器
honey ball12 小时前
TVS二极管选型【EMC】
单片机·嵌入式硬件
m0_7482345214 小时前
STM32 + 移远EC800 4G通信模块数传
arm开发·stm32·嵌入式硬件
优信电子17 小时前
基于STM32F103控制L298N驱动两相四线步进电机
stm32·单片机·嵌入式硬件
不能只会打代码17 小时前
32单片机从入门到精通之硬件架构——时钟树配置(三)
单片机·嵌入式硬件·硬件架构·32单片机
1101 110117 小时前
STM32-笔记18-呼吸灯
笔记·stm32·嵌入式硬件
干了这碗汤18 小时前
被裁20240927 --- 嵌入式硬件开发 STM32篇
stm32·单片机·嵌入式硬件·ardupilot
物联网牛七七19 小时前
1、单片机寄存器-io输入实验笔记
单片机·嵌入式硬件
牛顿喜欢吃苹果20 小时前
连接串口设备后鼠标出现乱跳
单片机·嵌入式硬件