51单片机项目(18)——基于51单片机的大棚环境监测系统

1.功能描述

        首先使用DS18B20,测量土壤温度,并显示在OLED屏幕左边。然后使用土壤湿度传感器测量土壤湿度,因为这个传感器输出的值是模拟量,所以需要使用AD转换模块。本次使用ADC0832,这是一个8位精度的AD转换模块,将土壤湿度传感器输出的模拟量转换为数字量,并送给单片机读取。因为AD的精度为8位,所以转换得到的数字量的范围是0-255.用这个数据量除以256再乘以100就可以得到湿度的百分数(0%-%100)。测出的土壤湿度数据显示在OLED第一行右边。
        然后使用DHT11模块,测空气温度、空气湿度,分别显示在OLED左边、右边。
        最后,系统定义了一个空气温度阈值,显示在屏幕第三行。如果检测到空气温度大于阈值,那么蜂鸣器响,风扇打开。否则蜂鸣器不响,风扇关。系统还定义了一个土壤湿度阈值,如果检测到的土壤湿度阈值低于此阈值,那么打开水泵。

/*
   接线:
   
   DHT11-DAT----->P2.0
   DS18B20-DAT----->P3.7
   
   OLED-SCL----->P1.4
   OLED-SDA----->P1.3
   
   蜂鸣器---->P1.5
   
   风扇---->P2.6
   水泵----->P2.7
   
   ADC0832-CS---->P1.0
   ADC0832-CLK---->P1.1
   ADC0832-DAT---->P1.2
   
   土壤湿度传感器的模拟输出口--->ADC0832的CH0

   L298N需要额外供电,也就是需要另一个电源。
   接线方式:
   L298N的电源端: 12V接 12V/5V  GND接GND
   L298N的IN1---->P2.6
         IN2 不接
         IN3---->P2.7
     IN4 不接
  L298N左边输出端接风扇
    右边输出端接水泵
*/

2.实物图

3.课题意义

        基于51单片机的大棚环境监测系统具有以下几个重要的课题意义:

        1. 提高大棚种植效率:大棚是一种封闭式的种植环境,通过监测和控制关键参数,如温度、湿度、光照等,可以优化植物生长环境,提高种植效率。通过51单片机实时监测环境参数并作出反应,可以及时调整大棚内部的光照、通风、加热等设备,创造适宜的生长环境,提高植物的生长速度和产量。

        2. 降低资源消耗:大棚环境监测系统可以实时监测大棚内部环境的温度、湿度等参数,并根据监测结果自动调整灌溉、通风等设备的运行状态,从而避免资源的浪费和能源的过度消耗。这样不仅能节约水和电,还有助于减少农药的使用,对环境保护起到积极的作用。

        3. 提高农作物质量和口感:通过大棚环境监测系统,可以及时掌握大棚内部环境的变化,并实时调整环境参数,为农作物提供最适宜的生长环境。这样可以提高农作物的质量和口感,使其在市场上具有竞争力。

        4. 实现智能化管理:大棚环境监测系统可以利用51单片机作为中央控制单元,通过传感器收集大棚内部的环境数据,并将数据发送到中央控制单元进行处理和分析。通过网络连接,可以实现对大棚环境的远程监控和控制,实现智能化管理,提高农作物的管理水平和生产效益。

        综上所述,基于51单片机的大棚环境监测系统的课题意义在于提高大棚种植效率,降低资源消耗,提高农作物质量和口感,实现智能化管理。这对于推动农业的可持续发展和提高农民收入具有重要的意义。

4.代码

整个工程的结构如下:

main.c的代码如下

#include "reg51.h"
#include "oled.h"
#include "DHT11.h"
#include "delay.h"
#include "temp.h"	
#include "adc0832.h"

/*
   接线:
   
   DHT11-DAT----->P2.0
   DS18B20-DAT----->P3.7
   
   OLED-SCL----->P1.4
   OLED-SDA----->P1.3
   
   蜂鸣器---->P1.5
   
   风扇---->P2.6
   水泵----->P2.7
   
   ADC0832-CS---->P1.0
   ADC0832-CLK---->P1.1
   ADC0832-DAT---->P1.2
   
   土壤湿度传感器的模拟输出口--->ADC0832的CH0
   
   L298N需要额外供电,也就是需要另一个电源。
   接线方式:
   L298N的电源端: 12V接 12V/5V  GND接GND
   L298N的IN1---->P2.6
         IN2 不接
         IN3---->P2.7
	 IN4 不接
  L298N左边输出端接风扇
	右边输出端接水泵
*/

sbit beep=P1^5;         //蜂鸣器

sbit fengshan=P2^6;      //风扇控制引脚
sbit shuibeng=P2^7;     //水泵控制引脚

extern uchar temp;      //温度
extern uchar humi;      //湿度

int t=0;            //在定时器中记录1S时间

int wendu_yuzhi=30;        //空气温度阈值    大于此阈值  开风扇  低于  关
int turang_yuzhi=20;       //土壤湿度阈值    小于此阈值  开水泵  大于  关

