资源目录
压缩包内文档预览:(预览前20页/共33页)
编号:40523688
类型:共享资源
大小:6.37MB
格式:ZIP
上传时间:2020-01-14
上传人:遗****
认证信息
个人认证
刘**(实名认证)
湖北
IP属地:湖北
20
积分
- 关 键 词:
-
农舍
自动
降温
系统
- 资源描述:
-
农舍自动降温系统,农舍,自动,降温,系统
- 内容简介:
-
农舍自动降温系统刘俊曼 周燕君 李丽玲绪论 温度在一天中是波动变化的,昼热夜凉。为了让农舍里面的蔬菜或者家禽有良好的生长环境,提高农作物的产量和质量,我们需要给农舍提供一个适宜的温度。白天温度高于设定值时,电扇能够自动打开,起到降温作用,并且电扇可以随着温度的升高而加速,从而减少了降温所需的时间,有利于保护农作物。夜里,温度低于设定的温度下限时,LED灯光报警,提醒农舍工作人员为农作物做保温措施。本系统由AT89S52单片机及其它外围设备组成,具有操作简单,显示明了,使用方便,控制智能化等优点。关键词:AT89S52,LCD1602显示屏,18B20温度传感器,自动降温。一、方案比较1.1控制部分方案一:采用AT89S52作为控制器。优点:AT89S52作为一种成熟的单片机型号广泛应用,操作简单,稳定性好,价格低廉。缺点:运行速度慢。方案二:采用AVR单片机作为主控芯片。优点:AVR功能较之51更强,速度也更快。外围硬件齐全,程序量和内存较大。内部带EEP,有内部晶振和内部复位等,单个芯片基本可以控制外围器件,无需扩展。运算速度快,IO驱动能力大。基于系统方便简洁,价格合理,我们选用方案一。1.2温度传感器部分方案一:选用热敏电阻作为感测温度的核心元件,通过运算放大器放大由于温度变化引起热敏电阻电阻的变化、进而导至的输出电压变化的微弱电压变化信号,再用AD转换芯片ADC0809将模拟信号转化为数字信号输入单片机处理。优点:采用热敏电阻价格便宜,元件易购。缺点:热敏电阻对温度的细微变化不敏感,在信号采集、放大、转换过程中还会产生失真和误差,并且由于热敏电阻的R-T关系非线性,其本身电阻对温度的变化存在较大误差。方案二:采用热电偶作为感测温度的核心元件,配合桥式电路,运算放大电路和AD转换电路,将温度变化信号送入单片机处理。优点:相对于热敏电阻其对温度的敏感性和器件的非线性误差有较大提高,测温范围非常宽,从-50-1600。缺点:电路复杂,对温度的敏感性达不到本系统的要求。方案三:采用数字式集成温度传感器DS18B20作为感测温度的核心元件,直接输出数字温度信号供单片机处理。由于DS18B20的高度集成化,温度误差笑,温度分辨力极高。温度值在器件内部转换成数字量输出,简化了系统程序设计,与单片机的接口非常简单,抗干扰能力强。缺点:价格比较高。综合上述比较和本系统的需要,我们选用了方案三。13、显示部分 方案一:采用HS12864液晶。优点:屏幕大,界面美观,抗干扰能力强,对图形和曲线的显示实现起来比较简单,自带中文字库,显示信息量大。应用串行连接,节省I/O口。缺点:价格较高,操作不方便。 方案二:采用七段数码管。优点:价格低廉。缺点:每显示四位需要用到8个I/O口,需要外接一些短路,连接麻烦,驱动程序复杂。 方案三:采用LCD1602。优点:可以显示16*2个字符(包括数字和字符),却只占用11个I/O口,电路连接简单,不需外围电路,价格相对于HS12864便宜 通过比较,由于本系统关键是显示温度数值和相关字符,所以选用方案三。14、按钮部分 方案一:实体按钮。优点:操作方便,在预设定温度时,每按一下温度升高或降低1度,价格便宜。缺点:受外界环境影响大。 方案二:触摸屏。优点:具有坚固耐用,反应速度快,节省空间等特点。由于本系统的按钮只涉及到温度的设定与调节,从节约成本和实际情况出发,选用方案一比较好。15、报警部分 只用一个LED作光报警,直接用I/O控制。二、设计与论证2.1、系统总框图电路板2.2、软件设计 2.2.1、主程序的流程图(主程序的设计)开始LCD初始化初始化显示读取温度数据转换,显示读取键盘值键盘处理温度比较温度小于低温控制温度高于高温控制低温警示灯红灯亮马达转动,转速随温度升高而加快结束YesYesNoNo2.3、硬件设计2.3.1、LCD1602显示屏的设计 本系统我们采用了LCD1602,通过单片机控制将所测的频率信号读数显示出来。显示屏实物及其连接图如下2.3.1所示。图.2 温度采集电路的设计 本电路部分主要由DS18B20。DS18B20采集温度数据,并将采集到的温度数据转化成为二进制数,经过单片机处理后输出给LCD1602显示屏。温度传感器实物及其连接图如下2.3.2所示图.3 电机驱动及光报警电路的设计电机驱动主要采用L298,为电扇的启动提供足够的电流。当系统采集的温度低于设定的最低温度时,LED灯发光报警,提醒农舍工作人员农舍温度过低,影响作物生长,电机驱动的实物及其电路图如下图所示图.4供电方式采用了具有过流保护的直流可调稳压电源,电路主要由整流滤波电路、过流保护电路、稳压电路三部分组成。整流滤波电路:由D1D4四只二极管组成桥式整流电路,整流输出经C1电容滤波后,得到比较平滑的直流电压,送至三端稳压器的输入端。过流保护电路:由过流取样电阻R6及R9、C3组成延时电路、单向可控硅及电子开关电路组成截止式过流保护电路。稳压电路:由集成稳压块LM317与取样电路组成,R8=100接在输出端与调整端之间,通过电阻R7与RW产生0到6V的可调电压,使稳压输出可从1.25V调到7.5V。电源实物及其电路图如下图.5按钮电路的设计本电路主要有五个按钮,分别实现温度值上下限的设定、温度值的显示和返回界面的功能。按键实物及其接线图如下:图2.3.5 按钮电路的设计三、测试及结果分析基本功能部分:基本功能测试结果1. 实时测量农舍温度,并显示当前温度。温度传感器实时测量温度,并通过单片机控制,在LCD显示屏上显示当前温度。2. 当温度超过35C时自动开启降温风扇,为室内降温,温度小于35C时自动关闭风扇。温度超过设定值后,电扇自动启动,小于设定值则自动关闭。3. 在温度高于35C的前提下,随着温度的上升,风扇的转速自动上升。随着温度的升高,明显看到转速上升。扩展功能扩展功能要求测试结果1. 可改动开启风扇的温度阀值(即基本要求所提到的35C),系统断电后能自动保存该值。通过按按钮,可以设定温度阈值(温度上限和温度下限),并且LCD能显示设定的温度值。其他创新功能创新功能要求测试结果1.低温灯光报警当温度低于设定温度值时,LED灯亮报警。四、总结队长总结:为期一个月的智能控制设计大赛终于接近尾声了!交论文的前一周,恰逢“五一”小长假,但大家都牺牲了自己的娱乐休闲时间,忙着调试和写论文。在这次比赛中,我主要负责编程和电路的设计。在确定题目和设计的思路后,我就开始找资料了。在参赛前我就知道我的预备知识是不够的,当时我只有一些C语言编程基础,数电、模电和单片机课也才开课几周,于是这段时间我一直在翻书、上网查资料。经过一段时间的学习,我对C语言和单片机更加熟悉了,也学会了利用Keil和Proteus实现仿真,以便早日发现问题,减少调试时不必要的麻烦。调试的过程是一波三折的,有时不是导线断了、元件坏了,就是代码写错了,导致调试没得到理想的结果。调试的过程是重复烦琐的,但当看到马达转动、显示屏亮起时的喜悦也是不可言喻的。在这个模拟农舍自动降温系统的设计过程中,我们组三人分工合作,大家互相帮助,互相学习,缺一不可。我们最终能一步步实现各种功能,成功设计出这个作品,团队的合作是最重要的!队员总结:这是我们第一次接触单片机。参赛前,只是对单片机有一个概念性的理解。通过参加次比赛,我们自己动脑思考,动手设计,动手焊接以及动手调试,深深的了解到了编写程序到电脑模拟仿真再到下载调试的整个过程。由于我们的专业还没有学到单片机,我们两在编写程序上都没有什么贡献,这是一个遗憾。但我们专业课学到的电机及其拖动和电工实习都派上用场了,让我们对各电路部分有所了解。除此之外,我们上网搜资料和借鉴同学们的意见,最终把电路设计出来,并调试成功。参加了本次比赛后,我发现我们现在所学的知识都是很基础的,而且在作出成品来说还是很少的。我们不必等着学校来给我们安排课程,我们应当学会自己去吸取长知识,这是很重要的。另外,团队之间的相互体贴与合作,是我们能够成功的最重要因素。五、程序源代码请参见附录。六、参考文献C程序设计教程 清华大学出版社单片机技术及工程实践 机械工业出版社附录1.总电路图2.程序代码#include #include #define uchar unsigned char#define uint unsigned intsbit DQ=P37;/ds18b20与单片机连接口sbit RS=P34; /显示屏与单片机连接口sbit RW=P35;sbit EN=P36;sbit IN1=P20; /电机与单片机接口sbit IN2=P21;sbit IN3=P22;sbit IN4=P23;sbit ENA=P24;sbit ENB=P25;unsigned char code str1=Now temp: ;unsigned char code str2=Made by JM YJ LL; unsigned char code str3= Welcome! ; unsigned char code str4=; unsigned char code str5=L H ; uchar shuzi=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39; /1602液晶09的显示uchar num;uchar L=20;H=35; /L、H的值uchar data disdata5;uint tvalue;/温度值uchar tflag;/温度正负标志/*lcd1602程序*/ void delay1ms(unsigned int ms)/延时1毫秒 unsigned int i,j; for(i=0;ims;i+) for(j=0;j0;i-) DQ = 0; /给脉冲信号 dat=1; DQ = 1; /给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); return(dat); void ds1820wr(uchar wdata)/*写数据*/ unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata=1; read_temp()/*读取温度值并转换*/ uchar a,b; ds1820rst(); ds1820wr(0xcc);/*跳过读序列号*/ ds1820wr(0x44);/*启动温度转换*/ ds1820rst(); ds1820wr(0xcc);/*跳过读序列号*/ ds1820wr(0xbe);/*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue=8; tvalue=tvalue|a; if(tvalue0x0fff) tflag=0; else tvalue=tvalue+1; tflag=1; tvalue=tvalue*(0.625);/温度值扩大10倍,精确到1位小数return(tvalue); /*/ void ds1820disp()/温度值显示 uchar flagdat; disdata0=tvalue/1000+0x30;/百位数 disdata1=tvalue%1000/100+0x30;/十位数 disdata2=tvalue%100/10+0x30;/个位数 disdata3=tvalue%10+0x30;/小数位 if(tflag=0) flagdat=0x20;/正温度不显示符号 else flagdat=0x2d;/负温度显示负号:- if(disdata0=0x30) disdata0=0x20;/如果百位为0,不显示 if(disdata1=0x30) disdata1=0x20;/如果百位为0,十位为0也不显示 wr_com(0x89);wr_dat(flagdat);/显示符号位 wr_com(0x8a); wr_dat(disdata0);/显示百位 wr_com(0x8b); wr_dat(disdata1);/显示十位 wr_com(0x8c); wr_dat(disdata2);/显示个位 wr_com(0x8d); wr_dat(0x2e);/显示小数点 wr_com(0x8e); wr_dat(disdata3);/显示小数位 uchar GetKey() /读取键值 uchar K; if(P0=0xff) return 0; /检查是否有键按下 delay1ms(10); switch(P0) case 0xfe: K=1;break; case 0xfd: K=2;break; case 0xfb: K=3;break; case 0xf7: K=4;break; case 0xef: K=5;break; case 0xdf: K=6;break; default: K=0; while(P0!=0xff); return K; void KeyProcess(uchar Key) /键盘处理 uchar t=0; switch(Key) case 1:if(LH) L-; delay1ms(10);break;case 2:if(LL) H-;delay1ms(10);break; case 4:if(HL) H+;delay1ms(10);break;case 5: lcd_init();init_play2();delay1ms(10);break; /*主程序*/void main() uchar k; uchar Key; uchar speed; uchar stop;P0=0xff;IN1=1;/驱动机初始化IN2=0;IN3=1;IN4=0;lcd_init();/lcd初始化显示init_play();/屏幕外等待 delay1ms(1000); lcd_init();init_play2();/当前温度显示while(1)read_temp();/读取温度 ds1820disp();/显示Key=GetKey(); if(Key!=0)KeyProcess(Key);if(Key!=5)lcd_init();init_play1();delay1ms(10);k=tvalue/10;/温度值speed=80+(k-H)*4;stop=100-speed;if(k=L&kH&kH+5) ENB=0; /马达转速达到最大ENA=1; 农舍现代化智能控温系统作者:华南理工大学自动化学院江福强 (2010级2班)郭超 (2010级2班)陈树渠 (2010级2班)2011年5月 目录Preface 前言5作品实现功能简介6一. 方案设计81. 前期设想规划2. 方案论证,比较,选择二温控系统模式图111.温控整体运行模式图2.系统数据信息流图3.系统指令信息流图三智能控温系统模块简介131.处理器模块1.1 基于STC89C52RC的温度检测、智能控制、信息传输 1.2 基于STC12LE5A60S2的农舍温度操作控制 1.3 基于STC89C52RC的远程信息传输 1.4 基于PC的上位机控制2.电源模块1.1 通过LM317供电控温动作电路 1.2 通过AMS1117.3.3与CW7805供电逻辑电路3.温度采集模块 1.1 DS18B20的室内外温度采集比较4.温度实时显示模块 1.1 LCD1602的实时显示5.农舍温度操作控制模块 1.1 按键操作调控室内温度、设定有效时间 1.2 触摸屏查看温室状况、控制温度变化6. 智能控温动作模块 1.1 采用风扇的过温自动降温 1.2 采用制冷片的自动降温 1.3 采用电热丝的低温自动升温 7.上位机处理控制模块 1.1上位机实现温度的实时显示,记录,绘制温度变化曲线 1.2 上位机实现温度的随时查询,温度曲线的随时调取 1.3 上位机实现温度的上位控制8.无线远程控制模块1.1 温度信息数据的远程传输1.2 控温指令的远程传输9. 通信接口模块 1.1 串口通信10.温度异常报警与紧急手动控制模块 1.1 温度异常报警 1.2 紧急状态下的升温、降温手动控制四系统硬件部分(附图)19 1.主控制板 2.外围测温,控温器件 3.触摸控制,信号接收器件 4.上位机部分五系统软件部分261.软件部分简介2.程序运行流程图六理论分析与计算26七调试方法,过程,与结果分析27七组员制作体会,感言28八成本预估和实用性分析29九参考文献30十附录:电路图及其他相关设计文件 程序源代码(主要部分) Preface 前言*总述:随着农业现代化的一步步推进,为了提高生产效率,解放人力资源,智能化的农业设备需求日益增长,智能控温对于农业生产是极其重要的,而农舍智能控温系统是其中比较简单常见的一种。本题需要多个模块的协同配合,分工明确,用到的也是较为常用的模块开发,对于单片机的学习有很大的帮助,而且实用性较强,所以:*我们选择了初级组C题: C题 农舍自动降温系统在农业生产中,时常要求某些农舍的温度不能高于某一值。要求设计一个农舍自动降温系统。基本要求:1. 实时测量农舍温度,并显示当前温度。2. 当温度超过35C时自动开启降温风扇,为室内降温,温度小于35C时自动关闭风扇。3. 在温度高于35C的前提下,随着温度的上升,风扇的转速自动上升。扩展要求:1. 可改动开启风扇的温度阀值(即基本要求所提到的35C),系统断电后能自动保存该值。2. 增加其他方式为农舍降温(如使用喷雾)。3. 能记录一天中若干个时间点的温度数据,并且可随时调用显示出来,测试时以1min为间隔,记录5个数据。4. 使用液晶或上位机描绘温度曲线,进一步可制作人性化的操作平台。5. 其他创新功能。作品功能简介 基本要求:要求实现情况优化1.实时测量农舍温度,并实时显示当前温度实现室内建立多个测量点,便于准确判断2.温度超过35度,自动开启降温风扇,小于35度时,自动关闭实现(见扩展要求)3.温度高于35度时风扇转速随着温度升高而加快实现比较科学根据温度的转速算法扩展要求: 要求实现情况 优化注释4.可改变开启风扇的温度阀值,系统断电后能自动保存实现可在农舍、远程调节阀值5.增加其他降温方式实现制冷片降温6.能记录一天中若干时间点的温度数据,并随时调用显示实现可记录一天中任意时间温度由上位机完成7.使用液晶或上位机描绘温度曲线,进一步制作人性化操作平台实现上位机描绘每天任意时间的温度曲线其他创新:功能描述 功能阐述8.农舍的时间与温度一起实时显示可以看到各个温度时刻的时间9.建立室内外温度检测比较机制,室外温度高于室内时,启用制冷装置 在外部温度高于内部温度,风扇降温无效时仍可降温10.设定并可调温度的下限,低于时启动自动升温设备,使农舍处于正常的温度范围可以设定下限温度并且可调,低于下限电热丝工作,温度回升后停止工作11.设定控温时间段与温度范围可以设定控温时间段,比如:可以设定1:50:00到6:10:20的温度在20度30度得范围内,这样控温更加准确细致,符合植物生长特性。12.添加了紧急控温措施,人为控温,形成自动控温,人为控温,紧急手动控温的严密控温模式,更加人性化的操作平台人为控温:可以跳过自动控温系统通过农舍、上位机的人机交互端根据自己的决策控温(人为设定)在控温系统失灵的紧急情况下可以手动控温13.添加了系统温度异常报警温度高于设定上限10度或低于下限温度10度会报警14.通过无线模块实现了农舍的远程控制 远程控制农舍15.通过触摸屏实现了农舍温度的人为触摸控制农舍人机交互端的一部分16.实现STC89C52RC,STC12LE5A60S2,PC机的多个处理器的协调工作充分利用各个处理器,加大农舍监管控制力度17. 强大的上位机部分更加完善,实现比较人性化的人机交互平台(上位机功能介绍)每秒记录并显示一次温度数据,检测到的温度变化灵敏度加大益于准确控温可记录每月每天任意时刻温度值,可随时调出供人参考可随时调出每天的温度曲线用于总结比较,分析温度变化趋势,判断农舍状况可以选择查看时间1分钟,1小时,1天的温度曲线可通过上位机实现对农舍控温系统各个方面的实时控制可以进行串口选择方案设计1.前期设想规划拿到题目想到农舍控温比较接近生活而且模块化性质比较强,分工明确就选择了初级组C题,并做了初步构想:1. 温度的控制要可以按人的意愿分时段控制,有上下限,可以随意调节上下限,高低温时都可以启动调节2. 温度的检测要尽可能准确,频率要高尽可能一秒一次,室内外都测,并实时传给上位机3. 温度用1602实时显示要加上时间,要是时间充裕加上触摸屏显示并控制4. 尽量无线传输实现农舍远程控制,实现不了的话旧用串口通讯5. 上位机实时显示温度,并可以控制单片机在随后的制作中发现了一些问题,改进了一些细节完善了功能,增加了一些人性化设置:*电源供电,89C52处理速度慢,IO口紧缺,机机通讯,PCB制板的问题急需解决*增加了人为控制,紧急控制,上位机的功能也渐渐完善2.方案论证,比较,选择*1.供电方式选择A接220交流电,整流稳压后经LM317稳压芯片供电7V,再分压得到5V,3.3V。优:电路简单 劣:动作电路相对逻辑电路为高功耗电路 会影响逻辑电路,使系统不稳定B电池组供电7V,5V,3.3V优:电路简单 劣:无法供电动作电路(电流较大)C方案A供电动作电路,同时供电经稳压芯片AMS1117.3.3,MC7805变压为3.3V和5V供电逻辑电路优:系统稳定性高 劣:电路复杂 我们选择方案C:将动作电路,逻辑电路分开,系统稳定*2.显示温度曲线方式A显示优:比较熟悉劣:显示信息单一,无挑战性B上位机显示优:显示丰富,人性化操作平台劣:较大难度我们选择方案:较为丰富,人性化,可以学习到上位机*3.显示时间方式A.DS1302时钟芯片实时显示时间优:时间比较准确 劣:需要外加电源才可以保存时间B.定时器记时优:简单 B.时间粗略不准确CDS12C887时钟芯片优:时间准确,掉电自动保存 劣:价格高,体积大我们选择方案A,得到准确的时间显示,价格实惠*4.电机控速实现方式A.输出8位信号,分段控制电流大小,进而控制电机转速劣:实现复杂,速度不能实现连续调控B单片机产生PWM波信号通过L298驱动芯片,驱动电机优:简单易于实现,可实现转速持续改变我们选择B方案:较为准确地持续控制电机,易于实现*5. 单片机对L298芯片的控制方式A直接控制优:电路简单 劣:电机为大功率用电设备,工作时会对单片机造成影响,甚至烧坏单片机B中间加上光耦电路,再连接单片机优:是单片机工作安全稳定 劣:电路复杂我们选择方案B:为了是单片机安全稳定的工作*6.农舍降温方式A制冷片降温优:降温效果优异 劣:电流较大,对电源要求高B喷雾降温优:制作简单劣:降温效果差我们选择:方案A,为了增强降温效果,可以专门做一个供电电源。 温控系统模式图信息显示端1. 温控整体运行模式图DS18B20多点测温 温度信息实时显示人工控制端 反馈温度数据时间信息实时显示 人工控温STC89C52RC主控单片机 显示时间智能控制动作电路 准确定时 人工控制动作电路温控动作端:风扇,制冷,制热DS1302时间 设定控温时段存储温度上下阀值等数据温度数据实时传输 人工控制端控制指令传输 上位机控制指令紧急手动控制无线传 输模块紧急手动开关上位机端2. 系统数据信息流:实时温度显示农舍部分主控单片机温度芯片测取温度数据经无 线传输上位机处理,记录,绘制曲线3. 系统指令信息流:上位机端指令控温动作模块农舍主控单片机上位机控制指令主控单片机智能控制农舍人工控制端指令农舍人工控制端修改温度上下阀值修改控温动作时间段智能控温系统模块简介一. 处理器模块1.基于STC89C52RC的温度检测、智能控制、信息传输主要的农舍现场控制通过STC89C52RC实现,外设有DS18B20温度传感器,DS1302时间芯片,LCD1302显示屏幕,继电器等外部动作电路,与上位机的串口通讯设备,人工温度控制设备等等。其中89C52控制操作简单,内存8K,价格较低,完全可以实现农舍内部的智能温控任务。2.基于STC12LE5A60S2的农舍温度操作控制农舍的触摸屏控制人机交互平台需要处理速度更加高的单片机来实现处理数据,显示和触摸控制。采用STC12LE5A60S2配合以24M的晶振即可达到触摸屏的要求,同时缓减了主控芯片IO口短缺的问题3.基于STC89C52RC的远程信息传输农舍的温度信息经过无线模块传输至上位机端,通过此处理器将信息取出经串口传输至上位机进行处理分析。同时,上位机的控制指令经此模块发射至农舍主控模块以控制农舍。4. 基于PC的上位机控制在现代工农业应用中一般都是由直接控制工程设备的下位机采集数据和控制具体设备,用上位机来执行整体数据分析,人为控制。这样可以利用上PC机的强大功能来有效地控制现场设备。本作品中上位机承担着记录相邻几天的温度数据,可随时调用,用以分析参考,实时绘制温度曲线,并调出相邻几天的温度曲线用以比较,想具体控制设备传达控制指令的任务。二.电源模块1.通过LM317供电控温动作电路此电路用之前在基地二轮选拔时做的可调直流稳压电源供电7V。制冷片,电热丝,风扇皆用电7V。实物如图所示:3. 通过AMS1117.3.3与CW7805供电逻辑电路上边的7V同时供电通过稳压芯片AMS1117.3.3变压为3.3V给低压单片机,无线发射模块,触摸屏模块供电。经CW7805给其余的逻辑电路供电。(上图)三.温度采集模块 1.DS18B20的室内外温度采集比较用DS18B20,实时地测量室内外温度并加以比较。室内布置多处温度测点,主控单片机会综合考虑所有测点的温度取样决定控温策略。室外测取的的温度与室内比较,若室外温度大于室内,则启用制冷装置降温。四.温度实时显示模块 1.LCD1602的实时显示用来显示农舍的时间和实时温度。同时与键盘配合,可以更改温度阀值,控温时间段,是人机交互端的显示设备。五.农舍温度操作控制模块 1.按键操作调控室内温度、设定有效时间通过键盘操作,可以更改温度上下阀值,设定控温有限时间,比如:设定18:10:20到23:39:20的限制温度,系统便会在相应时间内控温在设定范围内,这样更有利于分时段控温,更加准确细致。2. 触摸屏查看温室状况、控制温度变化采用比较高级的触摸控制端,显示的温度画面比较丰富,控制相关的温度数据更加方便。 六.智能控温动作模块1.采用风扇的过温自动降温当温度高于设定的温度阀值,单片机输出占空比可调的PWM波,经过光耦电路,L298芯片驱动电机转动,随着温度升高占空比增大,电机两端电压增大,风扇转速加快。当温度回落到设定温度以下,单片机不在输出PWM波,风扇停止转动。 2.采用制冷片的自动降温当温度比较高时尤其是室外温度高于室内温度时,制冷片自动启动,来降低室内温度。3.采用电热丝的自动升温当温度低于设定温度值,电热丝自动工作,为室内升温。七.上位机处理控制模块1.上位机实现温度的实时显示,记录,绘制温度变化曲线利用上位机强大的处理能力,我们可以把弄舍的实时温度数值在上位机上显示,绘制温度曲线图。下图为上位机工作图:2.上位机实现温度的随时查询,温度曲线的随时调取上位机可以将每天的温度数据按时间文件夹整理记录下来,随时可以调出查看,并画出温度曲线,用于多天温度趋势的比较,利于温度决策。3.上位机实现温度的上位控制上位机作为人机交互的高级终端,可以做出对下位机执行端的上位控制,改变主控单片机的工作状态,温度的参数以及其他的下位数据。八.无线远程控制模块1.温度信息数据的远程传输主控单片机将收集到的温度数据通过无线传输传至上位机部分来记录温度数据,显示温度曲线,便于决策下一步的控温操作。2.控温指令的远程传输上位机通过传来的温度数据做出决策,将指令通过无线发射模块传送到主控单片机端。九.通信接口模块1.串口通信此端口用于主控单片机与上位机之间的通讯,进而交流温度数据信息,控温指令。十.温度异常报警与紧急手动控制1.温度异常报警本作品默认当温度超过设定的温度上限10度,或低于温度下限10度时,会自动报警,警告系统需要采取更加严厉的控温措施。2.紧急状态下的升温、降温手动控制为了避免极端情况下智能控温系统不正常工作甚至失灵带来的不必要损失,本作品增加了紧急升温、降温手动控制开关。极端情况下,可以人为的跳过智能控制系统直接开启控温动作电路。只需分别按下2个开关即可分别开启升温,降温应急措施,在紧急情况下为农舍控温,避免不必要的损失。系统硬件部分1. 主控制板此模块承担了农舍部分的几乎全部的检测,显示,控制任务。处理器为STC89C52RC型单片机,外设有测温芯片DS18B20,时钟芯片DS1302,LCD液晶显示器,键盘控制区,串口,报警器,控制升降温器件的继电器等等。是农舍系统最为重要的部分之一。本模块采用PCB制板。设计电路图,生成PCB,实物如图所示:2. 外围测温,控温器件控温电路如图所示。测温电路附在主控板上。说明:控温部分为继电器、手动开关控制的制冷片,电热丝,经光耦电路由L298控制的风扇。3. 信号接收器件图示为nrf24l01无线传输模块。4. 上位机部分图示分别为:上位机操作窗口,上位机工作图1(每10分钟),上位机工作图2(每1小时),上位机后台温度存储文件系统软件部分软件部分大体分下列几个部分:*主控芯片部分:mian.c,Ds18b20.h,LM016L.h,DS1302.h,PWM.h,chumoping.h,wuxian.h等分别实现主控制函数,ds18b20温度传感器控制,液晶屏控制,时钟芯片控制,产生PWM波,触摸屏控制,无线传感控制。*上位机部分:Mscomm串口控件,接收控制;数据的保存,及调用;NTGraph绘图控件,绘图控制;界面的设置及操作;各模块的协同等。具体源代码见附录。 理论分析与计算电路方面的理论分析与计算涉及到模电的一点知识而编程方面的理论分析则在C语言方面理论分析已经在以上的方案选择与模块具体简介中有介绍,下边列举简单的计算(其余在文章其他部分已提到):*波相关计算: 调试过程,方法与结果分析调试过程中,我们采用了keil调试,visual studio 2010调试,protues仿真,altium designer绘制,面包板实验,焊接电路进行实验的方法,对设计的软硬件进行了全面调试。调试过程部分截图:Protues模拟农舍主控部分调试的过程中发现了一些问题,尤其是在程序方面,经过修改后,工作正常,正确调试后的程序见附录。调试也是做好一个作品很重要的一部分,之前对调试重视的不够,以后要多留出一点时间给调试,以防意外,同时也可以优化作品性能。 组员制作感言*江福强:难度定位高,基础不足,前期规划不充分;于是折腾,折腾,折腾;累!累!累!*陈树渠:累啊!由于组员的设想实在太过丰富,而时间相对来说又不充裕(主要是我们刚起步),所以从零开始,日以加工。虽然放轻了其他的课程,牺牲了宝贵的51假期,但是还行!*郭超:真的有点累,但是正是累让我们更加团结,才有更大的力量,也让我们得到一些难得的体会。成本预估与实用性分析元器件价格STC12LE5A60S2 10制冷片 18无线模块26触摸屏58 其他基本电路元件以前用过的,自备风扇,电阻丝等废物利用本作品可以准确控制农舍温度,减轻人力负担,配合人力进行农舍温度实时监管,成本相对较低,比较实用 参考文献*51单片机应用系统典型模块开发大全 中国铁道出版社*C+程序设计 谭浩强 清华大学出版社*电子技术基础 沈志勤 清华大学出版社*一些芯片的 data sheetCSDN,CNKI,百度文库网站及芯片官网提供 附录程序源代码(一部分主要代码):*DS18B20.h:1.void ds1820rst1() uchar x=0;DQ1 = 1; /DQ复位delay_18B20(4); /延时DQ1 = 0; /DQ拉低delay_18B20(100); /精确延时大于480usDQ1 = 1; /拉高delay_18B20(40); 2.uchar ds1820rd1()unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) DQ1 = 0; /给脉冲信号 dat=1; DQ1 = 1; /给脉冲信号 if(DQ1) dat|=0x80; delay_18B20(10); return(dat);3.void ds1820wr1(uchar wdata)unsigned char i=0; for (i=8; i0; i-) DQ1 = 0; DQ1 = wdata&0x01; delay_18B20(10); DQ1 = 1; wdata=1; 4.int read_temp1()uchar a,b;ds1820rst1(); ds1820wr1(0xcc);ds1820wr1(0x44);ds1820rst1(); ds1820wr1(0xcc);ds1820wr1(0xbe);a=ds1820rd1();b=ds1820rd1();tvalue=b;tvalue=8;tvalue=tvalue|a; if(tvalue0;i-) DQ2 = 0; /给脉冲信号 dat=1; DQ2 = 1; /给脉冲信号 if(DQ2) dat|=0x80; delay_18B20(10); return(dat);7.void ds1820wr2(uchar wdata)unsigned char i=0; for (i=8; i0; i-) DQ2 = 0; DQ2 = wdata&0x01; delay_18B20(10); DQ2 = 1; wdata=1; 8.int read_temp2()uchar a,b;ds1820rst2(); ds1820wr2(0xcc);ds1820wr2(0x44);ds1820rst2(); ds1820wr2(0xcc);ds1820wr2(0xbe);a=ds1820rd2();b=ds1820rd2();tvalue=b;tvalue=8;tvalue=tvalue|a; if(tvalue0; i-)DS1302_CLK = 0;DS1302_IO = ACC0;/由低位到高位DS1302_CLK = 1;/上升沿写入数据ACC = 1;3.读取一个字节(内部函数)unchar DS1302_OutputByte(void)unchar i;for(i=8; i0; i-)DS1302_CLK = 0; /下降沿读出DS1302的数据ACC = 1; /读出由低到高位,只能移7次有效位!ACC7 = DS1302_IO; /第一个数据 DS1302_CLK = 1; return (ACC);4.在指定地址写入指定的数据void Write1302(unchar Address, unchar Data)DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1; DS1302_InputByte(Address);DS1302_InputByte(Data);DS1302_CLK = 1;DS1302_RST = 0;5.读取1302指定地址中的数据unchar Read1302(unchar Address)unchar Data;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1; /RST拉高,启动数据传送DS1302_InputByte(Address|0x01);/读取指定地址数据指令Data = DS1302_OutputByte();DS1302_CLK = 1;DS1302_RST = 0;return (Data);6.是否写入保护void DS1302_SetProtect(bit Flag)if(Flag)Write1302(0x8E,0x80); /0x8e控制字节地址,bit7=WP WP=1 禁止数据写入DS1302elseWrite1302(0x8E,0x00); /WP=0 允许数据写入DS13027.设置时间函数void DS1302_SetTime(unchar Address, unchar Value)DS1302_SetProtect(0);Write1302(Address,(Value/10)Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0f);ReadValue = Read1302(DS1302_MINUTE);Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0f);ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0f);ReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0f);ReadValue = Read1302(DS1302_WEEK);Time-Week = (ReadValue&0x70)4)*10 + (ReadValue&0x0f);ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x0f);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0x70)4)*10 + (ReadValue&0x0f);9.时间转化成字符void TimeToStr(SYSTEMTIME *Time)Time-TimeString0 = Time-Hour/10 + 0;Time-TimeString1 = Time-Hour%10 + 0;Time-TimeString2 = :;Time-TimeString3 = Time-Minute/10 + 0;Time-TimeString4 = Time-Minute%10 + 0;Time-TimeString5 = :;Time-TimeString6 = Time-Second/10 + 0;Time-TimeString7 = Time-Second%10 + 0;Time-TimeString8 = 0;10.初始化DS1302void DS1302_Initial (void)unchar Second=Read1302(DS1302_SECOND);if(Second&0x80)/bit7=CH CH=0 振荡器允许工作,CH=1振荡器停止工作DS1302_SetTime(DS1302_SECOND,0); DS1302_SetTime(0x90, 0xab);*pwm.h:1.延时void delay_ms(uint s) uint x; for(s;s0;s-) x = 200; while(x-); 2.输出波 void OutputPWM() extern tempn;uchar x,y;cha=(tempn-shang)/10;x=5*cha+50;y=(100-x);if(cha10)x=1000;y=0;en2=!en2; delay_ms(x); en2=!en2; delay_ms(y); *wuxian.h:1.SPI指令宏定义#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留2.寄存器地址宏定义#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#define OBSERVE_TX 0x08 / 发送监测功能#define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / 频道1接收数据地址#define RX_ADDR_P2 0x0C / 频道2接收数据地址#define RX_ADDR_P3 0x0D / 频道3接收数据地址#define RX_ADDR_P4 0x0E / 频道4接收数据地址#define RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX_ADDR 0x10 / 发送地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置3.SPI写时序,写入一个字节uchar SPI_RW(uchar byte)uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit MOSI = (byte & 0x80); / output byte, MSB to MOSIbyte = (byte 1); / shift next bit into MSB.SCK = 1; / Set SCK high.byte |= MISO; / capture current MISO bitSCK = 0; / .then set SCK low again return(byte); / return read byte4.设置寄存器reg的值。(同时返回状态字)uchar SPI_RW_Reg(uchar reg, uchar value)uchar status;CSN = 0; / CSN low, init SPI transactionstatus = SPI_RW(reg); / select registerSPI_RW(value); / .and write value to it.CSN = 1; / CSN high againreturn(status); / return nRF24L01 status uchar5.读取寄存器的值。uchar SPI_Read(uchar reg)uchar reg_val;CSN = 0; / CSN low, initialize SPI communication.SPI_RW(reg); / Select register to read from.reg_val = SPI_RW(0); / .then read registervalueCSN = 1; / CSN high, terminate SPI communicationreturn(reg_val); / return register value6.接收时读取FIFO缓存区的值。uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)uchar status,uchar_ctr;CSN = 0; / Set CSN low, init SPI tranactionstatus = SPI_RW(reg); / Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctrbytes;uchar_ctr+)pBufuchar_ctr = SPI_RW(0); CSN = 1; return(status); / return nRF24L01 status uchar7.把数据写入发射缓冲区。uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)uchar status,uchar_ctr;CSN = 0; /SPI使能 status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctrbytes; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1; /关闭SPIreturn(status); / 8.RX模式初始化,开始接收数据包void SetRX_Mode(void)CE=0;SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / Use the same address on the RX device as the TX deviceSPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允许接收地址只有频道0SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 设置信道工作频率为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为20字节(/32)SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /设置发射速率为1MHZ,发射功率为最大值0dBSPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); /接收模式CE = 1; inerDelay(130);9.读出接收的数据。uchar nRF24L01_RxPacket(uchar* rx_buf) uchar revale=0;/SetRX_Mode();sta=SPI_Read(STATUS);/ read register STATUSs valueif(RX_DR)/ if receive data ready (RX_DR) interrupt CE = 0; SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferrevale =1;/we have receive dataSPI_RW_Reg(WRITE_REG+STATUS,sta);/ clear RX_DR or TX_DS or MAX_RT interrupt flagreturn revale; 10.TX模式初始化,发送数据包,激发发送void nRF24L01_TxPacket(unsigned char *tx_buf)CE=0;SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); /SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); /自动重发?SPI_RW_Reg(WRITE_REG + RF_CH, 0); SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); /发射模式CE=1;inerDelay(10);/sta=SPI_Read(STATUS);/ read register STATUSs value/SPI_RW_Reg(WRITE_REG+STATUS,SPI_Read(READ_REG+STATUS);/ clear interrupt flag(TX_DS)11.void init()inerDelay(100); CE=0; / chip enableCSN=1; / Spi disable SCK=0; / Spi clock line init high SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 设置信道工作频率为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为20字节(/32)SPI_RW_Reg(WRITE_REG +SETUP_AW,0x02); /地址宽度为5字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /设置发射速率为1MHZ,发射功率为最大值0dBSPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / 中断使能,16位CRC,接收模式,上电SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,RX_ADDRESS, RX_ADR_WIDTH); / 写接收端地址SPI_RW(FLUSH_TX);SPI_RW (FLUSH_RX);*chumoping.h:1. SPI写数据 Void WriteCharTo7843(unsigned char num) unsigned char count=0;DCLK=0;for(count=0;count8;count+)num=1;DIN=CY;DCLK=0; _nop_();_nop_();_nop_(); /上升沿有效DCLK=1; _nop_();_nop_();_nop_();2.读数据unsigned int ReadFromCharFrom7843() unsigned char count=0;unsigned int Num=0;for(count=0;count12;count+)Num=1;DCLK=1; _nop_();_nop_();_nop_(); /下降沿有效DCLK=0; _nop_();_nop_();_nop_();if(DOUT) Num+;return(Num); void delayms(int count) / /* X1ms */ int i,j; for(i=0;icount;i+) for(j=0;j8,com); Lcd_Write_Data(val8,val);void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)Lcd_Write_Com(0x00,0x20);Lcd_Write_Data(x18,x1); /设置X坐标位置 Lcd_Write_Com(0x00,0x21);Lcd_Write_Data(y18,y1); /设置Y坐标位置 Lcd_Write_Com(0x00,0x50);Lcd_Write_Data(x18,x1); /开始XLcd_Write_Com(0x00,0x52);Lcd_Write_Data(y18,y1); /开始Y Lcd_Write_Com(0x00,0x51);Lcd_Write_Data(x28,x2); /结束XLcd_Write_Com(0x00,0x53);Lcd_Write_Data(y28,y2); /结束Y Lcd_Write_Com(0x00,0x22); void Lcd_Init(void) LCD_REST=1; delayms(5);LCD_REST=0;delayms(5);LCD_REST=1;LCD_CS=1;LCD_RD=1;LCD_WR=1;delayms(5);LCD_CS =0; /打开片选使能/* Start Initial Sequence */Lcd_Write_Com_Data(0x0001, 0x0100); / set SS and SM bitLcd_Write_Com_Data(0x0002, 0x0200); / set 1 line inversionLcd_Write_Com_Data(0x0003, 0x1030); / set GRAM write direction and BGR=1.Lcd_Write_Com_Data(0x0004, 0x0000); / Resize registerLcd_Write_Com_Data(0x0008, 0x0207); / set the back porch and front porchLcd_Write_Com_Data(0x0009, 0x0000); / set non-display area refresh cycle ISC3:0Lcd_Write_Com_Data(0x000A, 0x0000); / FMARK functionLcd_Write_Com_Data(0x000C, 0x0000); / RGB interface settingLcd_Write_Com_Data(0x000D, 0x0000); / Frame marker PositionLcd_Write_Com_Data(0x000F, 0x0000); / RGB interface polarity/*Power On sequence */Lcd_Write_Com_Data(0x0010, 0x0000); / SAP, BT3:0, AP, DSTB, SLP, STBLcd_Write_Com_Data(0x0011, 0x0007); / DC12:0, DC02:0, VC2:0Lcd_Write_Com_Data(0x0012, 0x0000); / VREG1OUT voltageLcd_Write_Com_Data(0x0013, 0x0000); / VDV4:0 for VCOM amplitudeLcd_Write_Com_Data(0x0007, 0x0001);delayms(200); / Dis-charge capacitor power voltageLcd_Write_Com_Data(0x0010, 0x1690); / SAP, BT3:0, AP, DSTB, SLP, STBLcd_Write_Com_Data(0x0011, 0x0227); / Set DC12:0, DC02:0, VC2:0delayms(50); / Delay 50msLcd_Write_Com_Data(0x0012, 0x000D); / 0012delayms(50); / Delay 50msLcd_Write_Com_Data(0x0013, 0x1200); / VDV4:0 for VCOM amplitudeLcd_Write_Com_Data(0x0029, 0x000A); / 04 VCM5:0 for VCOMHLcd_Write_Com_Data(0x002B, 0x000D); / Set Frame Ratedelayms(50); / Delay 50msLcd_Write_Com_Data(0x0020, 0x0000); / GRAM horizontal AddressLcd_Write_Com_Data(0x0021, 0x0000); / GRAM Vertical Address/ Adjust the Gamma Curve /Lcd_Write_Com_Data(0x0030, 0x0000);Lcd_Write_Com_Data(0x0031, 0x0404);Lcd_Write_Com_Data(0x0032, 0x0003);Lcd_Write_Com_Data(0x0035, 0x0405);Lcd_Write_Com_Data(0x0036, 0x0808);Lcd_Write_Com_Data(0x0037, 0x0407);Lcd_Write_Com_Data(0x0038, 0x0303);Lcd_Write_Com_Data(0x0039, 0x0707);Lcd_Write_Com_Data(0x003C, 0x0504);Lcd_Write_Com_Data(0x003D, 0x0808);/ Set GRAM area /Lcd_Write_Com_Data(0x0050, 0x0000); / Horizontal GRAM Start AddressLcd_Write_Com_Data(0x0051, 0x00EF); / Horizontal GRAM End AddressLcd_Write_Com_Data(0x0052, 0x0000); / Vertical GRAM Start AddressLcd_Write_Com_Data(0x0053, 0x013F); / Vertical GRAM Start AddressLcd_Write_Com_Data(0x0060, 0xA700); / Gate Scan LineLcd_Write_Com_Data(0x0061, 0x0001); / NDL,VLE, REVLcd_Write_Com_Data(0x006A, 0x0000); / set scrolling line/ Partial Display Control /Lcd_Write_Com_Data(0x0080, 0x0000);Lcd_Write_Com_Data(0x0081, 0x0000);Lcd_Write_Com_Data(0x0082, 0x0000);Lcd_Write_Com_Data(0x0083, 0x0000);Lcd_Write_Com_Data(0x0084, 0x0000);Lcd_Write_Com_Data(0x0085, 0x0000);/ Panel Control /Lcd_Write_Com_Data(0x0090, 0x0010);Lcd_Write_Com_Data(0x0092, 0x0000);Lcd_Write_Com_Data(0x0007, 0x0133); / 262K color and display ONLCD_CS =1; /关闭片选使能 void Pant(char VH,char VL)int i,j;Address_set(0,0,240,320); for(i=0;i320;i+) for (j=0;j240;j+) Lcd_Write_Data(VH,VL); void inttostr(int dd,unsigned char *str)str0=dd/10000+48;str1=(dd/1000)-(dd/10000)*10)+48;str2=(dd/100)-(dd/1000)*10)+48;str3=(dd/10)-(dd/100)*10)+48;str4=dd-(dd/10)*10)+48;str5=0;void AD7843(void) /外部中断0 用来接受键盘发来的数据 CS=0;/delayms(1); /中断后延时以消除抖动,使得采样数据更准确/while(BUSY); /如果BUSY信号不好使可以删除不用/delayms(1);WriteCharTo7843(0x90); /送控制字 10010000 即用差分方式读X坐标 详细请见有关资料/while(BUSY); /如果BUSY信号不好使可以删除不用/delayms(1);DCLK=1; _nop_();_nop_();_nop_();_nop_();DCLK=0; _nop_();_nop_();_nop_();_nop_();TP_Y=ReadFromCharFrom7843();WriteCharTo7843(0xD0); /送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料DCLK=1; _nop_();_nop_();_nop_();_nop_();DCLK=0; _nop_();_nop_();_nop_();_nop_();TP_X=ReadFromCharFrom7843();CS=1;/在指定位置显示一个字符(8*12大小)/dcolor为内容颜色,gbcolor为背静颜色void showzifu(unsigned int x,unsigned int y,unsigned char value,unsigned int dcolor,unsigned int bgcolor) unsigned char i,j;unsigned char *temp=zifu; Address_set(x,y,x+7,y+11); /设置区域 temp+=(value-32)*12;for(j=0;j12;j+)for(i=0;i8;i+) if(*temp&(18,dcolor); elseLcd_Write_Data(bgcolor8,bgcolor); temp+; /在指定位置显示一个字符串(8*12大小)/dcolor为内容颜色,gbcolor为背静颜色void showzifustr(unsigned int x,unsigned int y,unsigned char *str,unsigned int dcolor,unsigned int bgcolor) unsigned int x1,y1;x1=x;y1=y;while(*str!=0)showzifu(x1,y1,*str,dcolor,bgcolor);x1+=7;str+;void point()unsigned char ss6;unsigned int lx,ly;long i;i=0;Pant(0xff,0xff);/清屏while(i200000)if(Penirq=0)i=0;AD7843(); inttostr(TP_X,ss);showzifustr(10,305,X:,0xf800,0xffff);showzifustr(25,305,ss,0xf800,0xffff);/显示字符串 inttostr(TP_Y,ss);showzifustr(80,305,Y:,0xf800,0xffff);showzifustr(95,305,ss,0xf800,0xffff);/显示字符串 lx=240-(TP_X-400)/13);ly=320-(TP_Y-400)/10);Address_set(lx,ly,lx+2,ly+2);Lcd_Write_Data(0,255);Lcd_Write_Data(0,255);Lcd_Write_Data(0,255);Lcd_Write_Data(0,255);Lcd_Write_Data(0,255);Lcd_Write_Data(0,255);Lcd_Write_Data(0,255);Lcd_Write_Data(0,255);Lcd_Write_Data(0,255); elsei+; main() unsigned int i,j,k;spistar(); /模拟spi初始化 while(1)Lcd_Init(); /tft初始化LCD_CS =0; /打开片选使能Pant(0xff,0xff);/清屏for(k=0;k8;k+) /刷图片 for(j=0;j6;j+)if (Penirq=0) point(); Address_set(40*j,40*k,40*j+39,40*k+39); for(i=0;i1600;i+) Lcd_Write_Data(imagei*2+1,imagei*2); delayms(500); *上位机部分的一些程序代码#include stdafx.h#include SH2.h#include SH2Dlg.h#include #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifCString FilePath=c:record.txt;/创建文件声明CString Fh=c:rd.txt;/创建文件声明/CFile file;CStdioFile file;int xybegin,xyend,m_hchflag=0,x_10min,x_10min2;void record(CString str_wd22,CString str_time22,CString str_rcd_hour22,CString str_rcd_10min22);float wd,wd_show,/定义2个温度 x_time=0; /定义一个时间CString str_wd,/定义一个温度字符 str_time,/定义一个时间字符串 str_hour,str_10min, str_hour2,str_10min2;/*/ CSH2Dlg dialogCSH2Dlg:CSH2Dlg(CWnd* pParent /*=NULL*/): CDialog(CSH2Dlg:IDD, pParent)/AFX_DATA_INIT(CSH2Dlg)m_str_recv = _T();m_str_send = _T();m_static_show = _T();m_hch = FALSE;/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CSH2Dlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CSH2Dlg)DDX_Control(pDX, IDC_BUTTON2, m_forword);DDX_Control(pDX, IDC_BUTTON1, m_back);DDX_Control(pDX, IDC_OPEN_CLOSE, m_serial);DDX_Text(pDX, IDC_EDIT1_RECV, m_str_recv);DDX_Text(pDX, IDC_EDIT2_SEND, m_str_send);DDX_Control(pDX, IDC_MSCOMM1, m_comm1);DDX_Control(pDX, IDC_NTGRAPHCTRL1, m_Graph);DDX_Text(pDX, IDC_STATIC01, m_static_show);DDX_Check(pDX, IDC_HOURCHECK1, m_hch);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CSH2Dlg, CDialog)/AFX_MSG_MAP(CSH2Dlg)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_SEND, OnSend)ON_BN_CLICKED(IDC_OPEN_CLOSE, OnOpenClose)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_HOURCHECK1, OnHourcheck1)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CSH2Dlg message handlersBOOL CSH2Dlg:OnInitDialog()CDialog:OnInitDialog();/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization here/*/m_Graph.ClearGraph(); / The Element 0 is allocated by default m_Graph.SetElementLineColor(RGB(125,255,0); / Add the second graph element m_Graph.AddElement(); m_Graph.SetElementLineColor(RGB(255,255,0); /m_Graph.SetElementIdentify(FALSE);m_Graph.SetElementIdentify(TRUE); m_Graph.SetShowGrid(TRUE);/按每10分钟初始化 m_Graph.SetXGridNumber(10);/设置X轴等分点数,即网格宽度(注意和函数SetRange()的关系) m_Graph.SetYGridNumber(20);/设置Y轴等分点数m_Graph.SetRange (0,10,0,100);/设置横轴和纵轴的范围,前两位是横轴,后两位是纵轴m_Graph.SetXLabel(X轴00时00分至00时00分);/设置横轴名称 m_Graph.SetYLabel(温度值/);/设置纵轴名称m_Graph.SetFrameStyle(1);/*/*/ m_static_show=当前温度为:00.0;/更新静态文本控件 UpdateData(FALSE); /*/if(! m_comm1.GetPortOpen()/判断串口是否已经打开m_comm1.SetCommPort(3); /选择串口号2m_comm1.SetPortOpen(TRUE);/打开串口m_comm1.SetRThreshold(2); /收到两个字节引发OnComm事件m_comm1.SetInputMode(1);/输入模式选为二进制m_comm1.SetSettings(9600,n,8,1);/设置串口参数,波特率9600,无奇偶校验,1位停止位,8位数据位MessageBox(串口初始化完毕,提示);/提示串口成功初始化else MessageBox(串口被占用,提示);/如果已经打开串口,消息框提醒m_serial.SetWindowText(关闭串口);/按钮显示状态改变/*/return TRUE; / return TRUE unless you set the focus to a control/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CSH2Dlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CSH2Dlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CSH2Dlg:OnSend() / TODO: Add your control notification handler code hereUpdateData(TRUE);m_comm1.SetOutput(COleVariant(m_str_send);/由于SetOutput函数的参数为void CSH2Dlg:OnOpenClose() / TODO: Add your control notification handler code hereif(! m_comm1.GetPortOpen()/判断串口是否已经打开m_comm1.SetPortOpen(TRUE);/如果串口是关闭的,则打开串口m_serial.SetWindowText(关闭串口);/按钮显示状态改变else m_comm1.SetPortOpen(FALSE);/如果已经打开串口,则关闭串口m_serial.SetWindowText(打开串口);/按钮显示状态改变BEGIN_EVENTSINK_MAP(CSH2Dlg, CDialog) /AFX_EVENTSINK_MAP(CSH2Dlg)ON_EVENT(CSH2Dlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)/AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CSH2Dlg:OnOnCommMscomm1() / TODO: Add your control notification handler code here/*/VARIANT variant1;/定义VARIANT型变量,用于存放接收到的数据COleSafeArray safearray;/定义safearray型变量LONG len,k;/定义长整型变量len,kBYTE rxdata2048;/定义BYTE型数组if(m_comm1.GetCommEvent()=2)/判断引起OnComm时间的原因/如果是接收到特定个字节数,则读取接收到的数据/*温度数据获取*/variant1 = m_comm1.GetInput();/把接收到的数据存放到VARIANT型变量里safearray = variant1;/VARIANT型变量转换为ColeSafeArray型变量len = safearray.GetOneDimSize();for(k=0;klen;k+)safearray.GetElement(&k,rxdata+k);/得到接接收到的数据放到BYTE型数组rxdata里wd=( float (rxdata0*127+rxdata1) )/10;/BYTE转float型wd_show=wd;/*/从上输出float型温度wd、wd_show/*时间数据获取*/float x_time;int x_hour;/CString str_time,str_hour,str_10min,/str_hour2,str_10min2;CTime tt;tt=CTime:GetCurrentTime();str_time=tt.Format(%X);/00:00;00 /输出Cstring型时间str_timechar a10; strncpy(a,(LPCTSTR)str_time,sizeof(a); /CString转换 char a10x_time = (float(a3-48)*600+(a4-48)*60+(a6-48)*10+a7-48)/60;/输出float型时间x_time;单位min分,带秒x_hour=(a0-48)*10+(a1-48);/int型时间x_hourx_10min=(a3-48);/int型时间x_10minx_10min2=x_10min+1;if(x_10min=5)x_10min2=0;str_hour.Format(%.2d,x_hour);/输出Cstring型时间str_hour;str_hour2.Format(%.2d,x_hour+1);str_10min.Format(%.1d,x_10min);/输出Cstring型时间str_10min;str_10min2.Format(%.1d,x_10min2);/*/从上输出Cstring型时间if(!m_hch)m_Graph.SetXGridNumber(10);/设置X轴等分点数,即网格宽度(注意和函数SetRange()的关系)m_Graph.SetYGridNumber(20);/设置Y轴等分点数m_Graph.SetRange (x_10min*10,(x_10min+1)*10,0,100);/设置横轴和纵轴的范围,前两位是横轴,后两位是纵轴m_Graph.SetCaption( 温度曲线+str_hour+时+str_10min+0分至+str_hour2+时+str_10min2+0分 );/设置标题m_Graph.SetXLabel(X轴+str_hour+时+str_10min+0分至+str_hour2+时+str_10min2+0分);/设置横轴名称m_Graph.PlotXY(x_time,wd,0);/绘图str_wd.Format(%4.1f,wd_show);/float型wd_show转Cstring型m_static_show=当前温度为:+str_wd+;/加入静态文本控件UpdateData(FALSE);/更新静态文本控件/*/record(str_wd,str_time,str_hour,str_10min);void CSH2Dlg:OnButton1()/ TODO: Add your control notification handler code here/*3 移动文件指针file.Seek(100,CFile:begin);/从文件头开始往下移动100字节file.Seek(-50,CFile:end);/ 从文件末尾往上移动50字节file.Seek(-30,CFile:current);/从当前位置往上移动30字节file.SeekToBegin();/ 移到文件头file.SeekToEnd();/移到文件尾4读写文件读文件:char buffer1000;file.Read(buffer,1000);写文件:CString string(自强不息);file.Write(string,8);*/void getdata(int hour,int min10,int bzh)int inhour,
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。