13010316 基于51单片机的浇水系统设计 郑佳源Word文件下载.docx
- 文档编号:21304207
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:25
- 大小:1.14MB
13010316 基于51单片机的浇水系统设计 郑佳源Word文件下载.docx
《13010316 基于51单片机的浇水系统设计 郑佳源Word文件下载.docx》由会员分享,可在线阅读,更多相关《13010316 基于51单片机的浇水系统设计 郑佳源Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
15
四.设计结果18
五.分析及反思18
第一章.基于单片机的浇花系统设计
摘
要
本次设计的基于单片机的浇水系统包括土壤湿度的检测与分析和水泵出水浇花。
土壤湿度的检测与分析部分又包括了土壤湿度的检测和显示、分析土壤是处于缺水状态还是正常状态。
土壤湿度的检测和显示以土壤湿度传感器为感应部件,将检测到的土壤湿度值送入AT89S52单片机,再由其输出到LCD屏进行显示。
水泵出水系统原设计为LCD显示缺水时输出高电平使水泵运转。
但本次实验用了潜水器代替水泵,无法与继电器相配合使用。
一.设计背景及目的
现实生活中,我们在家中种植花草来给生活增添绿色和活力。
但是,花草经常因为无人浇水或者浇水过多而导致花草死亡。
因此,我想通过设计一种包含土壤湿度传感器、LCD、继电器和AD转换模块的自动浇花系统。
让盆花在人们无暇照顾时也能得到及时的浇灌。
二.设计原理
2.1AT89S52
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2.2土壤湿度传感器
图2-1土壤湿度传感器
图2-2土壤湿度传感器模块部分
接线说明(4线制):
1VCC外接3.3V-5V;
2GND外接GND;
3DO小板数字量输出接口(0和1);
4AO小板电压模拟量输出。
模块使用说明:
1.传感器适用于土壤的湿度检测;
2.模块中蓝色的电位器是用于土壤湿度的阀值调节,顺时针调节,控制的湿度会越大,逆时针越小;
3.数字量输出D0可以与单片机直接相连,通过单片机来检测高低电平,由此来检测土壤湿度;
4小板模拟量输出AO可以和AD模块相连,通过AD转换,可以获得土壤湿度更精确的数值。
2.3液晶显示器LCD
液晶显示器是一种低功耗液晶显示器件。
工作电流小,适合于仪表和低功耗系统。
常用的有笔画型液晶显示器、点阵字符型液晶显示器和图形点阵式液晶显示器。
LCD液晶显示器的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,。
有电就显示黑色,这样就显示出图形。
液晶显示器适应于大规模电路直接驱动,易于实现全彩色显示的特点。
目前被广泛应用于计算机,数字摄像机等众多领域。
2.4AD模数转换模块
图2-3AY4135数模转换模块
2.5潜水器
图2-4水泵用5W潜水器代替
三.设计内容
3.1浇水系统设计框图
LCD显示屏
单
片
机
AT89C51
电源
按键部分
驱动器件
传感器
阀门
图3-1浇水系统设计框图
3.2浇水系统程序
#include<
stc12.h>
//WD代表与温度有关
math.h>
//SD代表与湿度有关
stdio.h>
//GZ代表与关照有关
intrins.h>
//YJ代表与液晶有关
#defineuintunsignedint//宏定义
#defineucharunsignedchar
#defineSlaveAddress0x46//定义器件在IIC总线中的从地址
typedefunsignedcharBYTE;
BYTEBUF[8];
//光照接收数据缓存区
sbitlcdrs=P1^0;
//数据或者命令选择端
sbitRW=P1^1;
//数据读写选择
sbitlcden=P1^2;
//使能信hao
sbitled1=P1^4;
//喜阳模式亮
sbitled2=P1^5;
//喜阴模式亮
sbitSCL=P2^5;
//IIC时钟引脚定义
sbitSDA=P2^6;
//IIC数据引脚定义
sbitDQ=P2^7;
//DS18B20温度传感器的信号线
sbitzhuan=P3^0;
//继电器控制
sbitbeep=P3^1;
//蜂鸣器
sbitkey1=P3^2;
//按键1
sbitkey2=P3^3;
//按键2
sbitled=P1^7;
//湿度指示灯
uintdata_GZ,data_SD,data_WD,SDH,SDL,GZ,WD,SD;
//全局变量
ucharwanGZ,qianGZ,baiGZ,shiGZ,geGZ,shiSD,geSD,baiWD,shiWD,geWD;
ucharcodenum[]={"
0123456879"
};
ucharcodetype[]={"
XIYINXIYANGWDSDGZ:
%'
C"
//液晶,延时及判断模式的函数的声明
voidwrite_com(ucharcom);
//液晶写命令
voidwrite_data(uchardate);
//液晶写数据
voidInitYJ();
voidmoshi();
//液晶初始化
voiddeal();
//判断温度。
湿度,光照
voiddelay_us(uint);
//延时一微妙
voiddelay_ms(uint);
//延时一毫秒
//光照部分有关函数的声明
voidBH1750_Start();
//起始信号
voidBH1750_Stop();
//停止信号
voidBH1750_SendACK(bitack);
//应答ACK
bitBH1750_RecvACK();
//读ACK
voidBH1750_SendByte(BYTEdat);
//IIC单个字节写
BYTEBH1750_RecvByte();
//IIC单个字节读
voidSingle_Write_BH1750(ucharREG_Address);
//单个写入数据
voidMultiple_read_BH1750(void);
//连续的读取内部寄存
uintgetdata_GZ();
//读取光照的数据
voidshow_GZ();
//在液晶上显示光照
//湿度部分有关函数的声明
voidinitADC();
//初始化AD转换
uintgetdata_SD();
//读取湿度的数据
voidshow_SD();
//在液晶上显示湿度
//温度部分有关函数的声明
voidInit_DS18B20();
//初始化DS18B20
ucharReadOneChar();
//读一位数据
voidWriteOneChar(uchardat);
//写入数据
voidshow_WD();
//在液晶上显示温度
uintReadTemp(void);
//读取温度数据
voidmain()//主函数
{
InitYJ();
//初始化液晶
while
(1)
{
moshi();
//模式选择
show_GZ();
//光照显示
show_WD();
//温度显示
show_SD();
//湿度显示
deal();
//处理函数
}
}
//液晶的部分
voidwrite_com(ucharcom)//写命令的状态
{
lcdrs=0;
//选择写命令模式
P0=com;
//将要写入的命令送到数据总线上
delay_ms(5);
//稍作延时以待数据稳定
lcden=1;
//
//
lcden=0;
voidwrite_data(uchardate)//写数据的状态
lcdrs=1;
//写数据
P0=date;
//p0使显示数据总线
voidInitYJ()//初始化的状态
{RW=0;
write_com(0x38);
//设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);
//设置开显示,不显示光标
write_com(0x06);
//写一个字符后地址自动加1
write_com(0x01);
//清除所有
write_com(0x80);
//光照的部分
voidBH1750_Start()//起始信号
SDA=1;
//拉高数据线
SCL=1;
//拉高时钟线
delay_us(5);
//延时
SDA=0;
//产生下降沿
SCL=0;
//拉低时钟线
voidBH1750_Stop()//停止信号
//拉低数据线
//产生上升沿
voidBH1750_SendACK(bitack)//发送应答信号
SDA=ack;
//写应答信号
bitBH1750_RecvACK()//接收应答信号
CY=SDA;
//读应答信号
returnCY;
voidBH1750_SendByte(BYTEdat)//向IIC总线发送一个字节数据
BYTEi;
for(i=0;
i<
8;
i++)//8位计数器
{
dat<
<
=1;
//移出数据的最高位
SDA=CY;
//送数据口
BH1750_RecvACK();
BYTEBH1750_RecvByte()//从IIC总线接收一个字节数据
BYTEdat=0;
//使能内部上拉,准备读取数据,
dat|=SDA;
//读数据
returndat;
voidSingle_Write_BH1750(ucharREG_Address)
BH1750_Start();
//起始信号
BH1750_SendByte(SlaveAddress);
//发送设备地址+写信号
BH1750_SendByte(REG_Address);
//内部寄存器地址
BH1750_Stop();
//发送停止信号
voidMultiple_read_BH1750(void)//连续读出BH1750内部数据
{uinti;
BH1750_SendByte(SlaveAddress+1);
//发送设备地址+读信号
3;
i++)//连续读取6个地址数据,存储中BUF
BUF[i]=BH1750_RecvByte();
//BUF[0]存储0x32地址中的数据
if(i==3)
BH1750_SendACK
(1);
//最后一个数据需要回NOACK
else
{
BH1750_SendACK(0);
//回应ACK
//停止信号
uintgetdata_GZ()//
{
Single_Write_BH1750(0x01);
//初始化BH1750
//上电
Single_Write_BH1750(0x10);
//置高
delay_ms(6000);
Multiple_read_BH1750();
//连续读出数据,存储在BUF中
data_GZ=BUF[0];
data_GZ=(data_GZ<
8)+BUF[1];
//合成数据
data_GZ=(uint)data_GZ/1.2;
returndata_GZ;
voidshow_GZ()//
i=getdata_GZ();
;
wanGZ=i/10000;
//计算数据的万千百十个位
qianGZ=i%10000/1000;
baiGZ=i%10000%1000/100;
shiGZ=i%10000%1000%100/10;
geGZ=i%10000%1000%100%10;
write_com(0x80+0x08);
write_data(type[15]);
write_data(type[16]);
write_data(type[17]);
write_data(num[wanGZ]);
write_data(num[qianGZ]);
write_data(num[baiGZ]);
write_data(num[shiGZ]);
write_data(num[geGZ]);
//湿度有关的部分
voidinitADC()//
P1ASF=0x08;
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR=0x80;
delay_ms(16);
uintgetdata_SD()//
initADC();
ADC_CONTR=0x8b;
//代表10001011
_nop_();
//等待四个NOP
while(!
(ADC_CONTR&
0x10));
//验证是否完成ADC转换
ADC_CONTR&
=~0x10;
//关闭ADC
data_SD=ADC_RES;
data_SD|=ADC_RES;
//转化为十进制
data_SD<
=2;
data_SD|=ADC_RESL;
data_SD=((data_SD*460)/1024);
returndata_SD;
voidshow_SD()//
{uinti,m=0,n;
for(i=0;
i<
100;
i++)//取一百次平均值
n=getdata_SD();
m=m+n;
//i=getdata_SD();
i=m/100;
shiSD=i/10;
geSD=i%10;
write_com(0x80+0x40);
write_data(type[13]);
write_data(type[14]);
write_data(num[shiSD]);
write_data(num[geSD]);
write_data(type[18]);
//温度部分
voidInit_DS18B20(void)//
ucharx=0;
DQ=1;
//DQ复位
delay_us(80);
//稍做延时
DQ=0;
//单片机将DQ拉低
delay_us(800);
//精确延时大于480us
//拉高总线
delay_us(140);
x=DQ;
delay_us(200);
ucharReadOneChar(void)//
uchari=0;
uchardat=0;
for(i=8;
i>
0;
i--)
//给脉冲信号
dat>
>
=1;
if(DQ)
dat|=0x80;
delay_us(40);
//40
return(dat);
voidWriteOneChar(uchardat)//
i--)
DQ=dat&
0x01;
delay_us(50);
//50
uintReadTemp(void)//
uchara=0;
ucharb=0;
uinttemp_value=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
delay_us(1000);
WriteOneChar(0xBE);
a=ReadOneChar();
//读取温度值低位
b=ReadOneChar();
//读取温度值高位
temp_value=b<
temp_value|=a;
temp_value=temp_value*0.062;
data_WD=temp_value;
returndata_WD;
voidshow_WD()//
{uintt;
t=ReadTemp();
baiWD=t/100;
shiWD=t%100/10;
geWD=t%100%10;
write_com(0x80+0x47);
write_data(type[11]);
write_data(type[12]);
write_data(num[baiWD]);
write_data(num[shiWD]);
write_data(num[geWD]);
write_data(type[19]);
write_data(type[20]);
//模式选择函数
voidmoshi()
{uintx;
if(key1==0)//喜阳模式
for(x=5;
x<
11;
x++)
write_data(type[x]);
WD=37;
GZ=500;
SD=50;
led1=0;
led2=1;
if(key2==0)//喜阴模式
for(x=0;
5;
WD=32;
GZ=200;
SD=20;
led1=1;
led2=0;
//判断函数
voiddeal()
if(data_GZ>
GZ||data_WD>
WD)
beep=0;
beep=1;
if(data_SD<
SD)
{led=0;
zhuan=0;
{led=1;
zhuan=1;
//延时的部分
voiddelay_us(uinti)//一微妙延时
while(i--);
voiddelay_ms(uintz)//一毫秒延时
uintx,y;
f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 13010316 基于51单片机的浇水系统设计 郑佳源 基于 51 单片机 浇水 系统 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)