《基于52单片机的自动浇灌系统_毕业设计论文(27页).doc》由会员分享,可在线阅读,更多相关《基于52单片机的自动浇灌系统_毕业设计论文(27页).doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于52单片机的自动浇灌系统_毕业设计论文-第 27 页实 践 教 学 目 标 实 践 报 告20132014(1)学期 项目: 自动浇灌系统 班级: 学号: 姓名: 时间: 2013 年 9 月 9 日 2013 年10 月 14 日 指导教师: 制定日期: 2013.9.16 1. 任务和要求a. 概述 主要是以51单片机80c52为主控芯片,利用DALAS一线式温度传感器DS18B20实现对周围温度环境的采集,单片机再根据采集的温度值来控制电磁阀的开关及持续时间等操作,从而实现在不同的温度对周围浇灌对象实施间隔性的灌溉,浇灌持续的时间与不同的温度范围有关,同时相关的状态信息要在点阵汉字
2、液晶屏上实时的显示。b.功能(1)汉字液晶屏上实时显示的信息有:(见图1)1.第一行显示:制动浇灌系统;2.第二行显示:低温:*.*,或常温:*.*,或高温:*.* 。注:假设24以下为低温,2535为常温,35以上为高温。电磁阀状态:开,或关。3.第三行显示:时间:*时*分*秒。4.第四行显示:浇灌次数。a可以显示设置的界面b可以查看低、常、高温的值和浇灌时间及间隔时间c可以设置的低、常、高温的值和浇灌时间及间隔时间目的是为了实现浇灌c. 性能使得浇灌器在低温时,电磁阀始终关,浇灌时间为0分0秒;在常温时,浇灌时间为30分钟,浇灌次数间隔为8小时;在高温时,浇灌时间为50分钟,浇灌次数间隔为
3、4小时。从低温进入常温,浇灌时间为30分钟,浇灌次数间隔为8小时;蜂鸣器响 从常温进入高温时,浇灌时间为50分钟,浇灌次数间隔为4小时。蜂鸣器响从高温进入常温,浇灌时间为30分钟,浇灌次数间隔为8小时;蜂鸣器响 从常温进入低温时,浇灌时间为0分0秒,阀关闭。蜂鸣器响d. 接口(软件、硬件)2.方案(思路)a) 总的思考利用DALAS一线式温度传感器DS18B20实现对周围温度环境的采集,单片机再根据采集的温度值来控制电磁阀的开关及发出声音,实现在不同的温度对周围浇灌对象实施间隔性的灌溉,浇灌持续的时间与不同的温度范围有关,同时相关的状态信息在点阵汉字液晶屏上实时的显示b.CPU选择80C52;
4、c.硬件选择;水阀开关 蜂鸣器 继电器 液晶显示器(TG12864B) 电源 电线;d.开发和测试环境Keil 2;Proteus;e.系统框架图和系统功能说明浇灌系统水阀处理(根据温度来控制水阀开关)浇灌处理(根据不同温度来控制灌溉时间)显示(将一些信息显示到屏幕)蜂鸣器(提醒浇灌进行)温度仪(感应周边温度)温度传感器DS18B20液晶显示器80C51阀门控制水阀功能说明:使得浇灌器在低温时,电磁阀始终关,浇灌时间为0分0秒;在常温时,浇灌时间为30分钟,浇灌次数间隔为8小时;在高温时,浇灌时间为50分钟,浇灌次数间隔为4小时。从低温进入常温,浇灌时间为30分钟,浇灌次数间隔为8小时;蜂鸣器
5、响兰花草 从常温进入高温时,浇灌时间为50分钟,浇灌次数间隔为4小时。蜂鸣器响兰花草从高温进入常温,浇灌时间为30分钟,浇灌次数间隔为8小时;蜂鸣器响兰花草从常温进入低温时,浇灌时间为0分0秒,阀关闭。蜂鸣器响兰花草f.接口概述MCU/P继电器水阀温度传感器显示器蜂名器g开发计划序号任务内容负责人计划开始时间计划结束时间实际开始时间实际结束时间1任务和要求概述,功能,性能,接口刘路2013.9.092013.9.092013.9.10.2013.9.102方案总的思考 软硬件选择 开发和测试环境 系统框架图和系统功能说明 接口概述 开发计划刘路2013.9.10.2013.9.102013-9
6、-122013-9-123系统设计列出所需要的硬件软件电路及功能状态图 刘路2013.9.122013.9.122013.9.172013.9.174详细设计将主体程序分解成各个功能模块 列出各模块的功能所需刘路2013.9.172013.9.172013.9.232013.9.235编码依照详细设计所考虑的思路 进行编码 刘路2013.9.232013.9.232013.10.122013.10.86系统测试利用Proteus进行仿真 通过控制DS18B20的值 测试程序在各个温度下 显示 浇灌 时间 功能是否完整 有无错误刘路2013.10.122013.10.82013.10.17201
7、3.10.123.系统设计a) 硬件设计i. 框图温度传感器DS18B20液晶显示器80C51阀门控制水阀ii. 功能描述硬件设计主要包括:DS18B20温度采集模块:用于温度采集;汉字液晶屏显示状态信息模块:用于将相关信息显示出来;将数字温度传感器DS18B20并接在一起,数据线与单片机的P1.0相连,液晶显示器与单片机的连接采用模拟接口方式。蜂鸣器:利用外部中断触发 定时器t0控制音调高低 T1控制节拍长短(1)传感器DS18B20 DALLAS DS18B20 1 2 3 GND DQ VDD 图1-4 DS18B20引脚图 DS18B20是美国DALLAS公司推出的数字温度传感器,将温
8、度传感器、数字转换电路集成到了一起,外形如同一只三极管。微型化、低功耗、高性能、抗干扰能力强;它采用独特的单线接口方式,与单片机连接时,仅需一根口线;这样可以非常方便地构成多路温度测量系统。DS18B20的测温范围为-55度125度,可完全满足要求。其引脚图如图1-4所示。DQ:数据输入/输出。在数据总线供电方式可给传感器提供电源。VDD:可选的电源电压DS18B20有两种供电方式:数据总线供电方式和外部供电方式。若采用数据总路线供电方式,VDD应接地,这样可省一根线,但测浊的时间较长。GND:电源地。 温度与数字量的对应关系表如右表所示。(2)单片机80C52单片机内部有P0、P1、P2、P
9、34个8位双向I/O口,其引脚如图1-8所示,外设与这些端口可以直接连接,无需另外的接芯片。P0P3既可以按字节输入或输出,也可以按位进行输入或输出,共32条口线,其控制十分灵活方便。各个端口的结构功能有所不同。在自动浇灌系统的设计中主要用到了P0、P1、P3这3 个口。 1)P0口P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 80C51 RP1 VCC 图-10 P0口作输出口时需加上拉电阻 P0口每一位内部结构如图1-9所示,其基本功能是数据的输入与输出,此外在扩展程序存储器、外部数据存储器或I/O口时,作为数据总线和低8位地址总线。需要说明的是P0口作为
10、输出口使用时,“控制”引脚为低,使场效应管VT1截止,P0口实际上为漏极开路输出电路,因此需加上拉电阻,如图1-10所示;P0作为输入口使用时,必须首先写端口输出“1”,使VT2截止,否则如果VT2导通,在输入引脚数据时,引起的的高电平会被强制拉成低电平。2)P1口在自动浇灌系统设计中,P1.1与传感器DS18B20的DQ连接,将温度传感器上的值传送到单片机80C51在液晶屏上显示出来。3)P3口P3口险了双向I/O口功能外,还具有第二功能。在自动浇灌系统中P3.7、P3.6、P3.5不再是P3口的第二功能,RD、WR、T1是作为I/O口分别控制液晶模块的RS、R/W、E引脚,产生相应的时序信
11、号。(3)TG12864B液晶屏BLK BLA VEE RST CS2 CS1 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 E R/W D/I VO VDD VSS 图1-11 TG12864B模块引脚图 TG12864B是128*64点阵的液晶显示模块,能够显示各种字符(128个8*8点阵字符,或32个16*16点阵的汉字)或图形,具有8位标准数据总线及相应的控制信号,可与单片机接口直接相连。其外观及引脚排列如图1-11所示:其引脚功TG12864B液晶模块实际上是由左右两块独立的64*64点阵液晶屏拼接而成,每半屏有一个8*64*8bit DDRAM,左右半屏驱动电路及
12、存储器分别由片选信号CS1和CS2选择。它可显示4行16*16点阵的汉字,每行显示8列,如果列号小于4,则显示在左半屏,否则显示在右半屏。TG12864B液晶模块内部没有字库,因此必须将ASCII的点阵信息放在程序存储器中,显示时根据ASCII值找到该字符的点阵码送到液晶显示模块DDRAM中。(4)蜂鸣器三极管主要是做驱动用的。因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出高电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。b) 软件设计i. 运行环境
13、keil 2;Proteus;ii. 功能描述在低温时,电磁阀始终关,浇灌时间为0分0秒;在常温时,浇灌时间为30分钟,浇灌次数间隔为8小时;在高温时,浇灌时间为50分钟,浇灌次数间隔为4小时。从低温进入常温,浇灌时间为30分钟,浇灌次数间隔为8小时;从常温进入高温时,浇灌时间为50分钟,浇灌次数间隔为4小时。从高温进入常温,浇灌时间为30分钟,浇灌次数间隔为8小时;响起音乐兰花草 从常温进入低温时,浇灌时间为0分0秒,阀关闭。1主程序模块功能:主要是要调用的函数的声明;变量的定义;根据温度,在该屏上逐行显示:温度、水龙头开关状态、浇灌时间等信息。2DS18B20温度采集模块功能:温度采集,通
14、过温度传感器获取当前的温度值,再将温度值传到主程序中,然后在液晶屏显示相应的温度值。3汉字液晶屏显示状态信息模块功能:对液晶屏进行初始化、复位、打开显示、设置起始行、清屏。4定时器模块功能:实现记录不同温度段的浇灌时间及浇灌间隔时间等信息5控制电磁阀开/关模块功能:根据温度信息控制继电器吸合及断开,从而控制电磁阀的开关,实现浇灌与否。6响乐模块功能:单片机可以依据不同频率的脉冲信号 让蜂鸣器产生与音符相应的声音 可以利用单片机p3.2或者.p3.3引脚 外部中断来控制控制蜂鸣器相关。iii.状态图常温/开阀高温/开阀低温低温不浇灌高温低温/关阀常温浇灌高温浇灌常温/开阀蜂鸣器开,显示间隔时间到
15、/开阀浇灌时间到/关阀间隔时间到/开阀浇灌时间到/关阀降温低温高温/开阀蜂鸣器开,显示常温/开阀常温不浇灌高温不浇灌NO状态条件事件动作目标状态1低温不浇灌常温开阀门/蜂鸣器响 显示常温浇灌2常温浇灌低温关阀门/显示低温不浇灌3常温不浇灌低温关阀门/显示低温不浇灌4常温浇灌30分钟时间到关阀门/显示常温不浇灌5常温不浇灌8小时时间到开阀门/显示常温浇灌6常温浇灌高温蜂鸣器响 显示高温浇灌7高温浇灌常温显示常温浇灌8高温浇灌50分钟时间到关阀门/显示高温不浇灌9高温不浇灌4小时时间到开阀门/显示高温浇灌10常温不浇灌高温开阀门/显示蜂鸣器响高温浇灌11高温不浇灌常温关阀门/显示常温不浇灌 iii
16、. 主要流程图初始化浇灌系统浇灌iv. 程序总体结构图自动浇灌系统浇灌处理显示温度仪键盘处理水阀处理v. 接口设计MCU/P继电器水阀温度传感器键盘显示器蜂名器4.详细设计c) 硬件详细设计i. Proteus图d) 软件详细结构图Reset(初始化DS18B20)Convert(启动温度转换)Readt(读取温度暂存器的值)Wrbyte(写字节)Rdbyte(读字节)Ds18b20InitTimer0 (定时器T0中断)InitTimer0 (定时器T1中断)定时器Lcd_ LCD_DispFill (填充液晶屏)Lcd_dispIni(初始化液晶屏)LCD_DispChar(显示字符)LC
17、D_DispStr(显示字符串)LCD_DispHZ(显示汉字)LCD_DispHZStr(显示汉字字符串)液晶显示模块e.软件详细设计i. 函数描述名称:void wrbyte(uchar d) 功能:向DS18B20写入一个字节 入口参数:d(uchar型 写入字节) 出口参数:无 返回值:无 名称: uchar rdbyte(void) 功能: 从DS18B20读取一个字节 入口参数:无 出口参数:无 返回值:无名称:int readt(void) 功能:读取DS18B20暂存器中的温度值 入口参数:无 出口参数:无 返回值:无名称:void LCD_DispChar(uchar cy,
18、 uchar cx, char dispdata) 功能:在液晶屏的cy(0-7)行、cx(0-15)列显示字符dispdata入口参数:cy(uchar型 设置行) ; cx(uchar型 设置列); dispdata(char型 显示字符);出口参数:无返回值:无名称:void LCD_DispStr(uchar cy, uchar cx, char *disp_str) 功能: 在液晶屏的cy(0-7)行、cx(0-15)列显示字符串disp_str入口参数: cy(uchar型 设置行) cx(uchar型 设置列) *disp_str(char型 显示字符串)出口参数:无返回值:无名
19、称:void LCD_DispHZ(uchar cy, uchar cx, uchar dispdata功能:在液晶屏cy,cx位置显示汉字字符入口参数:cy(uchar型 设置行) ; cx(uchar型 设置列); dispdata(uchar显示汉字字符)出口参数:无返回值:无名称:void LCD_DispHZStr(uchar cy, uchar cx, uchar *disp_str) 功能:在液晶屏cy,cx位置显示汉字字符串入口参数:cy(uchar型 设置行) cx(uchar型 设置列) *disp_str(uchar型 显示汉字字符)出口参数:无返回值:无名称:void
20、LCD_DispFill(uchar filldata)功能:以filldata充填液晶屏入口参数:filldata(uchar);出口参数:无返回值:无名称:void LCD_DispIni(void)功能:初始化液晶入口参数:无出口参数:无返回值:无名称:void InitTimer0(void)功能:定时器中断入口参数:无出口参数:无返回值:无5.编码、集成和调试主函数模块:#include #include #define uchar unsigned char #define uint unsigned int#define water_time 3/常温的浇灌时间#define w
21、ater_time1 6/高温的浇灌时间extern void LCD_DispIni(void);extern void LCD_DispFill(uchar filldata);extern void LCD_DispChar(uchar cy,uchar cx,char dispdata);extern void LCD_DispStr(uchar cy,uchar cx,char *disp_str);extern void LCD_DispHZ(uchar cy,uchar cx,uchar dispdata);extern void LCD_DispHZStr(uchar cy,u
22、char cx,uchar *disp_str);extern void late();extern int readt(void);extern void convert(void);uchar code dp16=0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9;/小数部分转换uchar count,count1;uchar s;uchar m;uchar h;uchar s1;uchar m1;uchar h1;uchar time_s,time_m;uchar counter;/定义的一个判断浇灌时间的中间变量uchar dbuf= ; /小数部分转换uchar dbuf
23、1= ;uchar idata dbuf2= ;uchar idata t;sbit led=P11;sbit SOUND=P17;void time0(void) interrupt 1 /interrupt N表示函数声明为中断服务函数,1:定时器/计数器T0中断 TH0=-50000/256; /定时时间为50MS /取高8位 TL0=-50000%256; /取低8位count+; /每中断一次,计数器加1if(count=20) /每秒执行一次 count=0;s+;if(s=60) m+;s=0;if(m=60) m=0;h+;void time1(void) interrupt
24、3 /3:定时器/计数器T1中断 TH1=-50000/256;TL1=-50000%256;count1+;if(count1=20) count1=0;s1+;if(s1=60) m1+;s1=0;if(m1=60) m1=0;h1+;main() int temp,i; /用来存放传感器的温度值uchar str7=0,0,0,0,0,0; /用于将温度值转换为字符串uchar st2=0,0;uchar buf=0,1,2,3,4,5,0xff;uchar du=24,0xff;uchar chang=9,10,8,0xff;uchar di=11,12,8,0xff;uchar ga
25、o=6,7,8,0xff;uchar jgsj=13,14,8,0xff;uchar dcf=13,14,8,0xff;uchar on=22,0xff;uchar off=23,0xff;uchar fen=20,0xff;uchar miao=21,0xff;uchar cou=15,16,25,26,0xff;int fleg=1,flag=1;bit zf; /正负标记 温度在0度以下为1,否则为0LCD_DispIni();str1=:; /在屏幕指定位置显示LCD_DispHZStr(0,1,buf);LCD_DispHZStr(1,6,du); LCD_DispHZStr(1,0
26、,dcf);LCD_DispHZStr(2,0,jgsj);LCD_DispHZStr(2,5,fen);LCD_DispHZStr(2,7,miao);LCD_DispHZStr(3,0,cou);count=0;s=0;TMOD=0x11;/定时器0和1都设置成方式1TH0=-50000/256;TL0=-50000%256;TH1=-50000/256;TL1=-50000%256;ET0=1; /允许T0中断TR0=1; /启动T0中断ET1=1;TR1=1;EA=1; /开CPU中断while(1) EA=0;convert();for(i=0;i0x01E0)/判断温度是否大于30
27、度 LCD_DispHZStr(1,0,gao);counter=m*60+s;if(counter3) /高温浇灌时间间隔 s=0;m=0;h=0; fleg=1;time_s=0;time_m=0;led=1;else if(temp0x0190)/判断温度是否低于25度TR0=0;TR1=0;s=0;m=0;h=0;s1=0;m1=0;h=0;LCD_DispHZStr(1,0,di);LCD_DispHZStr(2,3,off);time_s=0;time_m=0;led=1;else LCD_DispHZStr(1,0,chang); time_s=0;time_m=0;counte
28、r=m*60+s;if(counter3) /常温浇灌时间间隔s=0;m=0;h=0;flag=1;time_s=0;time_m=0;led=1;if(temp4;/舍去小数部分str0=temp/100+0x30;/求出百位的ASCII码temp=temp%100;str1=temp/10+0x30;/求出十位的ASCII码str2=temp%10+0x30;/求出个位的ASCII码str3=.;dbuf0=(time_s%100)/10+0x30;dbuf1=time_s%10+0x30;dbuf10=(time_m%100)/10+0x30; dbuf11=time_m%10+0x30
29、;dbuf20=(t%100)/10+0x30; dbuf21=t%10+0x30;if(zf=1)/如果是负数if(str1=0) /如果十位为0str0= ; /显示格式为 -x.xstr1=-;else /如果十位不为0str0=-; /显示格式为-xx.xelse /如果是正数 if(str0=0) /如果百位、十位都是0if(str1=0) /显示格式为 x.x str1= ; / 如果只有百位为0 str0= ; /显示格式为 xx.xLCD_DispStr(3,7,str); /将字符串在屏幕指定位置显示出来LCD_DispStr(5,8,dbuf1); /显示分LCD_Disp
30、Str(5,12,dbuf); /显示秒LCD_DispStr(7,11,dbuf2);DS18B20模块:#define uchar unsigned char #define uint unsigned int#include #include sbit DQ=P10; bdata uchar dat;sbit dat0=dat0;sbit dat7=dat7;void delay15(uchar n) /约15us延时 do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _
31、nop_(); _nop_(); _nop_(); _nop_(); _nop_();n-; while(n);bit reset(void) bit err; DQ=0; delay15(40); DQ=1; delay15(6); err=DQ; delay15(18); return(err);void wrbyte(uchar d)/向总线写入一个字节 uchar i; dat=d; for(i=8;i0;i-) DQ=0; delay15(1); DQ=dat0; dat=dat1; delay15(1); DQ=1; uchar rdbyte(void) /从总线上读取一个字节 u
32、char i; dat=0; for(i=8;i0;i-) dat=dat1;DQ=0;_nop_(); DQ=1; delay15(1); dat7=DQ; delay15(4);/新增在位与位之间加入50US的延时 return(dat);void convert(void) bit err; err=reset(); /复位DS18B20 wrbyte(0xcc); /发READ ROM命令 wrbyte(0x44); /发READ ROM命令int readt(void)uchar h,l; /复位DS18B20reset(); /复位DS18B20wrbyte(0xcc); /发RE
33、AD ROM命令wrbyte(0xbe); /发READ ROM命令l=rdbyte(); /读取温度低字节、高字节h=rdbyte(); return(h*256+l);/保存16位温度值LCD液晶显示模块:#include #include #include #define uchar unsigned char#define uint unsigned intsbitLCD_RST=P37;sbitDI=P34;sbitRW=P35;sbitCS=P33;sbit EN=P36;sbitRDY=P07;sfrLCD=0x80;#defineLCD_DISPON 0x3f / 打开LCM显
34、示命令 #define LCD_STARTROW 0xc0 / 设置起始行命令,用LCD_STARTROW+x设置起始行(x64) #defineLCD_ADDRSTRY 0xb8 / 设置页地址命令,用LCD_ADDRSTRX+x设置当前页(x8) #defineLCD_ADDRSTRX 0x40 / 设置列地址命令,用LCD_ADDRSTRY+x设置当前列(x64)#define CS1 0 /左半屏选择#define CS2 1 /右半屏选择/命令字cmd送左半屏(port=0)/右半屏(port=1)命令void LCD_WrCmd(bit port, uchar cmd)EN=0;C
35、S=port;DI=0;RW=0;EN=1;LCD=cmd;EN=0;/数据wrdata送左半屏(port=0)/右半屏(port=1)数据口void LCD_WrDat(bit port, uchar wrdata)EN=0;CS=port;DI=1;RW=0;EN=1;LCD=wrdata;EN=0;uchar code ASCII_TAB480 = /0X200X7F之间 ASCII码对应的点阵数据表 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x28
36、, 0xfe, 0x28, 0xfe, 0x28, 0x48, 0x54, 0xfe, 0x54, 0x24, 0x46, 0x26, 0x10, 0xc8, 0xc4, 0x6c, 0x92, 0xaa, 0x44, 0xa0, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x00, 0x00, 0x82, 0x44, 0x38, 0x00, 0x28, 0x10, 0x7c, 0x10, 0x28, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00, 0xa0, 0x60, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x40, 0x20