int datapros(int temp) 	 
{
   	float tp;  
	if(temp< 0)				//当温度值为负数
  	{
	
		//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
		temp=temp-1;
		temp=~temp;
		tp=temp;
		temp=tp*0.0625*100+0.5;	
		//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
		//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
		//算加上0.5,还是在小数点后面。
 
  	}
 	else
  	{		
		tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
		//如果温度是正的那么,那么正数的原码就是补码它本身
		temp=tp*0.0625*100+0.5;	
		//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
		//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
		//算加上0.5,还是在小数点后面。
	}
   
   return temp;
}



void Int0Init()             //定时器初始化 
{  
  
   TMOD=0X01;                  //定时器工作在方式1下,即16位定时器
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;   
   TR0=1;                     //打开定时器0
   ET0=1;                     //使能定时器0
   EA=1;                     //打开总中断
   
}



main()
{  
    int turang_tempe=0;         //土壤温度数据
    int turang_humi=0;     //土壤湿度数据
    OLED_Init();			//初始化OLED  
	 OLED_Clear();
    Int0Init() ; 
   while(1)
   {
       turang_tempe=datapros(Ds18b20ReadTemp())/100;	 //数据处理函数   处理温度数据 
       turang_humi=100-(read_ad(0)/256.0)*100;                     //获取土壤湿度数据
      
       OLED_ShowString(3*8,0,"T:",16);
       OLED_ShowNum(5*8,0,turang_tempe,3,16);        //显示土壤温度
       OLED_ShowString(10*8,0,"H:",16); 
       OLED_ShowNum(12*8,0,turang_humi,3,16);        //土壤湿度
      
      
       OLED_ShowString(3*8,2,"T:",16); 
       OLED_ShowNum(5*8,2,temp,2,16);        //空气温度
       OLED_ShowString(10*8,2,"H:",16); 
       OLED_ShowNum(12*8,2,humi,2,16);        //空气湿度
       
      //显示空气温度阈值
       OLED_ShowString(3*8,4,"T_Y:",16);
       OLED_ShowNum(7*8,4,wendu_yuzhi,3,16);   

      //显示土壤湿度阈值
       OLED_ShowString(3*8,6,"S_Y:",16);
       OLED_ShowNum(7*8,6,turang_yuzhi,3,16);   

      
      if(temp>wendu_yuzhi)         //如果空气温度大于空气温度阈值  那么蜂鸣器响 风扇开
      {
         beep=1;
         fengshan=1;
      }
      else                             //否则 蜂鸣器不响  风扇关
      {
         beep=0;
         fengshan=0;
      }
      
      if(turang_humi<turang_yuzhi)     //如果土壤湿度小于土壤湿度阈值  那么开水泵
      {
         shuibeng=1;
      }
      else
      {
         shuibeng=0;
      }
      
       Delay(180);              //延时180ms
   }
}

void time0() interrupt 1		//定时器0的中断服务函数
{   
   t++;                          //t为20时,计数满1s
   if(t==20)
   {
       receive(); 				// 检测温湿度数据 
    t=0; 
   
   }  
   
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;         //重新给定时器赋值
  
	
}

5.完整工程

        具体实现过程就不介绍了,需要完整项目工程的可以私信我!!!

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本资料是基于51单片机环境监测系统 /*--------------------------------------------------------------------- ds18b20.h文件 ds18b20的函数 作者: 创建日期:2008.05.05 最后修改日期:2008.05.10 版本:2.0 1 单线单口的ds18b20的温度读取。 2 复位状态连续读取。 3 转换温度值在Disbuf[5];。 所有子程序: delay_ds18b20(unsigned int t) //延时US unsigned char ReadOneChar(void) //读一个字节 void WriteOneChar(unsigned char dat) //写一个字节 bit Init_DS18B20(void) //初始化函数 void TemperatuerResult(void) //复位 void r_ds18b20() //读取并转换温度值到Disbuf[]! ----------------------------------------------------------------------*/ #ifndef __ds18b20_1_H__ #define __ds18b20_1_H__ #include #define uchar unsigned char #define uint unsigned int /*--------------------------------------------------------- ds18b20数据、控制口定义 ---------------------------------------------------------*/ /*--------------------------------------------------------- void r_ds18b20(void) //读取并转换温度值到Disbuf[]! { TemperatuerResult(); xiaoshu = tplsb&0x0f; tpmsb = tpmsb<>4; xiaoshutemp = xiaoshu *625; xiaoshutemp = xiaoshutemp/100; zhengshu = tpmsb + tplsb; if(zhengshu = 0x64)&&(zhengshu <= 0x7d)) { Disbuf[0] = zhengshu/100; Disbuf[1] = zhengshu%100/10; Disbuf[2] = zhengshu%10+10; Disbuf[3] = xiaoshutemp/10; Disbuf[4] = xiaoshutemp%10; } else; } #include "reg52.h" #include "ds18b20.h" #define uchar unsigned char #define uint unsigned int void main() //主函数 { Init_DS18B20(); while(1) { r_ds18b20(); } } ---------------------------------------------------------*/ #endif

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值