模拟灌溉系统.docx
《模拟灌溉系统.docx》由会员分享,可在线阅读,更多相关《模拟灌溉系统.docx(26页珍藏版)》请在冰点文库上搜索。
模拟灌溉系统
本页仅作为文档页封面,使用时可以删除
Thisdocumentisforreferenceonly-rar21year.March
模拟灌溉系统(总16页)
微机与单片机原理及应用
课程设计报告
题目:
模拟智能灌溉系统
学号:
110603136
姓名:
黄鑫
年级:
11级自动化
指导教师:
丛玉华
开课学期
教室
上交时间
成绩
大三上
实B303
2013-12-21
一、硬件部分
1、涉及芯片:
(1)、STC90C519RD+
基本功能
8位CPU·4kbytes程序存储器(ROM)(52为8K)
128bytes的数据存储器(RAM)(52有256bytes的RAM)
32条I/O口线·111条指令,大部分为单字节指令
21个专用寄存器
2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
一个全双工串行通信口
外部数据存储器寻址空间为64kB
外部程序存储器寻址空间为64kB
逻辑操作位寻址功能·双列直插40PinDIP封装
单一+5V电源供电
CPU:
由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:
用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:
用以存放程序、一些原始数据和表格;
I/O口:
四个8位并行I/O口,既可用作输入,也可用作输出
T/C:
两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。
最佳振荡频率为6M—12M。
引脚图
引脚功能
P0口有三个功能:
1、外部扩展存储器时,当做数据总线
2、外部扩展存储器时,当作地址总线
3、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。
、
P1口只做I/O口使用:
其内部有上拉电阻。
P2口有两个功能:
1、扩展外部存储器时,当作地址总线使用
2、做一般I/O口使用,其内部有上拉电阻;
P3口有两个功能:
除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置,
PSEN外部程序存储器读选通信号
ALE地址锁存控制信号
EA访问和序存储器控制信号
XTAL1和XTAL2外接晶振引脚。
当使用芯片内部时钟时,此二引脚用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。
VCC:
电源+5V输入
VSS:
GND接地
RST复位信号
(2)、74HC138
基本功能
HC138按照三位二进制输入码和赋能输入条件,从8个输出端中译出一个低电平输出。
真值表引脚图
引脚功能
(3)、DS1302
基本功能
74HC138可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能。
引脚图
引脚功能
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,
I/O引脚变为高阻态。
上电运行时,在Vcc>2.0V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向)。
SCLK为时钟输入端。
数据格式
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
(4)、PCF8591
基本功能
PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。
引脚图
引脚功能
AIN0~AIN3:
模拟信号输入端。
A0~A2:
引脚地址端。
VDD、VSS:
电源端。
(2.5~6V)SDA、SCL:
I2C总线的数据线、时钟线。
OSC:
外部时钟输入端,内部时钟输出端。
EXT:
内部、外部时钟选择线,使用内部时钟时EXT接地。
AGND:
模拟信号地。
AOUT:
D/A转换输出端。
VREF:
基准电源端。
数据格式
在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变。
SCL线是高电平时,SDA线从高电平向低电平切换,这个情况表示起始条件;
SCL线是高电平时,SDA线由低电平向高电平切换,这个情况表示停止条件。
(5)、24C02
基本功能
串行E2PROM是基于I2C-BUS的存储器件,遵循二线制协议,其具有接口方便,体积小,数据掉电不丢失等特点。
引脚图
引脚功能
A0,A1,A2:
器件地址选择SDA:
串行数据、地址SCL:
串行时钟
WP:
写保护Vcc:
1.8V-6.0V工作电压Vss:
地
数据格式
同上(PCF8591)
2、系统电路图:
二、软件部分
2、程序
#include
#include"i2c.h"
#include"ds1302.h"
#include
#defineGPIO_DIGP0//--定义使用的IO--//
//--定义PCF8591的读写地址--//
#defineWRITEADDR0x90//写地址
#defineREADADDR0x91//读地址
//74LS138定义
sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;
//独立按键
sbitS4=P1^0;
sbitS5=P1^1;
sbitS6=P1^2;
sbitS7=P1^3;
sbitLED_RED=P1^4;//红灯,手动模式
sbitLED_GREEN=P1^5;//绿灯,自动模式
sbitfengmingqi=P1^6;
sbitRELAY=P1^7;
bitflag_mode=0;
bitissetting=0;
ucharnum=50;
//--定义全局变量--//
unsignedcharcodeDIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsignedcharDisplayData[8];//用来存放要显示的8位数的值
unsignedchartable[8];//用来存放自动模式下设置界面
//--声明全局变量--//
voidDigDisplay();
voidDelay10ms(ucharc);
bitISendByte(unsignedcharsla,unsignedcharc);
unsignedcharIRcvByte(unsignedcharsla);
voidAt24c02Write(unsignedchar,unsignedchar);
unsignedcharAt24c02Read(unsignedchar);
voidTimer0Configuration();
voidKey_down();
/*****PCF8591**********/
voidPcf8591SendByte(unsignedcharchannel);
unsignedcharPcf8591ReadByte();
/*******************************************************************************
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
无
*******************************************************************************/
voidmain()
{
unsignedintadNum;
floatvalue;
LED_RED=0;LED_GREEN=0;
num=At24c02Read
(2);
Ds1302Init();
while
(1)
{
Pcf8591SendByte(0);//发送电位器转换命令
adNum=Pcf8591ReadByte();//将转换结果读走
value=adNum/2.55;
if(adNum>99)
adNum=99;
if(adNum>num)
{
RELAY=1;
fengmingqi=1;
}
else
{
RELAY=0;
fengmingqi=0;
}
Ds1302ReadTime();
Key_down();
DisplayData[0]=DIG_CODE[TIME[2]/16];//时
DisplayData[1]=DIG_CODE[TIME[2]&0x0f];
DisplayData[2]=0x40;
DisplayData[3]=DIG_CODE[TIME[1]/16];//分
DisplayData[4]=DIG_CODE[TIME[1]&0x0f];
DisplayData[5]=0x00;
DisplayData[6]=DIG_CODE[adNum/10];
DisplayData[7]=DIG_CODE[adNum%10];
table[0]=0x40;
table[1]=0x40;
table[2]=0x40;
table[3]=0x40;
table[4]=0x40;
table[5]=0x40;
table[6]=DIG_CODE[num/10];
table[7]=DIG_CODE[num%10];
DigDisplay();
}
}
/*******************************************************************************
*按键
*******************************************************************************/
voidKey_down()
{
ucharn=0;
if(S7==0)
{
Delay10ms
(1);
if(S7==0)
{
if(flag_mode==0)
flag_mode=1;
else
flag_mode=0;
}
while((n<50)&&(S7==0))
{
Delay10ms
(1);
n++;
}
n=0;
}
if(flag_mode)//手动模式
{
LED_RED=1;
LED_GREEN=0;
if(S6==0)
{
Delay10ms
(1);
if(S6==0)
{
fengmingqi=~fengmingqi;
}
while((n<50)&&(S6==0))
{
Delay10ms
(1);
n++;
}
n=0;
}
if(S5==0)
{
Delay10ms
(1);
if(S5==0)
{
RELAY=0;//打开灌溉系统
}
while((n<50)&&(S5==0))
{
Delay10ms
(1);
n++;
}
n=0;
}
if(S4==0)
{
Delay10ms
(1);
if(S4==0)
{
RELAY=1;//关闭灌溉系统
}
while((n<50)&&(S4==0))
{
Delay10ms
(1);
n++;
}
n=0;
}
if(adNum>num)
{
RELAY=1;
fengmingqi=1;
}
}
else//自动模式
{
LED_RED=0;LED_GREEN=1;
if(S6==0)
{
Delay10ms
(1);
if(S6==0)
{
issetting=~issetting;
}
while((n<50)&&(S6==0))
{
Delay10ms
(1);
n++;
}
n=0;
}
if(issetting)
{
if(S5==0)
{
Delay10ms
(1);
if(S5==0)
{
if(num<99)
num++;
}
while((n<50)&&(S5==0))
{
Delay10ms
(1);
n++;
}
n=0;
}
if(S4==0)
{
Delay10ms
(1);
if(S4==0)
{
if(num>0)
num--;
}
while((n<50)&&(S4==0))
{
Delay10ms
(1);
n++;
}
n=0;
}
}
else
{
At24c02Write(2,num);
}
if(adNum>num)
{
RELAY=1;
fengmingqi=1;
}
else
{
RELAY=0;
fengmingqi=0;
}
}
}
/*******************************************************************************
*函数名:
DigDisplay
*函数功能:
使用数码管显示
*输入:
无
*输出:
无
*******************************************************************************/
voidDigDisplay()
{
unsignedchari;
unsignedintj;
for(i=0;i<8;i++)
{
switch(i)//位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;break;//显示第0位
case
(1):
LSA=1;LSB=0;LSC=0;break;//显示第1位
case
(2):
LSA=0;LSB=1;LSC=0;break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0;break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1;break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1;break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1;break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1;break;//显示第7位
}
if(issetting)
{
GPIO_DIG=table[i];//发送段码
}
else
{
GPIO_DIG=DisplayData[i];//发送段码
}
j=50;//扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}
/*******************************************************************************
*函数名:
voidAt24c02Write(unsignedcharaddr,unsignedchardat)
*函数功能:
往24c02的一个地址写入一个数据
*输入:
无
*输出:
无
*******************************************************************************/
voidAt24c02Write(unsignedcharaddr,unsignedchardat)
{
I2C_Start();
I2C_SendByte(0xa0,1);//发送写器件地址
I2C_SendByte(addr,1);//发送要写入内存地址
I2C_SendByte(dat,0);//发送数据
I2C_Stop();
}
/*******************************************************************************
*函数名:
unsignedcharAt24c02Read(unsignedcharaddr)
*函数功能:
读取24c02的一个地址的一个数据
*输入:
无
*输出:
无
*******************************************************************************/
unsignedcharAt24c02Read(unsignedcharaddr)
{
unsignedcharnum;
I2C_Start();
I2C_SendByte(0xa0,1);//发送写器件地址
I2C_SendByte(addr,1);//发送要读取的地址
I2C_Start();
I2C_SendByte(0xa1,1);//发送读器件地址
num=I2C_ReadByte();//读取数据
I2C_Stop();
returnnum;
}
/*******************************************************************************
*函数名:
Pcf8591SendByte
*函数功能:
写入一个控制命令
*输入:
channel(转换通道)
*输出:
无
*******************************************************************************/
voidPcf8591SendByte(unsignedcharchannel)
{
I2C_Start();
I2C_SendByte(WRITEADDR,1);//发送写器件地址
I2C_SendByte(0x40|channel,0);//发送控制寄存器
I2C_Stop();
}
/*******************************************************************************
*函数名:
Pcf8591ReadByte
*函数功能:
读取一个转换值
*输入:
无
*输出:
dat
*******************************************************************************/
unsignedcharPcf8591ReadByte()
{
unsignedchardat;
I2C_Start();
I2C_SendByte(READADDR,1);//发送读器件地址
dat=I2C_ReadByte();//读取数据
I2C_Stop();//结束总线
returndat;
}
voidDelay10ms(ucharc)
{
uchara,b;
for(;c>0;c--)
{
for(b=38;b>0;b--)
{
for(a=130;a>0;a--);
}}
}
三、系统说明手册
功能简述:
要求“模拟智能灌溉系统”能够实现土壤湿度测量、土壤湿度和时间显示、湿度阈值设定及存储等基本功能。
通过电位器Rb2输出电压信号,模拟湿度传感器输出信号,再通过AD采集完成湿度测量功能;通过DS1302芯片提供时间信息;通过按键完成灌溉系统控制和湿度阈值调整功能,通过LED完成系统工作状态指示功能。
系统硬件电路主要由单片机控制电路、显示单元、ADC采集单元、RTC单元、EEPROM存储单元、继电器控制电路及报警输出电路组成,系统框图如图1所示:
1.系统工作及初始化状态说明
1.1、自动工作状态,根据湿度数据自动控制打开或关闭灌溉设备,以L1点亮指示;
1.2、手动工作状态,通过按键控制打开或关闭灌溉设备,以L2点亮指示;
1.3、系统上电后处于自动工作状态,系统初始湿度阈值为50%,此时若湿度低于50%,灌溉设备自动打开,达到50%后,灌溉设备自动关闭;
1.4、灌溉设备打开或关闭通过继电器工作状态模拟。
2.数码管单元
“模拟智能灌溉系统”通过读取DS1302时钟芯片相关寄存器获得时间,DS1302芯片时、分、秒寄存器在程序中设定为系统进行初始化设定,时间为08时30分。
3.报警输出单元
系统工作于手动工作状态下时,若当前湿度低于湿度阈值,蜂鸣器发出提示音,并可通过按键S6关闭提醒功能。
4.