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