0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > 基于AT89C51单片机的智能大棚浇水系统设计方案

基于AT89C51单片机的智能大棚浇水系统设计方案

来源: elecfans
2021-07-07
类别:工业控制
eye 9
文章创建人 拍明

原标题:基于AT89C51单片机的智能大棚浇水系统设计方案

  最近几年,人们的生活水平有了很大提高,在种植业也是实现科技化,人工智能走进农业,但由于缺少检测工具,人们因并不知道土壤的缺水程度及其他原因无法按时浇水或是浇水过多的植物和成为主要的死亡原因。

  为解决自动化管理大棚创建智能大棚管理系统,但是智能灌溉系统的特点在市场上众多的仪器,但价格过于昂贵,对于一般家庭,过于复杂的应用程序和多功能性是不必要的。

  智能大棚浇水系统能够解决这个问题,该系统主要是一个电磁阀致动器在一端连接管,连接到外部水管作为浇水主要由微控制器控制的另一端。设备主要通过控制浇水间隔浇水的持续时间,以控制浇水量。方便操作,这样就实现了现代家庭生活,同时也保证植物的正常生长。

  1.总体设计

  根据题目要求的要求,确定了以下方案:自己买材料制作,连接到微控制器,使土壤水分控制,并在此基础上,最小系统板安装湿度传感器。然后,湿度测距数据检测模块返回到微控制器,微控制器发送相应的命令来实现对泵的开关控制,实现自动检测和自动浇水湿度的功能。

  1.1 主控芯片的选择 现在市场上种类繁多,最能够满足比单片机AT89C51,AVR单片机主体的要求,以及ARM,凌阳,当然他们有自己的优势和劣势在控制芯片,但这个设计过程中,我们选择了AT89C51。相比于其他类型的控制芯片,AT89C51系列更适合我们这个型号,如:AT89C51单片机完全能够完成这一精心设计的所有功能; AT89C51外围电路非常简单,易于控制;在我们的课程对许多AT89C51的演讲;事情TA89C51价格相对于其他的控制芯片,便宜很多,最重要的可能是一个很好的成本控制能力。

  考虑到所有这些点的时候我是在最后的设计选用AT89C51单片机来完成这一设计。

  1.2 AT89C51单片机的基本组成

  AT89C51由一个8位的微处理器,128KB片内数据存储器RAM,21个特殊功能寄存器SFR,4KB片内程序存储器Flash ROM,64KB可寻址片内外统一编址的ROM,64KB可寻址片外的RAM, 4个8位并行I/O接口(P0—P3),一个全双工通用异步串行接口UART,两个16位的定时器/计数器,具有位操作功能的布尔处理机及位寻址功能的五个中断源、两个优先级的中断控制系统以及片内振荡器和时钟产生电路。其基本组成框图如图所示。

  1.3 AT89C51主要特性

  AT89C51主要特性有:

  ·与MCS-51 兼容

  ·4K字节可编程闪烁存储器

  ·寿命:1000写/擦循环

  ·数据保留时间:10年

  ·全静态工作:0Hz-24Hz

  ·三级程序存储器锁定

  ·128*8位内部RAM

  ·32可编程I/O线

  ·两个16位定时器/计数器

  ·5个中断源

  ·可编程串行通道

  ·低功耗的闲置和掉电模式

  ·片内振荡器和时钟电路

  #include 《reg51.H》 #include “intrins.h” #define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define LCDIO P0 //液晶屏数据口 //ADC0832的引脚 sbit ADCLK =P1^1; //ADC0832 clock signal sbit ADDIO =P1^3; //ADC0832 k in sbit ADCS =P1^4; //ADC0832 chip seclect sbit rs=P1^0; //定义1602 RS sbit lcden=P1^2; //定义1602 EN sbit key1=P3^0; //设定 sbit key2=P3^1; //加 sbit key3=P3^2; //减 sbit motor=P3^7; //继电器接口 sbit speak=P1^5; //蜂鸣器接口 uchar key; //设定指针 uint RH=400,RL=200;//水位上下限 float temp_f; ulong temp; uchar v; uchar count,s1num; uchar code table[]= “ moisture: ”; uchar code table1[; uchar getdata; //获取ADC转换回来的值 /*********************************************/ void delay(uint z) //延时 { uint x,y; for(x=z;x》0;x--) for(y=110;y》0;y--); } /**********************************************/ void write_com(uchar com) { rs=0; // rd=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } /*********************************************/ void write_date(uchar date) { rs=1; // rd=0; lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void lcdinit() { lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } /***********************************************/ void init() { uchar num; for(num=0;num《15;num++) { write_date(table[num]); delay(5); } write_com(0x80+0x40); for(num=0;num《15;num++) { write_date(table1[num]); delay(5); } } //****************************************************************************/ /************ 读ADC0832函数 ************/ //采集并返回 /**************************************************************************** 函数功能:AD转换子程序 入口参数:CH(如果读取CH0,channel的值为0x01,如果读取CH1则channel的值为0x03) 出口参数:adval ****************************************************************************/ uchar Adc0832() //AD转换,返回结果 { uchar i; uchar dat=0; ADCLK=0; ADDIO=1; ADCS=0; //拉低CS端 ADCLK=1; ADCLK=0; //拉低CLK端,形成下降沿1 ADDIO=1;//指定转换通道是CH1还是CH2,指定值位与0x1,取最后一位的值 ADCLK=1; ADCLK=0; //拉低CLK端,形成下降沿2 ADDIO=0;//指定值右移一位,再取最后一位的值 ADCLK=1; ADCLK=0; //拉低CLK端,形成下降沿3 ADDIO=1; for(i=0;i《8;i++) { ADCLK=1; ADCLK=0; //形成一次时钟脉冲 if(ADDIO) dat|= 0x80》》i; //收数据 } ADCS=1; //拉低CS端 ADCLK=1; ADDIO=1; //拉高数据端,回到初始状态 return(dat); //return dat } /***************************************************************************/ /********************************************************/ void displayRH() //下限显示 {write_com(0xc0+3); write_date(RH/100%10+0x30);//上限百位 write_date(RH/10%10+0x30);//上限十位 //write_date(‘。’); //write_date(RH%10+0x30); } void displayRL() //下限显示 {write_com(0xca); write_date(‘R’); write_date(‘L’); write_date(‘:’); write_date(RL/100%10+0x30);//下限百位 write_date(RL/10%10+0x30);//下限十位 write_date(‘%’); } /**************************************************/ /********************************************************/ void keyscan() //按键处理 {bit kk1=0,kk2=0; if(key1==0) {delay(30); while(key1==0); if(key》=2) {key=0; } else {key++; } switch(key) {speak=1;kk2=motor;motor=1; case 1:{write_com(0x0f);write_com(0xce); //光标闪烁 while(key1!=0) //等待按键松开 { if(key2==0) //key2按键下 {delay(30); //按键延时消抖 if(key2==0) //确定key2按下 { while(key2==0); //等待松开 if(RL》=998) {RL=999; //RL下限最大设置为99 } else {RL+=10; //RL加1 } } displayRL(); //调用RL下限显示函数 write_com(0xce); } if(key3==0) //key3按下 {delay(30); //按键延时消抖 if(key3==0) //确定key3按下 { while(key3==0); //等待key3按键松开 if(RL《=1) //RL最小设置为1 {RL=0; } else {RL-=10; //RL下限减1 } } displayRL(); //调用RL下限显示函数 write_com(0xce); } }while(key1==0); } case 2:{write_com(0x0f);write_com(0xc4); //RH设置数据,光标闪烁 while(key1==1) { if(key2==0) //key2按下 {delay(30); //按键延时消抖 if(key2==0) //确定key2按下 { while(key2==0); //等待松开 if(RH》=998) //RH最大设置为99 {RH=999; } else {RH+=10; //RH加1 } } displayRH(); //RH上限显示函数 write_com(0xc4); } if(key3==0) //key3按下 {delay(30); //按键延时消抖 if(key3==0) //确定按下 { while(key3==0);//等待松开 if(RH《=1) //RH最小设置为1 {RH=0; } else {RH-=10; //RH减1 } } displayRH(); //调用RH显示函数 write_com(0xc4); } } while(key1==0); } case 0:{write_com(0x0c); motor=kk2; break;} } } } /**************************************************/ void Conut(void) //土壤检测数据转换 { v=Adc0832(); temp=v; temp_f=temp*9.90/2.55; temp=temp_f; temp=1000-temp; write_com(0x80+10); write_date(temp/100%10+0x30);//千位 write_date(temp/10%10+0x30);//百位 write_date(‘。’); write_date(temp%10+0x30); write_date(‘%’);//显示符号位 } /********************************************************/ void main(void) { lcdinit(); init(); displayRH(); //显示上限 displayRL(); //显示下限 delay(50); //启动等待,等LCD讲入工作状态 delay(50); //延时片刻(可不要) delay(50); //延时 delay(50); Conut(); //显示函数 delay(150); while(1) { Conut(); //显示当前湿度 keyscan(); if(temp》RH) //如果湿度大于上限停止浇水 {motor=1; //关闭继电器 } else if(temp《RL) //如果湿度小于RL下限启动浇水 {motor=0; //启动继电器 } if(temp《RL) //小于下限启动报警并浇水 {speak=0; //启动报警 delay(150); //延时 speak=1; } keyscan(); //按键检测 delay(150); //延时50MS } } 3.1 总电路设计图

  


  4. 联机调试

  


  总结

  本次设计的智能大棚浇水系统以电子类的自动浇水器的工作原理为参考,运用现代传感器技术及单片机控制技术构成一个土壤温湿度采集与控制系统。再用数字电路控制自动给水系统及时的给浇水系统供水。整个盆花自动浇水系统包括土壤温湿度的检测和显示、自动浇水和蓄水箱自动上水及水位报警三个部分。蓄水箱自动上水及水位报警采用纯硬件电路控制,实现水箱水位实时监测、自动上水以及水位上下限报警的功能。

  通过本次课程设计,让我进一步了解了电脑控制的智能系统。也使我们真正接触到了检测控制系统的设计,虽然是一个人们日常生活中的小系统,但也让我明白了很多设计上应该注意的问题。比如实用性、经济性以及安装条件等。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