10119-基于单片机的智能农业大棚设计温湿度二氧化碳光照(详细设计说明书+proteus+源代码+原理图+元件清单)
功能需求:
智慧农业大棚的底层理念是实现智能化控制与生产,利用现代化的传感器技术、计算机、网络技术、数据处理和中间件的方式实现农业数据采集和处理。农作物的生产过程进行有效的监控,如二氧化碳、温度、光照等多个农业参数进行监测,分析对农作物的生长环境进行调控,可以实时反馈农作物的生产过程。在农作物生命周期内,具有可追溯性,并且可以改善农作物的生长环境,提高农作物的品质。系统可以实现传感器监测农作物的生长,将采集到的环境数据显示在液晶显示器中实现传感器与设备之间互通与监控。
资料摘要:
本文设计的智能农业大棚系统采用51单片机作为控制器,其主要实现的功能是对大棚的环境参数进行检测,并控制设备将环境参数的数值控制在设定范围内。
本系统采用的主控制器为AT89C51,温湿度传感器为DHT11,光照传感器GY-302、二氧化碳传感器GSP30来检测大棚内的环境参数,并将检测值在LCD1602上显示。此外,由蜂鸣器和LED发光二极管组成报警部分,采用步进电机作为系统的执行装置,按键主要作用为系统阈值控制调节。系统软件使用C语言程序设计,编译使用keil。系统运行过程:①将最适合作物生长的温湿度、光照和二氧化碳浓度的参数范围设定好。②由LCD1602显示器显示大棚内的实时数据。③当某一项的实际参数不在设定的参数范围内时,蜂鸣器会报警,步进电机会运行,带动设备运行,调整相应的参数。并用Proteus软件进行系统仿真,实现的功能是:采集农业大棚中环境温度、湿度、二氧化碳浓度、光照等信息并显示在液晶显示器中;当监测环境超过设定阈值则会自动控制风扇动作。
资料包含:
1、原理图工程文件
2、详细设计说明书-18779字
3、仿真工程文件
4、源代码工程文件
5、元件清单
#include "reg51.h"
#include"TLC1543.h"
#include "DHT11.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit beep=P2^3;//蜂鸣器
sbit out1=P2^4;//输出
sbit out2=P2^5;
sbit out3=P2^6;
sbit out4=P2^7;
sbit k1=P3^1;//按钮
sbit k2=P3^2;
sbit k3=P3^3;
sbit k4=P3^4;
sbit k5=P3^5;
sbit led1=P1^6;
sbit led2=P1^7;
sbit led3=P3^6;
sbit led4=P3^7;
uchar time=0,sec=0;//系统定时
uint light=0,hs=0;//光照,硫化氢
uint down[]={50,0,15,45};//下限
uint up[]={300,10,25,60};//上限
uchar flag[]={0,0,0,0};
uchar disp1[]="00 C ";
uchar disp2[]="00% ";
uchar disp3[]="000Lx";
uchar mode=0;//模式
//按键函数
void key()
{
if(!k1)//切换
{
if(mode<3)
mode++;
else
mode=0;
while(!k1);
}
if(!k2)//下限加
{
if(down[mode]<up[mode])
down[mode]++;
while(!k2);
}
if(!k3)//下限减
{
if(down[mode]>0)
down[mode]--;
while(!k3);
}
if(!k4)//上限加
{
if(mode==0)
{
if(up[0]<999)
up[0]++;
}
else
{
if(up[mode]<99)
up[mode]++;
}
while(!k4);
}
if(!k5)//上限减
{
if(up[mode]>down[mode])
up[mode]--;
while(!k5);
}
}
//延时
void delay(uint i)
{
while(i--)
{
key();
}
}
//声音1
void voice1()
{
uint i;
for(i=0;i<5000;i++)
{
delay(50);
beep=!beep;
}
}
//声音2
void voice2()
{
uint i,j;
for(i=0;i<5;i++)
{
for(j=0;j<500;j++)
{
delay(50);
beep=!beep;
}
for(j=0;j<500;j++)
{
delay(50);
}
}
}
//声音3
void voice3()
{
uint i,j;
for(i=0;i<60;i++)
{
for(j=10;j<75;j++)
{
delay(j);
beep=!beep;
}
for(j=75;j>10;j--)
{
delay(j);
beep=!beep;
}
}
}
//声音4
void voice4()
{
uint i,j;
for(i=0;i<15;i++)
{
for(j=10;j<600;j++)
{
delay(20);
beep=!beep;
}
for(j=10;j<500;j++)
{
delay(50);
beep=!beep;
}
}
}
//主函数
void main()
{
disp1[2]=0xdf;
init_1602();
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
key();
//判断
//光照
if((light<down[0])||(light>up[0]))
{
if(flag[0]==0)
{
mode=0;
flag[0]=1;
led1=0;
voice1();
if(light<down[0])
{
out3=0;out4=1;
}
else
{
out3=1;out4=0;
}
}
}
else
{
flag[0]=0;
led1=1;
out3=1;out4=1;
}
//
if(hs>up[1])
{
if(flag[1]==0)
{
mode=1;
flag[1]=1;
led2=0;
voice2();
out2=0;
}
}
else
{
flag[1]=0;
led2=1;
out2=1;
}
//温度
if((dht11_dat[2]<down[2])||(dht11_dat[2]>up[2]))
{
if(flag[2]==0)
{
mode=2;
flag[2]=1;
led3=0;
voice3();
out1=0;
}
}
else
{
flag[2]=0;
led3=1;
}
//湿度
if((dht11_dat[0]<down[3])||(dht11_dat[0]>up[3]))
{
if(flag[3]==0)
{
mode=3;
flag[3]=1;
led4=0;
voice4();
out1=0;
}
}
else
{
flag[3]=0;
led4=1;
}
if((flag[3]==0)&&(flag[2]==0))
out1=1;
}
}
//定时器中断
void Timer0() interrupt 1
{
uchar i;
unsigned long j=0;
if(time<10)//0.5s
time++;
else
{
time=0;
//测量光照
for(i=0;i<10;i++)
light=TLC1543_read(0);
light=light/10;
//测量硫化氢
for(i=0;i<10;i++)
hs=TLC1543_read(1);
j=hs;
hs=j*100/4096;
dht11_recive();//测量温湿度
//显示
if(mode==0)
{
write_string(1,0,"light:");//光照
disp3[0]=light/100+0x30;
disp3[1]=light%100/10+0x30;
disp3[2]=light%10+0x30;
write_string(1,8,disp3);
disp3[0]=down[0]/100+0x30;
disp3[1]=down[0]%100/10+0x30;
disp3[2]=down[0]%10+0x30;
write_string(2,0,"L:");
write_string(2,2,disp3);
disp3[0]=up[0]/100+0x30;
disp3[1]=up[0]%100/10+0x30;
disp3[2]=up[0]%10+0x30;
write_string(2,8,"H:");
write_string(2,10,disp3);
}
if(mode==1)
{
write_string(1,0,"CO2: ");//
disp2[0]=hs/10+0x30;
disp2[1]=hs%10+0x30;
write_string(1,8,disp2);
disp2[0]=down[1]/10+0x30;
disp2[1]=down[1]%10+0x30;
write_string(2,0,"L:");
write_string(2,2,disp2);
disp2[0]=up[1]/10+0x30;
disp2[1]=up[1]%10+0x30;
write_string(2,8,"H:");
write_string(2,10,disp2);
}
if(mode==2)
{
write_string(1,0,"temp: ");//温度
disp1[0]=dht11_dat[2]/10+0x30;
disp1[1]=dht11_dat[2]%10+0x30;
write_string(1,8,disp1);
disp1[0]=down[2]/10+0x30;
disp1[1]=down[2]%10+0x30;
write_string(2,0,"L:");
write_string(2,2,disp1);
disp1[0]=up[2]/10+0x30;
disp1[1]=up[2]%10+0x30;
write_string(2,8,"L:");
write_string(2,10,disp1);
}
if(mode==3)
{
write_string(1,0,"humi: ");//湿度
disp2[0]=dht11_dat[0]/10+0x30;
disp2[1]=dht11_dat[0]%10+0x30;
write_string(1,8,disp2);
disp2[0]=down[3]/10+0x30;
disp2[1]=down[3]%10+0x30;
write_string(2,0,"L:");
write_string(2,2,disp2);
disp2[0]=up[3]/10+0x30;
disp2[1]=up[3]%10+0x30;
write_string(2,8,"H:");
write_string(2,10,disp2);
}
}
TH0=0X3C;
TL0=0XB0;
}