历史上的今天
今天是:2024年10月25日(星期五)
2019年10月25日 | 单片机自动浇花系统设计
2019-10-25 来源:51hei
自动浇水,检测湿度,湿度上下限值可调,自动与手动模式!
制作出来的实物图如下:
功能介绍
单片机土壤湿度检测自动浇花系统系统采用STC89C52单片机+ADC0832+LCD1602液晶+土壤湿度传感器+防水温度传感器+抽水电机+ 按键+蜂鸣器设计而成。
液晶第一行显示 实际的湿度
液晶第二行显示 湿度上限值 湿度下限值
按键说明:
从左边第一个起,减键、加键、设置键。
1.单片机型号:STC89C52/51、AT89C52/51、AT89S52/51 可任选。
2.产品自带单片机上电复位电路、手动复位电路(复位按键)、晶振电路(给单片机提供时钟周期)。
3.采集LCD1602液晶显示土壤湿度和温度,报警参数也可以同时显示出来,直观明了。
4.可以设置湿度和温度的上下限报警范围,并具有掉电保存功能,保存在STC单片机内部,上电无需重新设置。
5.当湿度低于下限值时,打开水泵进行抽水自动灌溉同时声光报警,当湿度高于上限值时,自动关闭水泵停止灌溉。
6.当温度高于上限值时,打开水泵进行抽水自动灌溉同时声光报警,当温度低于下限值时,自动关闭水泵停止灌溉。
7.具有手动模式,按减键手动打开抽水电机,可以按加键手动关闭抽水电机。
8.送配套水泵用的水管。
背面:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
电路原理图如下:
传感器上的D0不用接 AO接0832芯片上就可以了
说明:上面四个文件夹内容是一样的,只是用不同的软件打开而已。
1、.SchDoc为 Altium Designer格式:需要安装软件 Altium Designer。
2、.sch为 Protel 99SE格式:需要安装软件 Protel 99SE。
3、PDF格式:用PDF软件打开即可,如福昕PDF阅读器、Adobe Reader 等软件。
4、word格式:用 word 或 WPS 软件即可打开。
自动浇花系统2版元件清单:
编号 "注释
Comment" "描述
Description" "数量
Quantity"
1 BUZZER 蜂鸣器 1
2 10uF 直插电解电容 1
3 30pf 直插瓷片电容 2
4 104 直插瓷片电容 1
5 220uF 直插电解电容 1
6 发光二极管 5mm直插发光二极管 1
7 LCD1602 LCD1602液晶显示器 1
8 Header 2 排针2-Pin 1
9 POWER DC电源插座 1
10 Header 3 排针3-Pin 1
11 S9012 PNP 三极管 2
12 2.2K 色环电阻 1
13 1K 色环电阻 3
14 10K 色环电阻 2
15 SW-PB 按键6X6X5MM 4
16 SWITCH 自锁开关 1
17 MCU 51单片机 1
18 ADC0832 模数转换芯片 1
19 12M 晶振 1
配套器材
1 导线 XXcm 1
2 焊锡 XXcm 1
3 USB转DC3.5mm电源线 系统供电 1
4 9*15万用板 1
5 单片机插座 40脚IC座 1
6 IC插座 8脚IC座 1
7 LCD1602插座 16P排母 1
8 LCD1602引出脚 16P排针 1
单片机源程序如下:
#include #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 #include sbit SCL=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 == '




