模拟灌溉系统.docx

上传人:b****8 文档编号:9681493 上传时间:2023-05-20 格式:DOCX 页数:26 大小:749.83KB
下载 相关 举报
模拟灌溉系统.docx_第1页
第1页 / 共26页
模拟灌溉系统.docx_第2页
第2页 / 共26页
模拟灌溉系统.docx_第3页
第3页 / 共26页
模拟灌溉系统.docx_第4页
第4页 / 共26页
模拟灌溉系统.docx_第5页
第5页 / 共26页
模拟灌溉系统.docx_第6页
第6页 / 共26页
模拟灌溉系统.docx_第7页
第7页 / 共26页
模拟灌溉系统.docx_第8页
第8页 / 共26页
模拟灌溉系统.docx_第9页
第9页 / 共26页
模拟灌溉系统.docx_第10页
第10页 / 共26页
模拟灌溉系统.docx_第11页
第11页 / 共26页
模拟灌溉系统.docx_第12页
第12页 / 共26页
模拟灌溉系统.docx_第13页
第13页 / 共26页
模拟灌溉系统.docx_第14页
第14页 / 共26页
模拟灌溉系统.docx_第15页
第15页 / 共26页
模拟灌溉系统.docx_第16页
第16页 / 共26页
模拟灌溉系统.docx_第17页
第17页 / 共26页
模拟灌溉系统.docx_第18页
第18页 / 共26页
模拟灌溉系统.docx_第19页
第19页 / 共26页
模拟灌溉系统.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

模拟灌溉系统.docx

《模拟灌溉系统.docx》由会员分享,可在线阅读,更多相关《模拟灌溉系统.docx(26页珍藏版)》请在冰点文库上搜索。

模拟灌溉系统.docx

模拟灌溉系统

本页仅作为文档页封面,使用时可以删除

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.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2