历史上的今天
返回首页

历史上的今天

今天是:2024年11月25日(星期一)

正在发生

2019年11月25日 | 基于单片机的自动浇水花房控制系统的设计

2019-11-25 来源:51hei

0.jpg?imageView2/2/w/550 (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;                //开始

                CLK=1;                //第一个上升沿        

                DI=0;

                CLK=0;

                DI=1;

                CLK=1;          //第二个上升沿

                DI=0;

                CLK=0;

                DI=0;

                CLK=1;            //第三个上升沿

                DI=1;

                CLK=0;            //第三个下降沿

                for(i=0;i<8;i++)

                {

                        CLK=0;

                        CLK=1; //开始从第四个下降沿接收数据

                        value<<=1;

                        if(DO)

                                value++;                                                

                }

                for(i=0;i<8;i++)

                {                        //接收校验数据

                        value1>>=1;

                        if(DO)

                                value1+=0x80;

推荐阅读

史海拾趣

Aimtec公司的发展小趣事

作为一家注重品质的企业,Aimtec公司深知质量管理体系的重要性。因此,公司投入大量资源,建立了完善的质量管理体系,并通过了ISO 9001:2015等国际质量管理体系认证。这些认证不仅证明了Aimtec公司在质量管理方面的实力,也为公司的业务拓展提供了有力的保障。通过持续的质量改进和创新,Aimtec的产品在行业中赢得了良好的口碑。

CNC Tech公司的发展小趣事

CNC Tech公司深知,在竞争激烈的电子行业中,品质是赢得客户信任和市场口碑的关键。因此,公司始终坚持品质至上的原则,从原材料采购到生产制造的每一个环节都严格把控品质。CNC Tech还建立了完善的品质管理体系,通过严格的质量检测和持续的技术改进,确保每一台出厂的设备都能达到客户的期望和要求。正是凭借这种对品质的执着追求,CNC Tech赢得了广大客户的信赖和好评。

DMS Electronic Components, Inc公司的发展小趣事

在电子行业中,市场拓展是企业发展的关键因素之一。DMS积极开拓国内外市场,与众多知名企业建立了长期稳定的合作关系。公司通过提供优质的产品和服务,赢得了客户的信赖和支持。同时,DMS还积极参与行业展会和交流活动,与同行进行技术交流和合作,共同推动电子行业的发展。

Equinox公司的发展小趣事

在稳步发展健身业务的同时,Equinox还在不断探索新的领域。例如,公司推出了精品酒店品牌Equinox Hotels,将健身与旅游相结合;同时,Equinox还积极进军健康食品、健康科技等领域,以实现多元化的发展战略。未来,Equinox将继续秉承“健康、活力、高品质”的品牌理念,为全球消费者提供更优质的服务和体验。

BUSSMANN公司的发展小趣事

1985年,库柏工业收购了Bussmann公司,成立了新的事业部——“Cooper Bussmann熔断器”。这一收购为Bussmann带来了更广阔的市场和更多的资源,同时也带来了新的挑战和机遇。在库柏工业的支持下,Bussmann开始了更加积极的创新和市场拓展,逐渐成为了全球熔断器行业的领导者。

Dean Technology公司的发展小趣事

随着产品技术的不断成熟,Dean Technology公司开始注重品牌建设和市场推广。他们积极参加各类电子展会,展示公司的最新产品和技术,与行业内外的客户建立联系。同时,公司还通过广告宣传、合作伙伴关系等方式,提高品牌知名度和美誉度。这些努力使得Dean Technology的高压二极管产品逐渐在市场上获得了认可。

问答坊 | AI 解惑

903恒温电烙铁电路图

核心的IC就是运放,或者LM324,LM358,通过双向可控硅来控制加热芯通断! 温度控制采用热电偶,或者热敏电阻;电源采用220VAC直接RC降压。 成本比较低廉,损坏之后可以参考此电路进行维修!…

查看全部问答>

请教!!!使用Driverstudio,Defaultpnp的问题

使用DRIVERMONITOR显示 IRP: Major=IRP_MJ_PNP Minor= (0x18) defaultPnp--.  IRP 856C8790, STATUS c00000bb 调用m_lower.ActivateConfiguration配置时,返回AC_FAILED_TO_OPEN_PIPE_OBJECT, 是我端点配置错误吗? 应该跟底下的固 ...…

查看全部问答>

lineMakeCall 失败 错误号为 LINEERR_INVALBEARERMODE 的原因

我的调用顺序为: lineOpen --------------Success lineTranslateAddress     -----success 设置为: lpCallParams->dwTotalSize      = dwSizeOfCallParams;         lpCallParam ...…

查看全部问答>

如何在PDA上开发蓝牙程序

如何在PDA上开发蓝牙程序与蓝牙串口芯片控制单片机进行串口通信(非微软协议栈)…

查看全部问答>

一个有关cxa1238的图,高手请指点一下

本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 各位高手帮忙指点一下,按照下图中的cxa1238芯片的22脚接的本振,可是怎么调频率总是680k左右,我的载频是35M,所以本振应该是在45M左右,可是怎么调可调电容,它频率总不变啊!!!!找也没找出原因 ...…

查看全部问答>

关于ads1115学习心得体会

研究ADS1115一段时间了,终于搞定啦,其实操作还是蛮简单的,主要分为三部分的步骤,本次列子是模拟IIC操作的哦。。。。。 其实主要分为三部分, 第一部分:write config register 1   0x90   最后一位是R/W位,高为读,低 ...…

查看全部问答>

BGA焊接 , 你也是高手!

BGA焊接,你也是高手   BGA的焊接,对DIY爱好者始终是个难题,很多人对它望而却步。手工焊接时,如果第一次没有成功,很可能将它这个芯片丢弃,实在可惜。我们可以研究一下工厂里对它的焊接过程,找一找手工焊接的方法。 本帖的目的 ...…

查看全部问答>

关于《科学鬼才:电子电路设计64讲》资源涉嫌侵权的处理

前一段小版在论坛下载中心上传了一份资源《科学鬼才:电子电路设计64讲》(帖子链接https://bbs.eeworld.com.cn/thread-418842-1-1.html)。今天接人民邮电出版社通知,说该资源涉嫌侵权。为避免不必要的纷争,论坛决定将该资源删除。由此给大家带 ...…

查看全部问答>

利用msp430g2253实现串口通信,利用串口调制助手测试

程序是这样的,但是串口调试助手无法接收到数据我理想的效果是向430发送hello,430回复hello world #include void main(void) {         WDTCTL=WDTPW+WDTHOLD;  // Stop WDT         if( ...…

查看全部问答>

【TIVA C Launchpad 学习笔记六】定时器四种模式:单次计时,周期计时,数捕获,计时捕获

模式一&模式二:单次计时&周期计时/******************************************* 开发坏境:CCSv5.4 开发板:TIVA C Launchpad(TM4C123GH6PM) 程序功能:16位定时器,单次定时模式和周期性定时模式 程序说明: 编程者:Linchpin *************** ...…

查看全部问答>