×
单片机 > 单片机程序设计 > 详情

基于单片机的自动浇水花房控制系统的设计

发布时间:2020-06-15 发布时间:
|

0.jpg (59.18 KB, 下载次数: 7)

下载附件  保存到相册

2018-5-5 16:22 上传

 

本次设计是设计一种51单片机控制的自动浇水系统,实现室内盆花浇水的自动化系统。该系统可对土壤的湿度进行监控,并对作物进行适时适量的浇水。其核心是51单片机和土壤湿度检测器YL-69和显示电路以及浇水继电器驱动电路构成的检测控制部分。主要研究土壤湿度与浇水时间之间的关系、浇灌控制技术及设备系统的硬件、软件编程各个部分。检测部分,单片机选用AT89C51单片机,软件选用C51语言编程。土壤湿度采集与显示电路可将检测到的土壤湿度模拟量放大转换成数字量通过单片机内程序控制精确的将温度与湿度分别显示在LED数码管显示屏上,通过单片机内的中断服务程序判断是否要给盆花浇水,若需浇水,则单片机系统发出浇水信号,开始浇水,若不需要浇水,则进行下一次循环检测。在浇水系统中也同时设计一个定时浇水部分,通过按键开关设置不同的浇水时间段,在时间段以内时,单片机驱动浇水系统,开始浇水,如不在时间段内,则不浇水。
 

电路原理图如下:
 

用途: 
通过电位器调节土壤湿度控制阀值,可以自动对菜园,花园自动浇水,家庭花盆土壤湿度的控制,各种电子比赛,电子积木,arduino 设计等。 
产品介绍: 
1.采用本公司生产的优质土壤传感器做土壤湿度的检测,表面采用镀镍处理,有加宽的感应面积,可以提高导电性能,防止接触土壤容易生锈的问题,延长使用寿命; 
2.产品可以宽范围控制土壤的湿度,通过电位器调节控制相应阀值,湿度低于设定值时,DO 输出高电平,高于设定值时,DO 输出低电平;
3.比较器采用 LM393 芯片,工作稳定 
4.工作电压 3.3V-5V 
5.设有固定螺栓孔,方便安装 
6.PCB 尺寸:3.2cm * 1.4m 
模块使用说明: 
1.传感器适用于土壤的湿度检测; 
2.模块中蓝色的电位器是用于土壤湿度的阀值调节,顺时针调节,逆时针越小; 
3.数字量输出 D0 可以与单片机直接相连,通过单片机来检测高低电平,由此来检测土壤湿度; 
4 小板模拟量输出 AO 可以和 AD 模块相连,通过 AD 转换,可以获得土壤湿度更精确的数值; 


单片机源程序如下:

#include                 //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255

#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535


#include


sbit CLK=P1^4;                //SCL定义为P1口的第3位脚,连接ADC0832SCL脚

sbit DO=P1^5;                //DO定义为P1口的第4位脚,连接ADC0832DO脚

sbit CS=P1^3;                //CS定义为P1口的第4位脚,连接ADC0832CS脚


sbit beep = P3^3;   //蜂鸣器IO口定义

uint temperature,s_temp ;  //温度的变量

uchar shidu;     //湿度等级

uchar s_high = 70,s_low = 25;        //湿度报警参数


sbit dianji = P1^6;     //电机IO定义


bit flag_300ms ;

uchar key_can;                 //按键值的变量

uchar menu_1;        //菜单设计的变量


//这三个引脚参考资料

sbit rs=P1^0;         //1602数据/命令选择引脚 H:数据              L:命令

sbit rw=P1^1;         //1602读写引脚                 H:数据寄存器          L:指令寄存器

sbit e =P1^2;         //1602使能引脚          下降沿触发

uchar code table_num[]="0123456789abcdefg";


/********************************************************************

* 名称 : delay_uint()

* 功能 : 小延时。

* 输入 : 无

* 输出 : 无

***********************************************************************/

void delay_uint(uint q)

{

        while(q--);

}


/********************************************************************

* 名称 : write_com(uchar com)

* 功能 : 1602命令函数

* 输入 : 输入的命令值

* 输出 : 无

***********************************************************************/

void write_com(uchar com)

{

        e=0;

        rs=0;

        rw=0;

        P0=com;

        delay_uint(3);

        e=1;

        delay_uint(25);

        e=0;

}


/********************************************************************

* 名称 : write_data(uchar dat)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

***********************************************************************/

void write_data(uchar dat)

{

        e=0;

        rs=1;

        rw=0;

        P0=dat;

        delay_uint(3);

        e=1;

        delay_uint(25);

        e=0;        

}


/********************************************************************

* 名称 : write_sfm2(uchar hang,uchar add,uchar date)

* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示"23" ,调用该函数如下

                  write_sfm1(1,5,23)

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void write_sfm2(uchar hang,uchar add,uint date)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

        write_data(0x30+date/10%10);

        write_data(0x30+date%10);        

}


/********************************************************************

* 名称 : write_string(uchar hang,uchar add,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

                  write_string(1,5,"ab cd ef;")

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void write_string(uchar hang,uchar add,uchar *p)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

                while(1)

                {

                        if(*p == '')  break;

                        write_data(*p);

                        p++;

                }        

}


/********************************************************************

* 名称 : init_1602()

* 功能 : 初始化1602液晶 

* 输入 : 无

* 输出 : 无

***********************************************************************/

void init_1602()

{

        write_com(0x38);

        write_com(0x38);

        write_com(0x0c);

        write_com(0x06);

        delay_uint(1000);

        write_string(1,0,"   shidu:00%    ");

        write_string(2,0," SH:00%  SL:00% ");

        write_sfm2(2,4,s_high);        //显示湿度上限

        write_sfm2(2,12,s_low);                   //显示湿度下限

}



/***********************1ms延时函数*****************************/

void delay_1ms(uint q)

{

        uint i,j;

        for(i=0;i

                for(j=0;j<120;j++);

}


/***********读数模转换数据********************************************************/        

//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的

                                                //  1  0  0 通道

                                                //  1  1  1 通道 

unsigned char ad0832read(bit SGL,bit ODD)

{

        unsigned char i=0,value=0,value1=0;                

                CLK=0;

                DI=1;

CS=0;


关键字:单片机  自动浇水  花房控制系统 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
用Atmega 16单片机驱动字符型液晶显示芯片