基于单片机节水浇灌系统_第1页
基于单片机节水浇灌系统_第2页
基于单片机节水浇灌系统_第3页
基于单片机节水浇灌系统_第4页
基于单片机节水浇灌系统_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

④转换速率指能够重复进行数据转换的速疫,即每秒转换的次数。3.4显示器件选取显示部分选用1602液晶显示共十六引脚,1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。蓝底白字标准型16X2液晶显示字符模块(背光/蓝屏)1602采用标准的16脚接口,其中:第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15脚:背光电源正极第16脚:背光电源负极3.5开关与报警选取开关部分选用四相步进电机采用电机正反转来控制阀门。报警器选用蜂鸣器。4.软件语言的选取本系统下位机以单片机为核心,采用C语言编程。C语言是书写程序的一种软件语言,它是计算机软件设计的重要工具。在系统软件开发、实时控制的和实时处理领域中有着不可替代的地位。用C语言编程使编程简洁易懂,进而进行高质量的设计,而且它不独立于具体机器,是一种非常通用的高级程序设计语言,采用C语言编程,因此,在已经有众多高级语言和可视化集成开发环境工具的今天,C语言有着重要的有效的程序设计语言地位。5.模糊控制过程开始采样计算分析取合适值判断是否需要浇水不需要浇水浇水步进电机开关打开结束 模糊控制流程图6.单片机的主要系统电路6.1时钟电路单片机的时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:内部振荡和外部振荡。MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTALl和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,如图所示在其外接晶体振荡器(简称晶振)或陶瓷谐振器就构成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲。图中外接晶体以及电容C2和C3构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值均为30PF左右,晶振频率选12MHz。 30PF STC89C52RC STC89C52RC XTAL2 VCCGND 12M 10UF RESET GND 30PF XTAL1 1KΩ 时钟电路复位电路6.2复位电路为了初始化单片机内部的某些特殊功能寄存器,必须采用复位的方式,复位后可使CPU及系统各部件处于确定的初始状态,并从初始状态开始正常工作。单片机的复位是靠外电路来实现的,在正常运行情况下,只要RST引脚上出现两个机器周期时间以上的高电平,即可引起系统复位。但如果RST引脚上持续为高电平,单片机就处于循环复位状态。复位后系统将输入/输出(I/O)端口寄存器置为FFH,堆栈指针SP置为07H,SBUF内置为不定值,其余的寄存器全部清0,内部RAM的状态不受复位的影响,在系统上电时RAM的内容是不定的。复位操作有两种情况,即上电复位和手动(开关)复位。本系统采用上电复位方式。6.3数据采集处理电路ADC0809是一种8位逐次逼近AD转换器,内部具有锁存控制的8路模拟开关,外接8路模拟输入端,可同时对8路O一5V的输入模拟电压信号分时进行采集转换,本系统只用到IN0输入通道。ADC0809转换器的分辨率为8位,最大不可调误差小于±1LSB,采用单一+5V供电,功耗为15mW,不必进行零点和满度调整。由于ADC0809转换器的输出数据寄存器具有可控的三态输出功能,输出具有三态锁存缓冲器,故其8位数据输出引脚可直接与数据总线相连。AD转换器需外部控制启动转换信号方能进行转换,这一启动转换信号可由CPU提供,不同型号的A/D转换器,对启动转换信号的要求也不同,分脉冲启动和电平启动两种,ADC0809采用脉冲启动转换,只需给A/D转换器的启动控制转换的输入引脚(START)上,加入正脉冲信号,即启动A/D转换器进行转换,转换开始后,转换结束信号输出端(EOC)信号变低,转换结束时,EOC返回高电平,以通知主机读取转换结果的数字量,这个信号可以作为A/D转换器的状态信号供查询,也可以用作中断请求信号。本系统中ADC0809与AT89C51单片机的接口如图4.5所示,采用等待延时方ADC0809的时钟频率范围要求在10一1280kHz,采用定时器给其脉冲频率。如图连接方式,ADC0809的8位数据输出引脚可直接与数据总线相连,地址译码引脚A、B、C分别接地,以选通IN0通道。AT89C51的P:。作为片选信号,在启动AID转换时,由单片机的写信号WR和P:。控制ADC的地址锁存和转换启动。由于ALE与START连在一起,因此ADC0809在锁存通道地址的同时也启动转换,在读取转换结果时,用单片机的读信号RD和P,。引脚一级或菲门产生的正脉冲作为OE信号,用以打开三态输出锁存器。6.4LCD液晶显示该系统采用1602液晶显示,数据口接单片机P0口,和AD0809公用数据口,LCD显示简单,电路接线也简单,价格也便宜。6.4报警系统为了在某些紧急状态或反常状态下,能使操作人员不致忽视,以便及时处理,往往需要有某种更能引起人们注意提起警觉的报警信号产生,这种报警信号通常有三种类型:闪光报警、鸣音报警、语音报警,本系统采用简单易行的光报警电路。报警设备选用压电式蜂鸣器,它约需要10mA的驱动电流,只需在其两条引线上加3一15v的直流电压,即可产生3KHz左右的蜂鸣声音,图中蜂鸣器的一端接在高电平+5V,另一端接P1.7,在初态P1.7始终输出高电平1,当需要报警时,程序对其端口清零即可,声音的长短可用延时程序控制实现。6.5电机控制电机使用四相八拍步进电机,电机驱动使用UL2003A芯片,使用步进电机做开关。6.6电路原理图如下7.电路板的印刷与制作电路板制作是先使用protel99做好印刷电路,在打印,印刷,腐蚀,最后焊接。电路PCB图如下:8.软件设计部分系统软件程序设计主要包括:主程序设计.采样子程序设计。数据处理程序LCD显示子程序,电机控制,蜂鸣器报警。8.1头文件#ifndef__yyyy_H__#define__yyyy_H__#include<reg52.h>#include<intrins.h>sbitSTART=P1^0;sbitEOC=P1^1;sbitOE=P1^2;sbitCLOCK=P1^3;sbitRS=P1^4;sbitRW=P1^5;sbitLCD_1602=P1^6;sbitBUZZ=P1^7;sbitDATA7=P0^7;sbitMA=P2^0;sbitMB=P2^1;sbitMC=P2^2;sbitMD=P2^3;typedefunsignedcharuint8;typedefunsignedintuint16;typedefunsignedlongintuint32;voiddelay_1(uint16j);voidbuzz_1(uint8dat,uint16j);voidmotor_1(void);voidread_status_1(void);voidcommand_1(uint8data_1);voiddata_1(uint8data_1);voidLCD_Initialize_1(void);voidwrite_space_1(uint8i);voiddisplay_1(floatdat);voidInitialize_2(void);floatADC0809_1(void);voiddisplay_2(void);floatdata_Correction(void);voidmotor_2(uint8dat);#endif8.2主程序与子程序部分#include"节水浇灌系统.h"/*==================== 延时部分====================*/voiddelay_1(uint16j)//延时函数{ while(j--);}/*====================== 数据采集转处理部分======================*/voidInitialize_2(void)//定时器初始化函数{ TMOD=0X01; TH0=0xff; TL0=0XFE; EA=1; ET0=1; TR0=1;}floatADC0809_1(void)//AD0809转换函数{ floatdat; START=0; _nop_(); START=1; _nop_(); _nop_(); START=0; P0=0XFF; while(!EOC);//检测数据是否转换结束 _nop_(); OE=1; dat=P0; _nop_(); OE=0; dat*=5.0/255; returndat;}voidinterrupt_1(void)interrupt1//AD0809提供工作频率{ TH0=0xff; TL0=0XFE; CLOCK=~CLOCK;} floatdata_Correction(void)//计算比较精确的值 { uint8i=10,j=10; floatdat=0,dat_1[]={0,0,0,0,0,0,0,0,0,0}; while(i--)dat_1[i]=ADC0809_1(); while(j--)for(i=j;i<9&&i>=0;i--)//数值排序 { if(dat_1[j]<dat_1[i]) { dat=dat_1[j]; dat_1[j]=dat_1[i]; dat_1[i]=dat; } } dat=0; for(i=1;i<9;i++) dat+=dat_1[i]; dat/=8; dat/=135; dat*=1000; dat-=6; if(dat<0)dat=0; dat*=24/16; dat-=4; display_1(dat); returndat;}/*================== 液晶显示部分====================*/voidread_status_1(void)//检测忙信号函数{ P0=0XFF; RS=0; RW=1; do { LCD_1602=0; LCD_1602=1; } while(DATA7); LCD_1602=0;}voidcommand_1(uint8data_1)//写命令函数{ read_status_1();//检测忙信号 RS=0; RW=0; P0=data_1; LCD_1602=1; LCD_1602=0;}voiddata_1(uint8data_1)//写数据函数{ read_status_1();//检测忙信号 RS=1; RW=0; P0=data_1; LCD_1602=1; LCD_1602=0;}voidLCD_Initialize_1(void)//液晶初始化函数{ command_1(0x38); command_1(0x01); command_1(0x0c);}voidwrite_space_1(uint8i)//显示位清除函数{ while(i--)data_1('\');}voiddisplay_1(floatdat)//数据显示函数{ uint16h,i,j,k,l,m,fu=0,t=8; if(dat<0){dat=-dat;fu=1;} h=(uint16)dat; m=(uint16)(dat*100-h*100); i=h/100;//取百位 j=h/10%10;//取十位 h%=10;//取个位 k=m/10; l=m%10; command_1(0xcf); command_1(0x04); if(l>0) {data_1('\%');data_1(l+'0');data_1(k+'0');data_1('.');data_1(h+'0');t-=5;} elseif(k>0){data_1('\%');data_1(k+'0');data_1('.');data_1(h+'0');t-=4;} else{data_1('%');data_1(h+'0');t-=2;} if(i||j){data_1(j+'0');t--;if(i){data_1(i+'0');t--;}} if(fu){data_1('-');t--;} write_space_1(t);}voiddisplay_2(void)//显示irrigation函数{ uint8a[]={"irrigation"},*p; command_1(0x06); command_1(0x80); p=a; while(*p!='\0') { data_1(*p); p++; delay_1(30000);//流水显示 }}/*======================== 蜂鸣器报警部分========================*/voidbuzz_1(uint8dat,uint16j)//报警函数{ uint8i=100; BUZZ=1; if(dat<8&&dat>=0)//判断是否报警 {while(j--) { while(i--)BUZZ=0;i=50; while(i--)BUZZ=1;i=1000; } BUZZ=1; }}/*============================= 电机部分=============================*/voidmotor_1()//步进电机函数{ chari,dat; uint8a[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; uint16j=300; while(j--)for(i=7;i>=0;i--)//电机正转 { P2=a[i]; delay_1(100);//延时 } j=50; P2=0; do { delay_1(2000);//延时 dat=data_Correction();//数据显示; }while(!(dat-15>=0)); j=300; while(j--)for(i=0;i<8;i++)//电机反转 { P2=a[i]; delay_1(100);//延时 } P2=0;}voidmotor_2(uint8dat)//判断是否浇灌{ uint8i=600; if((dat<8)&&(dat>=0))//判断是否需要浇水 { motor_1();//电机工作}}/*==================== 主函数====================*/voidmain(void){ floatdat; BUZZ=1; OE=0; P2=0; LCD_Initialize_1();//液晶初始化 display_2();//液晶显示界面 Initialize_2();//定时器初始化 while(1) { delay_1(2000);//延时 dat=data_Correction();//数据显示; buzz_1(dat,80);//判断是否报警 motor_2(dat);//判断是否浇灌 }}结论本系统根据目前节水灌溉技术的发展趋势和国内实际的应用特点和要求,采用了自动化的结构形式,实现对土壤湿度的自动检测和控制。系统以单片机STC89C52为核心部件,机单片机系统完成对土壤湿度信号的采集、处理、显示以及对执行机构的控制等功能;用Protel软件绘制电路原理图和PCB电路印刷板图,并在电路板厂制作控制主板;利用C语言编制运行程序,该系统的主要特点是:适用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论