基于单片机的自动滴灌控制系统的设计.docx
- 文档编号:7609138
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:15
- 大小:259.99KB
基于单片机的自动滴灌控制系统的设计.docx
《基于单片机的自动滴灌控制系统的设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的自动滴灌控制系统的设计.docx(15页珍藏版)》请在冰豆网上搜索。
基于单片机的自动滴灌控制系统的设计
课程名称:
单片机课程设计
设计项目:
基于单片机自动滴灌控制系统设计
专业班级:
姓名(学号):
实验时间:
批阅时间:
指导教师:
成绩:
基于单片机的自动滴灌控制系统的设计
第一章绪论
1.1本设计任务和主要内容
本论文主要研究基于单片机的自动滴灌控制系统,分别对土壤湿度与灌水量之间的关系、滴灌控制技术及系统设备的软、硬件各个部分进行了研究。
主要内容如下:
1.根据滴灌技术的特点,进行节水灌溉控制系统的整体研究与设计。
2.土壤湿度变化使用DHT11型温湿度传感器采集,再对湿度传感器的输出信号进行分析。
3.数码管显示土壤湿度值。
4.使用步进电机控制阀门的开启或关闭。
5.当土壤湿度值低于设定的最低值时,系统可自动报警。
第二章硬件电路设计
2.1单片机控制系统原理
本系统的设计方案是基于微控、无线数据接收和传感器测量技术,采用湿度传感器采集土壤的湿度信息,根据采集的相应数据及农作物生长所需水分的需求量的设置,及时、精确、高效地控制滴灌的水量。
系统根据传感器反馈的数据的大小控制滴灌的水量,使农作物及时的获得所需的水分,控制过程中当滴灌到作物所需的水量时,系统会及时的关闭水源的流入,这样则避免水资源的浪费,有效的实现节水灌溉的设计要求。
图1单片机控制系统原理框图
2.2单片机主机系统电路
STC90C51单片机是STC推出的新一代超强抗干扰、高速、低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。
片上集成1280字节或512字节或256字节RAM,共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用,外部中断4路,下降沿中断或低电平触发中断,通用异步串行口(UART),还可用定时器软件实现多个UART,内部集成MAX810专用复位电路,当时钟频率在6MHz时,该复位电路是可靠的;当时钟频率在12MHz时,勉强可用。
在要求不高的情况下,可在复位脚外接电阻电容复位。
图2单片机主机系统图
2.2.1时钟电路
单片机的时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:
内部振荡和外部振荡。
MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTALl和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,如图2所示在其外接晶体振荡器(简称晶振)或陶瓷谐振器就构成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲。
图3中外接晶体以及电容C2和C1构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值均为30P左右,晶振频率选6MHz。
2.2.2复位电路
为了初始化单片机内部的某些特殊功能寄存器,必须采用复位的方式,复位后可使CPU及系统各部件处于确定的初始状态,并从初始状态开始正常工作。
单片机的复位是靠外电路来实现的,在正常运行情况下,只要RST引脚上出现两个机器周期时间以上的高电平,即可引起系统复位,但如果RST引脚上持续为高电平,单片机就处于循环复位状态。
复位后系统将输入/输出(1/0)端口寄存器置为FFH,堆栈指针SP置为07H,SBUF内置为不定值,其余的寄存器全部清0,内部RAM的状态不受复位的影响,在系统上电时RAM的内容是不定的。
复位操作有两种情况,即上电复位和手动(开关)复位。
本系统采用上电复位方式。
图2中R9和Cl组成上电复位电路,其值R取为1KQ,C取为1pF.
2.3数据采集电路(数字温湿度传感器DHT11)
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
每个DHT11传感器都在极为精确的湿度校验室中进行校准。
校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。
单线制串行接口,使系统集成变得简易快捷。
超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。
产品为4针单排引脚封装。
连接方便,特殊封装形式可根据用户需求而提供。
测量分辨率分别为8bit(温度)、8bit(湿度)。
图3
2.4LED显示系统电路
微机化测控系统中常用的测量数据的显示器有发光二极管显示器(简称LED或数码管)和液晶显示器(简称LCD)。
这两种显示器都具有线路简单、耗电少、成本低、寿命长等优点,本系统输出结果选用4个LED显示。
数码管有共阴共阳之分,本系统采用8段共阴型LED,其原理图如图6所示,每位数码管内部有8个发光二极管,公共端由8个发光二极管的阴极并接而成,正常显示时公共端接低电平(GND),各发光二极管是否点亮取决于a-dp各引脚上是否是高电平。
LED数码管的外形结构如图6,外部有10个引脚,其中3,8脚为公共端也称位选端,其余8个引脚称为段选端,当要使某一位数码管显示某一数字((0-9中的一个)必须在这个数码管的段选端加上与数字显示数字对应的8位段选码(也称字形码),在位选端加上低电平即可。
由于系统要显示的内容比较简单,显示量不多,所以选用数码管既方便又经济。
LED有共阴极和共阳极两种。
如图5所示。
二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。
一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。
当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。
为了保护各段LED不被损坏,需外加限流电阻。
符号和引脚共阴极共阳极
图5LED数码管结构原理图:
数码管显示器有两种工作方式,即静态显示方式和动态扫描显示方式。
为节省端口及降低功耗,本系统采用动态扫描显示方式。
动态扫描显示方式需要解决多位LED数码管的“段控”和“位控”问题,本电路的通过P1口实现:
而每一位的公共端,即LED数码管的“位控”,则由P3口控制。
这种连接方式由于多位字段线连在一起,因此,要想显示不同的内容,必然要采取轮流显示的方式,即在某一瞬间,只让其中的某一位的字位线处于选通状态,其它各位的字位线处于断开状态,同时字段线上输出这一位相应要显示字符的字段码。
在这一瞬时,只有这一位在显示,其他几位则暗。
在本系统中,字位线的选通与否是通过PNP三极管的导通与截止来控制,即三极管处于“开头”状态。
2.5超限报警电路
为了在某些紧急状态或反常状态下,能使操作人员不致忽视,以便及时处理,往往需要有某种更能引起人们注意提起警觉的报警信号产生,这种报警信号通常有三种类型:
闪光报警、鸣音报警、语音报警,本系统采用简单易行的LED发光报警电路。
如图6所示报警电路,报警设备选用LED发光二极管,图中接入的发光二极管LED为超高限与超低限报警器,在湿度低于最低湿度或高于最高湿度时,二极管发光报警。
报警设备选用LED发光二极管,图中发光二极管的一端接在高电平+5V,另一端分别接P2.6与P2.7,当P2.6、P2.7端输出为低电平0时,二极管导通,灯亮发出报警信号。
图6报警电路
第三章系统的软件设计
#include
#include
//
typedefunsignedcharU8;/*无符号8位整型变量*/
typedefsignedcharS8;/*有符号8位整型变量*/
typedefunsignedintU16;/*无符号16位整型变量*/
typedefsignedintS16;/*有符号16位整型变量*/
typedefunsignedlongU32;/*无符号32位整型变量*/
typedefsignedlongS32;/*有符号32位整型变量*/
typedeffloatF32;/*单精度浮点数(32位长度)*/
typedefdoubleF64;/*双精度浮点数(64位长度)*/
//
#defineucharunsignedchar
#defineuintunsignedint
#defineData_0_time4
sbitP2_0=P2^0;
U8U8FLAG;
U8U8count,U8temp;
U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8U8comdata;
U8outdata[5];//定义发送的字节数
U8indata[5];
U8count,count_r=0;
U8str[5]={0,0,0,0,0};
U16U16temp1,U16temp2;
ucharLedOut[4];
//此表为LED的字模,共阴数码管0-9-
unsignedcharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段码控制
//此表为8个数码管位选控制,共阴数码管1-8个-
unsignedcharcodeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};//反转
unsignedcharcodeFFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};//正转
uintK;
sbitLS138A=P2^2;//定义138译码器的输入A脚由P2.2控制
sbitLS138B=P2^3;//定义138译码器的输入脚B由P2.3控制
sbitLS138C=P2^4;//定义138译码器的输入脚C由P2.4控制
//Motor
sbitF1=P1^0;
sbitF2=P1^1;
sbitF3=P1^2;
sbitF4=P1^3;
sbitled1=P2^7;
sbitled2=P2^6;
voidDelay(U16j)
{U8i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
voidDelay_10us(void)
{
U8i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/*步进电机驱动*/
voidmotor_ffw()
{
unsignedchari;
unsignedintj;
for(j=0;j<12;j++)//转1*n圈
{
for(i=0;i<8;i++)//一个周期转30度
{
if(K==1)P1=FFW[i]&0x0f;//取数据
if(K==2)P1=FFZ[i]&0x0f;
Delay(10);//调节转速,速度太快会使电机只震动不转动
}
}
}
voidCOM(void)
{
U8i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!
P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
U8comdata<<=1;
U8comdata|=U8temp;//0
}//rof
}
//--------------------------------
//-----湿度读取子程序------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位==U8T_data_H------
//----温度低8位==U8T_data_L------
//----湿度高8位==U8RH_data_H-----
//----湿度低8位==U8RH_data_L-----
//----校验8位==U8checkdata-----
//----调用相关子程序如下----------
//----Delay();,Delay_10us();,COM();
//--------------------------------
voidRH(void)
{
//主机拉低18ms
P2_0=0;
Delay(80);
P2_0=1;
//总线由上拉电阻拉高主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入判断从机响应信号
P2_0=1;
//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!
P2_0)//T!
{
U8FLAG=2;
//判断从机是否发出80us的低电平响应信号是否结束
while((!
P2_0)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
while((P2_0)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
}//fi
}
voidxianshi(uchara)
{
uchari;
//LedOut[0]=Disp_Tab[a/1000];
//LedOut[2]=Disp_Tab[a/100];
LedOut[1]=Disp_Tab[a%100/10];
LedOut[0]=Disp_Tab[a%10];
for(i=0;i<3;i++)//实现4位动态扫描循环
{
P0=LedOut[i];//将字模送到P0口显示
Delay
(2);
switch(i)//使用switch语句控制位选也可以是用查表的方式学员可以试着自己修改
{
case0:
LS138A=0;LS138B=0;LS138C=0;break;
case1:
LS138A=1;LS138B=0;LS138C=0;break;
//case2:
LS138A=0;LS138B=1;LS138C=0;break;
}
}
//Delay(10);
}
voidtime0_init()//计数器初始化函数
{
TMOD=0x01;//计数器0工作在方式模式1
TH0=(65536-800)/256;//晶振是11.0592,产生PCA时钟为1.3824M
TL0=(65536-800)%256;
//TH0=(65536-6556)/256;//晶振是11.0592,产生PCA时钟为1.3824M
//TL0=(65536-6536)%256;
//AUXR=0xC0;//计数器均工作在1T模式。
计数频率11.0592M
ET0=1;//开中计数器0断
TR0=1;//开启计数器0
EA=1;
}
voidmain()
{
ucharm,flag=0,n;
time0_init();
while
(1)
{for(n=0;n<2;n++)
{
RH();
str[n]=U8RH_data_H;
//str[1]=U8RH_data_L;
//str[2]=U8T_data_H;
//str[3]=U8T_data_L;
//str[4]=U8checkdata;
Delay(20000);
xianshi(str[n]);
if(str[n]<50)
{
K=1;
led1=0;
led2=1;
}
if(str[n]>60)
{
K=2;
led1=1;
led2=0;
}
if(str[n]>50&&str[n]<60)
{
led1=1;
led2=1;
}
if((str[0]>60&&str[1]<=50)||(str[0]<60&&str[1]>=60))
{
flag=1;
}
elseflag=0;
if(flag==1)
{
for(m=0;m<3;m++)
{
motor_ffw();
}
}
}
}
}
voidti()interrupt1
{
TH0=(65536-6000)/256;
TL0=(65536-6000)%256;
xianshi(str[0]);
}
第四章总结
通过本次设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。
既让我们懂得了怎样把理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。
在设计过程中,总是遇到这样或那样的问题。
有时发现一个问题的时候,需要做大量的工作,花大量的时间才能解决。
自然而然,我的耐心便在其中建立起来了。
为以后的工作积累了经验,增强了信心
本文设计了基于单片机的自动滴灌控制系统,通过本次课程设计对单片机控制系统原理有了进一步的了解,提高了科学的分析和运用能力,由于本人水平有限,因此对其中的原理和实际操作方法有待深入的学习研究和提高。
指导教师评语:
成绩:
指导教师签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 自动 滴灌 控制系统 设计