基于单片机的自动滴灌控制系统的设计.docx
- 文档编号:3832589
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:18
- 大小:32.84KB
基于单片机的自动滴灌控制系统的设计.docx
《基于单片机的自动滴灌控制系统的设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的自动滴灌控制系统的设计.docx(18页珍藏版)》请在冰豆网上搜索。
基于单片机的自动滴灌控制系统的设计
课程名称:
单片机课程设计
设计项目:
基于单片机自动滴灌控制系统设
计
专业班级:
姓名(学号):
实验时间:
批阅时间:
指导教师:
成绩:
第一章绪论 ........................................3
1.1本设计任务和主要内容 .................................3
第二章硬件电路设计 ................................3
2.1单片机控制系统原理 ..................................3
2.2单片机主机系统电路 ..................................4
2.2.1 时钟电路............................................................4
2.2.2 复位电路............................................................5
2.3数据采集处理电路 ...................................5
2.4LED 显示系统电路 ....................................6
2.5超限报警电路 .......................................7
第三章系统的软件设计 .............................8
第四章总结 ......................................14
2
基于单片机的自动滴灌控制系统的设计
第一章绪论
1.1 本设计任务和主要内容
本论文主要研究基于单片机的自动滴灌控制系统,分别对土壤湿度与灌水
量之间的关系、滴灌控制技术及系统设备的软、硬件各个部分进行了研究。
主要内容如下:
1.根据滴灌技术的特点,进行节水灌溉控制系统的整体研究与设计。
2.土壤湿度变化使用 DHT11 型温湿度传感器采集,再对湿度传感器的输出信号
进行分析。
3 .数码管显示土壤湿度值。
4.使用步进电机控制阀门的开启或关闭。
5.当土壤湿度值低于设定的最低值时,系统可自动报警。
第二章硬件电路设计
2.1 单片机控制系统原理
本系统的设计方案是基于微控、无线数据接收和传感器测量技术,采用湿度传感器采
集土壤的湿度信息,根据采集的相应数据及农作物生长所需水分的需求量的设置,及时、
精确、高效地控制滴灌的水量。
系统根据传感器反馈的数据的大小控制滴灌的水量,使农
作物及时的获得所需的水分,控制过程中当滴灌到作物所需的水量时,系统会及时的关闭
水源的流入,这样则避免水资源的浪费,有效的实现节水灌溉的设计要求。
3
种植作物的土壤土壤湿度传感
90C51 单片机
数码管显示湿度LED 报警步进电机驱动阀门开启或关闭
图 1 单片机控制系统原理框图
2.2单片机主机系统电路
STC90C51 单片机是 STC 推出的新一代超强抗干扰、高速、低功耗的单片机,指令代码完全
兼容传统 8051 单片机,12 时钟/机器周期和 6 时钟/机器周期可以任意选择。
片上集成
1280 字节或 512 字节或 256 字节 RAM,共 3 个 16 位定时器/计数器,其中定时器 0 还可以
当成 2 个 8 位定时器使用,外部中断 4 路,下降沿中断或低电平触发中断,通用异步串行
口(UART),还可用定时器软件实现多个 UART,内部集成 MAX810 专用复位电路,当时钟频
率在 6MHz 时,该复位电路是可靠的;当时钟频率在 12MHz 时,勉强可用。
在要求不高的情
况下,可在复位脚外接电阻电容复位。
图 2 单片机主机系统图
4
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(湿度)。
5
图 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 不被损坏,
需外加限流电阻。
6
符号和引脚共阴极共阳极
图 5LED 数码管结构原理图:
数码管显示器有两种工作方式,即静态显示方式和动态扫描显示方式。
为节省端口及
降低功耗,本系统采用动态扫描显示方式。
动态扫描显示方式需要解决多位 LED 数码管的
“段控”和“位控”问题,本电路的通过 P1 口实现:
而每一位的公共端,即 LED 数码管的
“位控”,则由 P3 口控制。
这种连接方式由于多位字段线连在一起,因此,要想显示不同
的内容,必然要采取轮流显示的方式,即在某一瞬间,只让其中的某一位的字位线处于选
通状态,其它各位的字位线处于断开状态,同时字段线上输出这一位相应要显示字符的字
段码。
在这一瞬时,只有这一位在显示,其他几位则暗。
在本系统中,字位线的选通与否
是通过 PNP 三极管的导通与截止来控制,即三极管处于“开头”状态。
2.5 超限报警电路
为了在某些紧急状态或反常状态下,能使操作人员不致忽视,以便及时处理,往往需
要有某种更能引起人们注意提起警觉的报警信号产生,这种报警信号通常有三种类型:
闪光
报警、鸣音报警、语音报警,本系统采用简单易行的 LED 发光报警电路。
如图 6 所示报警电路,报警设备选用 LED 发光二极管,图中接入的发光二极管 LED
为超高限与超低限报警器,在湿度低于最低湿度或高于最高湿度时,二极管发光报警。
报
警设备选用 LED 发光二极管,图中发光二极管的一端接在高电平+5V,另一端分别接 P2.6
与 P2.7,当 P2.6、P2.7 端输出为低电平 0 时,二极管导通,灯亮发出报警信号。
7
图 6 报警电路
第三章系统的软件设计
#include
#include
//
typedef unsigned char U8;/* 无符号 8 位整型变量 */
typedef signedchar S8;/* 有符号 8 位整型变量 */
typedef unsigned intU16;/* 无符号 16 位整型变量 */
typedef signedintS16;/* 有符号 16 位整型变量 */
typedef unsigned long U32;/* 无符号 32 位整型变量 */
typedef signedlong S32;/* 有符号 32 位整型变量 */
typedef floatF32;/* 单精度浮点数(32 位长度)*/
typedef doubleF64;/* 双精度浮点数(64 位长度)*/
//
#define uchar unsigned char
#define uint unsigned int
#defineData_0_time4
sbit P2_0 = P2^0 ;
U8 U8FLAG;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8
U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_t
emp;
U8 U8comdata;
8
U8 outdata[5]; //定义发送的字节数
U8 indata[5];
U8 count, count_r=0;
U8 str[5]={0,0,0,0,0};
U16 U16temp1,U16temp2;
uchar LedOut[4];
//此表为 LED 的字模, 共阴数码管 0-9 -
unsignedcharcodeDisp_Tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
//此表为 8 个数码管位选控制, 共阴数码管 1-8 个 -
unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转
unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转
uint K;
sbit LS138A = P2^2;//定义 138 译码器的输入 A 脚由 P2.2 控制
sbit LS138B = P2^3;//定义 138 译码器的输入脚 B 由 P2.3 控制
sbit LS138C = P2^4;//定义 138 译码器的输入脚 C 由 P2.4 控制
//Motor
sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;
sbit led1=P2^7;
sbit led2=P2^6;
void Delay(U16 j)
{U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
9
/* 步进电机驱动 */
void motor_ffw()
{
unsigned char i;
unsigned int j;
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);//调节转速,速度太快会使电机只震动不转动
}
}
}
void COM(void)
{
U8 i;
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
}
10
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高 8 位== U8T_data_H------
//----温度低 8 位== U8T_data_L------
//----湿度高 8 位== U8RH_data_H-----
//----湿度低 8 位== U8RH_data_L-----
//----校验 8 位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
void RH(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();
11
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
}
void xianshi(uchar a)
{
uchar i;
//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 语句控制位选也可以是用查表的方式 学员可以试着自
己修改
{
case 0:
LS138A=0; LS138B=0; LS138C=0; break;
case 1:
LS138A=1; LS138B=0; LS138C=0; break;
//case 2:
LS138A=0; LS138B=1; LS138C=0; break;
}
}
//Delay(10);
}
void time0_init()//计数器初始化函数
{
12
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;
}
void main()
{
uchar m,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)
{
13
led1=1;
led2=1;
}
if((str[0]>60&&str[1]<=50)||(str[0]<60&&str[1]>=60))
{
flag=1;
}
else flag=0;
if(flag==1)
{
for(m=0;m<3;m++)
{
motor_ffw();
}
}
}
}
}
void ti() interrupt 1
{
TH0 = (65536-6000)/256;
TL0 = (65536-6000)%256;
xianshi(str[0]);
}
第四章 总结
通过本次设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计
产品的能力。
既让我们懂得了怎样把理论应用于实际,又让我们懂得了在实践中遇到的问
题怎样用理论去解决。
在设计过程中,总是遇到这样或那样的问题。
有时发现一个问题的
时候,需要做大量的工作,花大量的时间才能解决。
自然而然,我的耐心便在其中建立起
来了。
为以后的工作积累了经验,增强了信心
本文设计了基于单片机的自动滴灌控制系统,通过本次课程设计对单片机控制系统原理
有了进一步的了解,提高了科学的分析和运用能力,由于本人水平有限,因此对其中的原
理和实际操作方法有待深入的学习研究和提高。
14
指导教师评语:
成绩:
指导教师签字:
年月日
15
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 自动 滴灌 控制系统 设计