范文一:大棚温度控制系统
题目:大棚温度控制系统
姓名
学号:
指导老师:
目 录
摘 要 ..................................................................................................... 3
一、 系统概述 ....................................................................................... 4
1.1 课题背景 .................................................................................... 4
1.2 本系统主要研究内容 ................................................................. 4
二、 系统的主要模块 ............................................................................ 4
1.控制部分 ........................................................................................ 6
2.上位机部分 .................................................................................... 6
3.温湿度检测模块............................................................................. 7
4.当前状态显示 ................................................................................ 8
5.马达部分 ........................................................................................ 9
三、 实验结果 ..................................................................................... 10
四、实验心得 ....................................................................................... 11
五、参考文献 ....................................................................................... 11
六、实验程序 ....................................................................................... 12
摘 要
随着人们生活水平的日益增长,对蔬菜的要求也越来越高,对大棚温度的控制就是一个重要的因素,温度过高,蔬菜就会停止生长甚至是死亡,而温度过低,蔬菜也会生长过慢,也会出现死亡现象。所以,对大棚温湿度实现自动控制是很有必要的。本设计共包括四章,主要包括绪论,系统的硬件设计、系统的软件设计,上位机的实现。本设计的主要功能是:1.利用89c52单片机实现大棚温湿度的智能控制,使室温温度能控控制在作物最佳生长的温度18-26度之间。2.通过对89c52的编程,对数字温湿度传感器dht11发出控制命令开始采集温湿度的数据,最后把采集的数据送去上位机去显示,如果温度超出了设定的范围,89c52单片机会自动进行检测并执行相应的处理程序,也会做出相应的警告。总之,本系统以89c52单片机为控制核心的测控仪,主要是为了对大棚的温湿度检测和控制而设计的,该控制仪具有检测精度高、使用简单、成本较低和工作稳定可靠的特点,具有很好的应用前景。 8051单片机是常用于控制的芯片,在智能仪器仪表、工业检测控制、机电一体化等方面取得了令人瞩目的成果,用其作为温湿度控制系统的实例也很多。使用8051单片机能够实现温湿度全程的自动控制,而且8051单片机易于学习、掌握,性价比高。
使用8051型单片机设计温湿度控制系统,可以及时、精确的反映室内的温度以及湿度的变化。完成诸如升温到特定温度、降温到特定温度、在温度上下限范围内保持恒温等多种控制方式,在湿度控制方面也是如此。将此系统应用到温室当中无疑为植被的生长提供了更加适宜的环境。
关键字: 大棚温湿度控制系统 89c52 上位机
一、系统概述
应用自动控制盒电子计算机实现农业生产和管理的自动化,是农业现代化的重要标志之一。近年来电子技术和信息技术的飞速发展,带来了温度控制与管理技术方面的一场革命。随着“设施农业”“虚拟农业”等新名词的出现。温度计算机控制与管理系统正在不断的吸收自动控制和信息管理领域的理论和方法,结合温室作物种植特点,不断创新,逐步完善,从而使得温室种植业实现真正意义上的现代化、产业化。
1.1 课题背景
改革开放以来,人们对生活质量要求显著提高,对美丽的植被和花卉的需求量也急剧上升,这对以种植植被为生计的园林工人是一个机遇,同时也对传统的手工植被种植是一个挑战,而基于单片机的温湿度控制系统对解决这些问题有着非常重大的意义。
前种植植被一般都用温室栽培,为了充分的利用好温室栽培这一高效技术,就必需有一套科学的,先进的管理方法,用以对不同种类植被生长的各个时期所需的温度及湿度等进行实时的监控。温湿度控制对于单片机的应用具有一定的实际意义,它代表了一类自动控制的方法。而且其应用十分广泛。
1.2 本系统主要研究内容
本系统所要完成的任务是:
1.2.1人性化的设计。界限温度值及湿度值能够由用户根据不同植被的各种生长需求由键盘输入并通过显示器显示。
1.2.2 能够实时、准确的显示采样温度值与湿度值。
1.2.3通过采集温度及湿度值,准确的判断标准值与当前值之间的差异,及时的启动报警装置(包括警报灯的提示功能以及提示音等)进行报警,并采取相应的方案。
1.2.4能够根据植被在不同时间段内对温湿度的不同要求,用户可随机更改温度及湿度值,以满足用户不同的需求。
二、系统的主要模块
本实验为一个全自动温湿度检测与控制系统,有以下的几个部分组成:STC89C52单片机、温度检测、显示部分、马达以及相应的报警装置,组成框图如下:
温湿度显示
STC 检测电上位机
89C52 路
单片机
马达控制
降温设备
当前状态显示
报警装置 led
系统正常工作时的过程为:
开始
用户检查
上位机打开com口
N显示“打开com失败”打开,
Y
传感器采集数据
Y
采集出错报告给单片机
N
送上位机显示
1.控制部分
本实验的控制部分采用89c52单片机,原因是51系列单片机功能很简单实用,比其他系列的单片机更加容易上手,程序编写也比较简单,不需要像m3单片机那样去分配I/O端口,51单片机是最基本的单片机,完成一个大棚温湿度控制系统还是很好的选择。而系统的显示部分是利用VC++编程开发环境设计了一个简单的上位机页面,利用单片机的最小系统可以很方便的实现单片机与上位机的通信问题,单片机的P2^2引脚接到温湿度传感器DHT11,通过控制引脚上的高低电平时间可以实现对温湿度的采集。
89C52是INTEL公司MCS-51系列单片机中基本的产品,它采用ATMEL公司可靠的CMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。它结合了CMOS的高速和高密度技术及CMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于89C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。89C52内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
2.上位机部分
51单片机对采集到的温度进行判断和处理,然后通过串行口把数据送至上位机进行显示。上位机上还有按键可以直接实现对当前温度的控制,按下“升温”按键,上位机将对单片机发送一个为0x12的字符,当单片机检测到这样的字符后,单片机将自动运行升温函数,并让“低温灯”亮起来。同理,按下“降温”按键,上位机将对单片机发送一个为0x13的字符,当单片机检测到这样的字符后,单片机将自动运行降温函数,并让“高温灯”亮起来,然后让p2^7引脚的电平拉高,电流经过uln2003芯片放大后可以直接驱动电机转动,单片机将温度送去显示。按下“自动”按键后,上位机发送0x32的指令,命令单片机将采集到的数据上传至上位机从而进行显示。上位机与单片机的通信是通过中断实现的,是串口中断,响应程序里写上相关的命令即可实现。同时,上位机上还对当前的温湿度范围进行了显示,但不可以更改。
3.温湿度检测模块
温湿度传感器的选择:市面上的温湿度传感器的种类有很多,DHT11传感器是单引线数字输出温湿度传感器,从经济性和实用性上考虑,DHT11传感器是一个很好的选择。DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据 +8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待
,并触发一次信号采主机开始信号结束后,DHT11发送响应信号,送出40bit的数据
集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
4.当前状态显示
本系统通过DHT11对当前的温湿度进行采集,然后将采集到的数据传送至51单片机,单片机对传感器送来的数据进行处理,判断当前的温度是否在18-26度的范围内,当室温小于18度时,单片机将自动运行升温函数,并让“低温灯”亮起来,单片机将温度送去显示。而升温的过程将用不停闪烁的led灯来模拟,当室温大于26度时,单片机将自动运行降温函数,并让“高温灯”亮起来,然后让p1^3引脚的电平拉高,驱动电机转动,从而实现降温的目的。
5.马达部分
当时下的室温温度高于设定的温度值时,农作物不宜生长,应该要进行降温。当dht11检测到后,送于单片机。然后让p1^3引脚的电平拉高,电流经过uln2003芯片放大后可以直接驱动电机转动,从而实现降温的目的。
ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。 ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还 可以在高负载电流并行运行。 ULN2003 采用DIP—16 或SOP—16 塑料封装。封装外形图
ULN2003内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTL COMS,由达林顿管组成驱动电路。 ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可直接驱动继电器或固体
继电器,也可直接驱动低压灯泡。通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。 ULN2003是一个非门电路,包含7个单元,单独每个单元驱动电流最大可达350mA,9脚可以悬空。 比如1脚输入,16脚输出,你的负载接在VCC与16脚之间,不用9脚。
三、实验结果
由于实验是用上位机显示,没有涉及液晶的使用。所以要用到电脑,系统采用5v的电源供电,51最小系统的电源也是5v,所以没有做独立电源,而是通过串口线和电源线让电脑给最小系统供电,再把电源引脚接出来给温度采集系统供电。当系统能够正常工作时,单片机的引脚输出波形为:
系统上位机的显示部分为:
四、实验心得:
以前的设计总是要求仿真,只要仿真结果能出来就什么都ok啦~但通过这次做实物,的确让我遇到了很多的困难,就好比程序与实物的端口不匹配,甚至是在芯片上都会忘记加上电源线,焊接的问题也老是使得结果出现了很多意想不到的错误。还有一次修改跳线的时候竟然忘记了关掉电源,还烧掉了一只led和一片51单片机。Dht11的调试过程也是花费了好久的时间,最后是求助于同学,才勉强实现了温湿度的采样,这次由于精度的原因只是对小数点后的数显示了2-3位。此次设计是在我的同学支持下完成的。本系统的设计成功与同学的帮助是密不可分的,再加上自身的努力才能圆满地完成预期的目标。使得我对新知识,新事物都有了自己独到的理解,这深深的影响了我今后对学习的态度,将使我终生难忘。同学一丝不茍的工作态度和认真负责的敬业精神也同样给了我巨大的收益和鼓舞。这些都将使我受益匪浅,同时也要感谢我的父母,不是你们我就不可能在大学校园里,也就不可能有这个毕业设计~
最后,我要以最真挚的感情来感谢指导本次毕业设计中的导师,是您们用辛勤的劳动、无私的奉献和渊博的知识换来了我的毕业设计。同时感谢各位同学对我的帮助,只有我们不断的努力学习,明天才会更加美好,因为机会永远属于那些有准备的人。
五、参考文献
[1]周坚,单片机轻松入门[M].北京:北京航空航天出版社,2002.
[2]胡辉.王晓,戴永成.单片机原理及应用设计[M].北京:中国水利水电出版社,2005. P6 ,P181
[3] http://www.lyeny.com/Article/ShowArticle.asp?ArticleID=113[Z].
[4]张毅刚,彭喜元,彭宇,单片机原理及运用[M].北京:高等教育出版社,2010.
六、实验程序
#include #define ERROR 0 while(dht11==0); #define uchar unsigned char static void //26-28us 的高电平表示该#define uint unsigned int DHT11_Delay_10us(void) 位是0,为70us 高电平表该uint warng=26; //温度{ 位1 上限 unsigned char i; DHT11_Delay_10us(); uint warnd=18; //温度i--; DHT11_Delay_10us(); 下限 i--; DHT11_Delay_10us(); uchar str[5]; i--; DHT11_Delay_10us(); int temp_value, humi_value; i--; //延时30us 后检测数据线static unsigned char i--; 是否还是高电平 ReadValue(void); i--; if(dht11!=0) sbit gw=P2^0; //高} { 温灯 //进入这里表示该位是1 sbit dw=P2^1; //低温灯 value++; sbit dht11=P2^2; //温度 ///*读一个字节的数据*/ //等待剩余(约40us)的高电传感器 void 平结束 sbit sw=P2^3; //升温DHT11_ReadValue(void) while(dht11!=0); 标志 { } sbit md=P2^7; //unsigned char value=0,i,j; } 马达转动 dht11=0; //拉低数据线大于str[j]=value; ***********************18ms 发送开始信号 } ***********************Delay_1ms(20); //需大于18 } ********************** 毫秒 * 名称 : Delay_1ms() dht11=1; //释放数据线,用于 * 功能 : 延时,延时时间大检测低电平的应答信号 概为1mS。 //延时20-40us,等待一段时 * 输入 : 无 间后检测应答信号,应答信/************************ 输出 : 无 号是从机拉低数据线80us **********************************************DHT11_Delay_10us(); ********************** ***********************DHT11_Delay_10us(); * 名称 : jiangwen() ***********************DHT11_Delay_10us(); * 功能 : 降温函数 **/ DHT11_Delay_10us(); * 输入 : 无 for(j=0;j<5;j++) *="" 输出="" :="" 无="">5;j++)> extern void { ***********************Delay_1ms(unsigned int ms) value=0; ***********************{ for(i=8;i>0;i--) ***********************unsigned int x,y; { **/ for(x =ms;x>0;x--) //高位在先 void jiangwen() { md=1; jiangwen(); //降温函数 串行接收 P0=0xff; } TH1 = 0xFd; //设 Delay_1ms(100); else if(t P0=0x00; 于24度 TL1 = 0xFd; } { TR1 = 1; //启 dw=1;//低温灯亮 动定时器1 /*********************** shengwen();//升温函数 ES = 1; //开串口 *********************** } 中断 ********************** else EA = 1; //开总中 * 名称 : shengwen() if((warnd<> * 功能 : 升温函数 { gw=0; * 输入 : 无 Delay_1ms(10); dw=0; * 输出 : 无 } md=0; *********************** } sw=0; *********************** } ***********************/***********************/*************************/ ********************************************** void shengwen() ********************** ********************** { uint i; * 名称 : send() * 名称 : Main() sw=1; * 功能 : 串口发送函数。 * 功能 : 主函数 for (i=0;i<8;i++) *="" 输入="" :="" 要发送的值="" *="" 输入="" :="" 无="">8;i++)> { * 输出 : 无 * 输出 : 无 sw=~sw; ********************************************** Delay_1ms(100); ********************************************** } **********************************************} **/ **/ void send(uchar m) void Main() /***********************{ { Com_Init(); *********************** SBUF=m; while(1) ********************** while(!TI); { * 名称 : DEAL() TI=0; DHT11_ReadValue(); * 功能 : 温度处理函数。 } Delay_1ms(2000); * 输入 : 当前温度 deal(str[2]); * 输出 : 无 } *********************** //串口初始化 } ***********************void Com_Init(void) ***********************{ void Com_Int(void) interrupt **/ TMOD = 0x20; //4 void deal(uint t) //温度处定时器工作在定时器1的方{ 理 式2 unsigned char Temp; { PCON = 0x00; //不//定义临时变量 if(t>warng) //温度大倍频 于27度 SCON = 0x50; //串 if(RI) {gw=1; //高温灯亮 口工作在方式1,并且启动//判断是接收中断产生 { #include "dapengDlg.h" //}}AFX_MSG RI=0; #include "RS485Comm.h" DECLARE_MESSAGE//标志位清零 _MAP() Temp=SBUF; #ifdef _DEBUG }; //读入缓冲区的值 #define new DEBUG_NEW switch(Temp) #undef THIS_FILE CAboutDlg::CAboutDlg() : { static char THIS_FILE[] = CDialog(CAboutDlg::IDD) case 0x11: __FILE__; { deal(str[2]); break; #endif //{{AFX_DATA_INIT( CAboutDlg) case 0x12: ////////////////////////////////////////// //}}AFX_DATA_INIT shengwen(); break; /////////////////////////////////// } // CAboutDlg dialog used for case 0x13: App About void jiangwen();break; CAboutDlg::DoDataExchang class CAboutDlg : public e(CDataExchange* pDX) case 0x32: CDialog { send(str[2]/10+48); { CDialog::DoDataExcha send(str[2]%10+48); public: nge(pDX); send(str[3]/100+48); CAboutDlg(); //{{AFX_DATA_MAP( CAboutDlg) send(str[3]%100/10+48); // Dialog Data //}}AFX_DATA_MAP //{{AFX_DATA(CAbou} send(str[3]%100%10+48); tDlg) send(str[0]/100+48); enum { IDD = BEGIN_MESSAGE_MAP( IDD_ABOUTBOX }; CAboutDlg, CDialog) send(str[0]%100/10+48); //}}AFX_DATA //{{AFX_MSG_MAP( CAboutDlg) send(str[0]%100%10+48); // ClassWizard // No message send(str[1]/100+48); generated virtual function handlers overrides //}}AFX_MSG_MAP send(str[1]%100/10+48); //{{AFX_VIRTUAL(CEND_MESSAGE_MAP() break; AboutDlg) } protected: ////////////////////////////////////////// } virtual void /////////////////////////////////// } DoDataExchange(CDataExc// CDapengDlg dialog hange* pDX); // static int i = 0; 上位机程序: DDX/DDV support CDapengDlg::CDapengDlg(// dapengDlg.cpp : //}}AFX_VIRTUAL CWnd* pParent /*=NULL*/) implementation file : // // Implementation CDialog(CDapengDlg::IDD, protected: pParent) #include "stdafx.h" //{{AFX_MSG(CAbout{ #include "dapeng.h" Dlg) //{{AFX_DATA_INIT( CDapengDlg) IDC_WENmax, C_ZHUANGTAI, m_wendu = _T(""); m_wenmax); OnChangeZhuangtai) m_lszd = _T("0"); DDX_Text(pDX, ON_WM_TIMER() m_lszg = _T("0"); IDC_WENmin, m_wenmin); //}}AFX_MSG_MAP m_shi = _T(""); DDX_Text(pDX, END_MESSAGE_MAP() m_shimax = _T("70"); IDC_ZHUANGTAI, m_shimin = _T("40"); m_zhuangtai); ////////////////////////////////////////// m_wen = _T(""); //}}AFX_DATA_MAP /////////////////////////////////// m_wenmax = _T("26"); } // CDapengDlg message m_wenmin = _T("18"); handlers m_zhuangtai = _T("自BEGIN_MESSAGE_MAP( 动"); CDapengDlg, CDialog) BOOL //}}AFX_DATA_INIT //{{AFX_MSG_MAP(CDapengDlg::OnInitDialog() // Note that LoadIcon CDapengDlg) { does not require a subsequent ON_WM_SYSCOMM CDialog::OnInitDialog(DestroyIcon in Win32 AND() ); m_hIcon = ON_WM_PAINT() AfxGetApp()->LoadIcon(ID ON_WM_QUERYDRA // Add "About..." menu R_MAINFRAME); GICON() item to system menu. } ON_BN_CLICKED(ID C_ZIDONG, OnZidong) // IDM_ABOUTBOX void ON_BN_CLICKED(IDmust be in the system CDapengDlg::DoDataExchaC_SHENGWEN, command range. nge(CDataExchange* pDX) OnShengwen) ASSERT((IDM_ABOU{ ON_BN_CLICKED(IDTBOX & 0xFFF0) == CDialog::DoDataExchaC_JIANGWEN, IDM_ABOUTBOX); nge(pDX); OnJiangwen) ASSERT(IDM_ABOU //{{AFX_DATA_MAP( ON_EN_CHANGE(IDTBOX < 0xf000);="" cdapengdlg)="" c_wenmin,=""> // DDX_Text(pDX, OnChangeWENmin) CMenu* pSysMenu = IDC_EDIT1, m_wendu); ON_EN_CHANGE(IDGetSystemMenu(FALSE); DDX_Text(pDX, C_WENmax, if (pSysMenu != IDC_LSZD, m_lszd); OnChangeWENmax) NULL) DDX_Text(pDX, ON_EN_CHANGE(ID { IDC_LSZG, m_lszg); C_SHImin, CString DDX_Text(pDX, OnChangeSHImin) strAboutMenu; IDC_SHI, m_shi); ON_EN_CHANGE(ID DDX_Text(pDX, C_SHImax, strAboutMenu.LoadStriIDC_SHImax, m_shimax); OnChangeSHImax) ng(IDS_ABOUTBOX); DDX_Text(pDX, ON_EN_CHANGE(ID if IDC_SHImin, m_shimin); C_WEN, OnChangeWen) (!strAboutMenu.IsEmpty()) DDX_Text(pDX, ON_EN_CHANGE(ID { IDC_WEN, m_wen); C_SHI, OnChangeShi) DDX_Text(pDX, ON_EN_CHANGE(ID pSysMenu->AppendMe nu(MF_SEPARATOR); SetupComm(hCom,100,XCLEAR); 100); //输入缓冲区和输出 pSysMenu->AppendMe缓冲区的大小都是100 nu(MF_STRING, IDM_ABOUTBOX, COMMTIMEOUTS // strAboutMenu); TimeOuts; SetTimer(1,1000,(TIMERPR } //设定读超时 OC)TimerProc); } TimeOuts.ReadInterval SetTimer(1,1000,NULL); Timeout=MAXDWORD; // Set the icon for this TimeOuts.ReadTotalTi return TRUE; // return dialog. The framework meoutMultiplier=0; TRUE unless you set the does this automatically TimeOuts.ReadTotalTifocus to a control // when the meoutConstant=0; } application's main window is //在读一次输入缓冲区 not a dialog 的内容后读操作就立即返 SetIcon(m_hIcon, 回, TRUE); // Set big //而不管是否读入了要void icon 求的字符。 CDapengDlg::OnSysComma SetIcon(m_hIcon, nd(UINT nID, LPARAM FALSE); // Set small lParam) icon //设定写超时 { TimeOuts.WriteTotalTi if ((nID & 0xFFF0) == // TODO: Add extra meoutMultiplier=100; IDM_ABOUTBOX) initialization here TimeOuts.WriteTotalTi { hCom=CreateFile("COmeoutConstant=500; CAboutDlg M4",//COM4口 SetCommTimeouts(hCodlgAbout; m,&TimeOuts); //设置超时 GENERIC_READ|GEN dlgAbout.DoModal(); ERIC_WRITE, //允许读和 DCB dcb; } 写 GetCommState(hCom, else 0, //独占方式 &dcb); { NULL, dcb.BaudRate=9600; // OPEN_EXISTING, 波特率为9600 CDialog::OnSysComma//打开而不是创建 dcb.ByteSize=8; //每个nd(nID, lParam); 0, //同步方式 字节有8位 } NULL); dcb.Parity=NOPARITY; } if(hCom==(HANDLE)-//无奇偶校验位 1) dcb.StopBits=ONESTO// If you add a minimize { PBIT; //1个停止位 button to your dialog, you AfxMessageBox(" SetCommState(hCom,&will need the code below 打开COM失败!"); dcb); // to draw the icon. For return FALSE; MFC applications using the } PurgeComm(hCom,PUdocument/view model, RGE_TXCLEAR|PURGE_R// this is automatically done for you by the framework. obtain the cursor to display { while the user drags AfxMessageBox("void CDapengDlg::OnPaint() // the minimized window. 写串口失败!"); { HCURSOR } if (IsIconic()) CDapengDlg::OnQueryDrag else { Icon() { CPaintDC dc(this); { m_zhuangtai="自动"; // device context for painting return (HCURSOR) UpdateData(FALSE); m_hIcon; } } } SendMessage(WM_IC ONERASEBKGND, void void (WPARAM) CDapengDlg::OnZidong() CDapengDlg::OnShengwen(dc.GetSafeHdc(), 0); { ) // TODO: Add your { // Center icon in control notification handler // TODO: Add your client rectangle code here control notification handler int cxIcon = char lpOutBuffer[1]; code here GetSystemMetrics(SM_CXI memset(lpOutBuffer,'\0' char lpOutBuffer[1]; CON); ,2); //前2个字节先清零 memset(lpOutBuffer,'\0' int cyIcon = lpOutBuffer[0]=0x11; ,2); //前2个字节先清零 GetSystemMetrics(SM_CYI//8位控制命令,前四位类型 lpOutBuffer[0]=0x12; CON); (1:控制设备,2:改变参//8位控制命令,前四位为控 CRect rect; 数),后四位补充(控制时制类型(1:控制设备,2: (1:自动,2升温,3:降温);改变参数),后四位补充(控 GetClientRect(&rect); 改参数(1:制时(1:自动,2升温,3: int x = (rect.Width() wenmin,2:wemmax,3:shimin降温);改参数(1: - cxIcon + 1) / 2; ,4:shimax)) wenmin,2:wemmax,3:shimin int y = // lpOutBuffer[1]=0x01; ,4:shimax)) (rect.Height() - cyIcon + 1) / //8位参数(设备控制时缺// lpOutBuffer[1]=0x02; 2; 省,参数改变时表示改变的//8位参数(设备控制时缺 值) 省,参数改变时表示改变的 // Draw the icon DWORD 值) dc.DrawIcon(x, y, dwBytesWrite=2; DWORD m_hIcon); COMSTAT ComStat; dwBytesWrite=2; } DWORD dwErrorFlags; COMSTAT ComStat; else BOOL bWriteStat; DWORD dwErrorFlags; { ClearCommError(hCom BOOL bWriteStat; ,&dwErrorFlags,&ComStat); ClearCommError(hCom CDialog::OnPaint(); bWriteStat=WriteFile(h,&dwErrorFlags,&ComStat); } Com,lpOutBuffer,dwBytesW bWriteStat=WriteFile(h} rite,& Com,lpOutBuffer,dwBytesW dwBytesWrite,NULL); rite,& // The system calls this to if(!bWriteStat) dwBytesWrite,NULL); if(!bWriteStat) if(!bWriteStat) dwBytesWrite=2; { { COMSTAT ComStat; AfxMessageBox(" AfxMessageBox(" DWORD dwErrorFlags; 写串口失败!"); 写串口失败!"); BOOL bWriteStat; } } ClearCommError(hCom else else ,&dwErrorFlags,&ComStat); { { bWriteStat=WriteFile(h m_zhuangtai="升温"; m_zhuangtai="降温"; Com,lpOutBuffer,dwBytesW UpdateData(FALSE); UpdateData(FALSE); rite,& } } dwBytesWrite,NULL); } } if(!bWriteStat) { void void AfxMessageBox("CDapengDlg::OnJiangwen() CDapengDlg::OnChangeWE写串口失败!"); { Nmin() } // TODO: Add your { control notification handler // TODO: If this is a } code here RICHEDIT control, the char lpOutBuffer[1]; control will not void memset(lpOutBuffer,'\0' // send this notification CDapengDlg::OnChangeWE,2); //前2个字节先清零 unless you override the Nmax() lpOutBuffer[0]=0x13; CDialog::OnInitDialog() { //8位控制命令,前四位为控 // function and call // TODO: If this is a 制类型(1:控制设备,2:CRichEditCtrl().SetEventMaRICHEDIT control, the 改变参数),后四位补充(控sk() control will not 制时(1:自动,2升温,3: // with the // send this notification 降温);改参数(1:ENM_CHANGE flag ORed unless you override the wenmin,2:wemmax,3:shimininto the mask. CDialog::OnInitDialog() ,4:shimax)) // function and call // lpOutBuffer[1]=0x03; // TODO: Add your CRichEditCtrl().SetEventMa//8位参数(设备控制时缺control notification handler sk() 省,参数改变时表示改变的code here // with the 值) UpdateData(TRUE); ENM_CHANGE flag ORed DWORD char lpOutBuffer[1]; into the mask. dwBytesWrite=2; memset(lpOutBuffer,'\0' COMSTAT ComStat; ,2); //前2个字节先清零 // TODO: Add your DWORD dwErrorFlags; strncpy(lpOutBuffer,(Lcontrol notification handler BOOL bWriteStat; PCTSTR)m_wenmin,sizeof(lcode here ClearCommError(hCompOutBuffer)); UpdateData(TRUE); ,&dwErrorFlags,&ComStat); char lpOutBuffer[1]; bWriteStat=WriteFile(hlpOutBuffer[1]=lpOutBuffer[ memset(lpOutBuffer,'\0'Com,lpOutBuffer,dwBytesW0]; ,2); //前7个字节先清零 rite,& lpOutBuffer[0]=0x21; strncpy(lpOutBuffer,(LdwBytesWrite,NULL); DWORD PCTSTR)m_wenmax,sizeof( lpOutBuffer)); control notification handler into the mask. code here lpOutBuffer[1]=lpOutBuffer[ UpdateData(TRUE); // TODO: Add your 0]; char lpOutBuffer[1]; control notification handler lpOutBuffer[0]=0x22; memset(lpOutBuffer,'\0'code here DWORD ,2); //前2个字节先清零 UpdateData(TRUE); dwBytesWrite=2; strncpy(lpOutBuffer,(L char lpOutBuffer[1]; COMSTAT ComStat; PCTSTR)m_shimin,sizeof(lp memset(lpOutBuffer,'\0' DWORD dwErrorFlags; OutBuffer)); ,2); //前2个字节先清零 BOOL bWriteStat; lpOutBuffer[0]=0x23; strncpy(lpOutBuffer,(L ClearCommError(hCom DWORD PCTSTR)m_shimax,sizeof(l,&dwErrorFlags,&ComStat); dwBytesWrite=2; pOutBuffer)); bWriteStat=WriteFile(h COMSTAT ComStat; Com,lpOutBuffer,dwBytesW DWORD dwErrorFlags; lpOutBuffer[1]=lpOutBuffer[rite,& BOOL bWriteStat; 0]; dwBytesWrite,NULL); ClearCommError(hCom lpOutBuffer[0]=0x24; if(!bWriteStat) ,&dwErrorFlags,&ComStat); DWORD { bWriteStat=WriteFile(hdwBytesWrite=2; AfxMessageBox("Com,lpOutBuffer,dwBytesW COMSTAT ComStat; 写串口失败!"); rite,& DWORD dwErrorFlags; } dwBytesWrite,NULL); BOOL bWriteStat; if(!bWriteStat) ClearCommError(hCom} { ,&dwErrorFlags,&ComStat); AfxMessageBox(" bWriteStat=WriteFile(h 写串口失败!"); Com,lpOutBuffer,dwBytesW } rite,& void dwBytesWrite,NULL); CDapengDlg::OnChangeSHI} if(!bWriteStat) min() { { void AfxMessageBox(" // TODO: If this is a CDapengDlg::OnChangeSHI写串口失败!"); RICHEDIT control, the max() } control will not { // send this notification // TODO: If this is a } unless you override the RICHEDIT control, the CDialog::OnInitDialog() control will not void // function and call // send this notification CDapengDlg::OnChangeWeCRichEditCtrl().SetEventMaunless you override the n() sk() CDialog::OnInitDialog() { // with the // function and call // TODO: If this is a ENM_CHANGE flag ORed CRichEditCtrl().SetEventMaRICHEDIT control, the into the mask. sk() control will not // with the // send this notification // TODO: Add your ENM_CHANGE flag ORed unless you override the CDialog::OnInitDialog() CDialog::OnInitDialog() // function and call // function and call // function and call CRichEditCtrl().SetEventMaCRichEditCtrl().SetEventMaCRichEditCtrl().SetEventMask() sk() sk() // with the // with the // with the ENM_CHANGE flag ORed ENM_CHANGE flag ORed ENM_CHANGE flag ORed into the mask. into the mask. into the mask. // TODO: Add your // TODO: Add your // TODO: Add your control notification handler control notification handler control notification handler code here code here code here /* char str[100]; /* char str[100]; } memset(str,'\0',100); memset(str,'\0',100); DWORD DWORD CDapengDlg::OnClose() wCount=100;//读取的字节wCount=100;//读取的字节{ 数 数 BOOL bReadStat; BOOL bReadStat; // TODO: Add your bReadStat=ReadFile(hC bReadStat=ReadFile(hCmessage handler code here om,str,wCount,&wCount,NUom,str,wCount,&wCount,NUand/or call default LL); LL); CloseHandle(hCom); if(!bReadStat) if(!bReadStat) AfxMessageBox(" AfxMessageBox(" CDialog::OnClose(); 读串口失败!"); 读串口失败!"); PurgeComm(hCom, PurgeComm(hCom, } PURGE_TXABORT| PURGE_TXABORT| PURGE_RXABORT|P PURGE_RXABORT|P URGE_TXCLEAR|PURGE_URGE_TXCLEAR|PURGE_void RXCLEAR); RXCLEAR); CDapengDlg::OnTimer(UIN m_wen=str; m_shi=str; T nIDEvent) UpdateData(FALSE); UpdateData(FALSE); { */ */ } /* } *********************** void ******向下位机发送控制 void CDapengDlg::OnChangeZhu命令 CDapengDlg::OnChangeShi(angtai() ***********************/ ) { char lpOutBuffer[100]; { // TODO: If this is a memset(lpOutBuffer,'\0' // TODO: If this is a RICHEDIT control, the ,2); //前2个字节先清零 RICHEDIT control, the control will not lpOutBuffer[0]=0x32; control will not // send this notification DWORD dwErrorFlags; // send this notification unless you override the //控制命令:通知下位机发 unless you override the CDialog::OnInitDialog() 送温湿度数据 lpOutBuffer[1]=lpOutB m_wen+='.'; uffer[0]; m_wen+=str[2]; DWORD m_wen+=str[3]; dwBytesWrite=2; m_wen+=str[4]; COMSTAT ComStat; UpdateData(FALSE); BOOL bWriteStat; m_shi=str[5]; ClearCommError(hCom m_shi+=str[6]; ,&dwErrorFlags,&ComStat); m_shi+=str[7]; bWriteStat=WriteFile(h m_shi+='.'; Com,lpOutBuffer,dwBytesW m_shi+=str[8]; rite,& m_shi+=str[9]; dwBytesWrite,NULL); UpdateData(FALSE); if(!bWriteStat) { /*********************** AfxMessageBox("显示历史温度 写串口失败!"); *********************** } ***/ if(str[0]>m_lszg) /* { *********************** m_lszg=str[0]; **** 接收下位机传来的数 UpdateData(FALSE); 据} *********************** if(str[0] char str[100]; m_lszg=str[0]; memset(str,'\0',100); UpdateData(FALSE); DWORD wCount=100; } //读取的字节数 BOOL bReadStat; CDialog::OnTimer(nID bReadStat=ReadFile(hCEvent); om,str,wCount,&wCount,NU} LL); if(!bReadStat) AfxMessageBox(" 读串口失败!"); PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|P URGE_TXCLEAR|PURGE_ RXCLEAR); m_wen=str[0]; m_wen+=str[1]; 沧州职业技术学院毕业设计 第1章 绪论 1.1选题背景 在人类的生活环境中,温湿度扮演着极其重要的角色。无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。自18世纪工业革命以来,工业发展与是否能掌握温湿度有着密切的联系。在冶金、钢铁、石化、水泥、玻璃、医药等行业,可以说几乎80%的工业部门都不得不考虑着温湿度的因素。温湿度不但对于工业如此重要,在农业生产中温度的监测与控制也有着十分重要的意义。我国人多地少,人均占有耕地面积更少。因此,要改变这种局面,只靠增加耕地面积是不可能实现的,因此我们要另辟蹊径,想办法来提高单位亩产量。温室大棚技术就是其中一个好的方法。温室大棚就是建立一个模拟适合生物生长的气候条件,创造一个人工气象环境,来消除温度对生物生长的约束。而且,温室大棚能克服环境对生物生长的限制,能使不同的农作物在不适合生长的季节产出,使季节对农作物的生长影响不大,部分或完全摆脱了农作物对自然条件的依赖。由于温室大棚能带来可观的经济效益,所以温室大棚技术越来越普及,并且已成为农民增收的主要手段。 随着大棚技术的普及,温室大棚数量不断增多,温室大棚的温湿度控制便成为一个十分重要的课题。传统的温湿度控制是在温室大棚内部悬挂温度计和湿度计,通过读取温度值和湿度值了解实际温湿度度,然后根据现有温湿度与额定温湿度进行比较,看温湿度是否过高或过低,然后进行相应的通风或者洒水。这些操作都是在人工情况下进行的,耗费了大量的人力物力。现在,随着国家经济的快速发展,农业产业规模的不断提高,农产品在大棚中培育的品种越来越多,对于数量较多的大棚,传统的温度控制措施就显现出很大的局限性。温室大棚的建设对温湿度检测与控制技术也提出了越来越高的要求。 今天,我们的生活环境和工作环境有越来越多称之为单片机的小电脑在为我们服务。单片机在工业控制、尖端武器、通信设备、信息处理、家用电器等各测控领域的应用中独占鳌头。时下,家用电器和办公设备的智能化、遥控化、模糊控制化已成为世界潮流,而这些高性能无一不是靠单片机来实现的。采用单片机来对温湿度进行控制,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控温湿度的技术指标,从而能够大大提高产品的质量和数量。单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点,成为自动化和各个测控领域中必不可少且广泛应用的器件,尤其在日常生活中也发挥越来越大的作用。因此,单片机对温湿度的控制问题是一 1 沧州职业技术学院毕业设计 个工农业生产中经常会遇到的问题。因此,本课题围绕基于单片机的温室大棚控制系统展开了应用研究工作。 1.2选题的现实意义 随着单片机和传感技术的迅速发展,自动检测领域发生了巨大变化,温室环境自动监测控制方面的研究有了明显的进展,并且必将以其优异的性能价格比,逐步取代传统的温湿度控制措施.但是,目前应用于温室大棚的温湿度检测系统大多采用模拟温度传感器、多路模拟开关、A/D转换器及单片机等组成的传输系统。这种温湿度度采集系统需要在温室大棚内布置大量的测温电缆,才能把现场传感器的信号送到采集卡上,安装和拆卸繁杂,成本也高。同时线路上传送的是模拟信号,易受干扰和损耗,测量误差也比较大。为了克服这些缺点,本文参考了一种基于单片机并采用数字化单总线技术的温度测控系统应用于温室大棚的的设计方案闭,根据实用者提出的问题进行了改进,提出了一种新的设计方案,在单总线上传输数字信号。 本文介绍的温湿度测控系统就是基于单总线技术及其器件组建的。该系统能够对大棚内的温湿度进行采集,利用温湿度传感器将温室大棚内温湿度的变化,变换成数字量,其值由单片机处理,最后由单片机去控制液晶显示器,显示温室大棚内的实际温湿度,同时通过与预设量比较,对大棚内的温度进行自动调节,如果超过我们预先设定的湿度限制,湿度报警模块将进行报警。这种设计方案实现了温湿度实时测量、显示和控制。该系统抗干扰能力强,具有较高的测量精度,不需要任何固定网络的支持,安装简单方便,性价比高,可维护性好。这种温湿度测控系统可应用于农业生产的温室大棚,实现对温度的实时控制,是一种比较智能、经济的方案,适于大力推广,以便促进农作物的生长,从而提高温室大棚的亩产量,以带来很好的经济效益和社会效益。 2 沧州职业技术学院毕业设计 第2章 系统硬件电路的设计 2.1系统硬件构成及其测控原理 本系统由如图2-1,DHT11温湿度传感器采集数据,STC89C52单片机进行数据处理,LCD1602显示模块显示温湿度。 DHT11温湿度检测 模块 功能切换键 设置温湿度 1602液晶显 STC89 “—”按键示模块 C52 设置温湿度 “+”按键 图2-1 系统整体框图 3 沧州职业技术学院毕业设计 2.2主控电路图 2.2.1 STC89C52主控电路图如图2-2 STC89C52 140P1.0VCC 239P1.1P0.0338P1.2P0.1437P1.3P0.2 536P1.4P0.3635P1.5P0.4S1734P1.6P0.5 833P1.7P0.6932RSTP0.7S21031RXD/P3.0EA/VPP 1130TXD/P3.1ALE/PROG1229INT0/P3.2PSENS31328INT1/P3.3P2.7 1427T0/P3.4P2.61526T1/P3.5P2.51625WR/P3.6P2.4 1724C1RD/P3.7P2.31823XTAL2P2.21922XTAL1P2.1Cap 20211VSSP2.0Y1 XTALC2 2 Cap 如图2-2 STC89C52主控电路图 2.2.2 STC89C52单片机的引脚说明 AT89C51管脚说明: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 4 沧州职业技术学院毕业设计 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 2.3 显示模块的选择 2.3.1 LCD1602概述 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,如图2-3所示,目前常用16×1,16×2,20×2和40×2行等模块。现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。1602型LCD可以显示2行16个字符,有8位数据总线D0-D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能[3]。 图2-3 LCD1602实物图 2.3.2 LCD1602基本参数及引脚功能 1602LCD主要技术参数: 5 沧州职业技术学院毕业设计 显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm 引脚功能如表2-1所示: 表2-1 引脚功能 编号 符号 引脚说明 编号 符号 引脚说明 1 VSS 电源地 9 D2 数据 2 VDD 电源正极 10 D3 数据 3 VL 液晶显示偏压 11 D4 数据 4 RS 数据/命令选择 12 D5 数据 5 R/W 读/写选择 13 D6 数据 6 E 使能信号 14 D7 数据 7 D0 数据 15 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度 最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时 可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7,14脚:D0,D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。 6 沧州职业技术学院毕业设计 LCD1602控制命令如表2-2 表2-2 LCD1602控制命令 序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示 0 0 0 0 0 0 0 0 0 1 2 光标返回 0 0 0 0 0 0 0 0 1 * 置输入模式 I/3 0 0 0 0 0 0 0 1 S D 4 显示开/关控制 0 0 0 0 0 0 1 D C B 光标或字符移位 S/R/5 0 0 0 0 0 1 * * C L 6 置功能 0 0 0 0 1 DL N F * * 7 置字符发生存贮器地址 0 0 0 1 字符发生存贮器地址 8 置数据存贮器地址 0 0 1 显示数据存贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 10 写数到CGRAM或DDRAM) 1 0 要写的数据内容 11 从CGRAM或DDRAM读数 1 1 读出的数据内容 指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。 指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10:写数据。 指令11:读数据。 7 沧州职业技术学院毕业设计 LCD1602的读写操作,如图2-4、图2-5所示、屏幕和光标的操作都是通过指令编 程来实现的。 图2-4 读操作时序 图2-5 写操作时序 8 沧州职业技术学院毕业设计 图2-6 LCD1602内部显示地址 如图2-6所示,第二行第一个字符的地址是40H,那么是否直接写入40H就可以将 光标定位在第二行第一个字符的位置呢,这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。 1602LCD的一般初始化(复位)过程: (1)延时15mS (2)写指令38H(不检测忙信号) (3)延时5mS (4)写指令38H(不检测忙信号) (5)延时5mS (6)写指令38H(不检测忙信号) (7)以后每次写指令、读/写数据操作均需要检测忙信号 (8)写指令38H:显示模式设置 (9)写指令08H:显示关闭 (10)写指令01H:显示清屏 (11)写指令06H:显示光标移动设置 (12)写指令0CH:显示开及光标设置 9 沧州职业技术学院毕业设计 2.4 温湿度传感器的选择 2.4.1 DHT11数字温湿度传感器概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。 10 沧州职业技术学院毕业设计 2.4.2 DHT11数字温湿度传感器性能说明 参数 条件 Min Typ Max 单位 湿度 分辨率 1 1 1 %RH 8 Bit 重复性 ?1 %RH 精度 25? ?4 %RH 0,50? ?5 %RH 互换性 可完全互换 量程范围 0? 30 90 %RH 25? 20 90 %RH 50? 20 80 %RH 响应时间 1/e(63%)25?,6 10 15 S 1m/s 空气 迟滞 ?1 %RH 长期稳定性 典型值 ?1 %RH/yr 温度 分辨率 1 1 1 ? 8 8 8 Bit 重复性 ?1 ? 精度 ?1 ?2 ? 量程范围 0 50 ? 响应时间 1/e(63%) 6 30 S 表2-3 DHT11数字温湿度传感器性能 图2-7 典型应用电路 11 沧州职业技术学院毕业设计 建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。DHT11的供电电压为 3,5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。 DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下: 一次完整的数据传输为40bit,高位先出,数据格式:8bit湿度整数数据+8bit湿度小数数据,+8bi温度整数数据+8bit温度小数数据+8bit校验和 数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。 用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。 总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。 总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。 测量分辨率分别为 8bit(温度)、8bit(湿度)。 12 沧州职业技术学院毕业设计 2.4.3 DHT11数字温湿度传感器使用注意事项 表2-4 DHT11电气特性 参数 条件 min typ max 单位 供电 DC 3 5 5.5 V 供电电流 测量 0.5 2.5 mA 平均 0.2 1 mA 待机 100 150 uA 采样周期 秒 1 次 DHT11电器特性如表2-4所示,超出建议的工作范围可能导致高达3%RH的临时性漂移信号。返回正常工作条后,传感器会缓慢地向校准状态恢复。 电阻式湿度传感器的感应层会受到化学蒸汽的干扰,化学物质在感应层中的扩散可能导致测量值漂移和灵敏度下降。在一个纯净的环境中,污染物质会缓慢地释放出去。下文所述的恢复处理将加速实现这一过程。高浓度的化学污染会导致传感器感应层的彻底损坏。 置于极限工作条件下或化学蒸汽中的传感器,通过如下处理程序,可使其恢复到校准时的状态。在50-60?和< 10%rh的湿度条件下保持2="" 小时(烘干);随后在20-30?和="">70%RH的湿度条件下保持 5小时以上。 气体的相对湿度,在很大程度上依赖于温度。因此在测量湿度时,应尽可能保证湿度传感器在同一温度下工作。如果与释放热量的电子元件共用一个印刷线路板,在安装时应尽可能将DHT11远离电子元件,并安装在热源下方,同时保持外壳的良好通风。为降低热传导,DHT11与印刷电路板其它部分的铜镀层应尽可能最小,并在两者之间留出一道缝隙。 长时间暴露在太阳光下或强烈的紫外线辐射中,会使性能降低。 DATA信号线材质量会影响通讯距离和通讯质量,推荐使用高质量屏蔽线。 手动焊接,在最高260?的温度条件下接触时间须少于10秒。 (1)避免结露情况下使用。 (2)长期保存条件:温度10,40?,湿度60,以下。 13 沧州职业技术学院毕业设计 第3章 温室大棚控制系统软件设计 3.1 温室大棚控制系统程序设计 整体系统框图 key1 温度当前值 设定值 开始 温度调节“+” Y Y N N LED1亮 初始化1602 N key2LED1灭 显示开机界面 温度调节“—” N 湿度当前值 设定值 温度湿度测量 key, LED1亮 N液晶屏显示测量 LED2灭值 key-fun=2 温湿检测 按键扫描 key, 循环起始 Y key-fun=3 跳出按键检测 key-fun=0 图3-1 系统整体框图 14 沧州职业技术学院毕业设计 3.2 LCD1602显示模块程序设计 LCD1602显示模块初始化 延时 数据转换十六进制?十进 制 是否在第一行显示数据, NY address = 0x80 + xaddress = 0xc0 + x 输入显示地址命令 延时 输入显示数据 结束 图3-2 显示程序框图 如图3-2,初始化LCD1602显示模块,设置8位格式,2行,5*7矩阵显示,整体 显示,关光标,不闪烁设定输入方式,增量不移位,清除屏幕显示,延时等待,将采集 到的温湿度数据进行转换,十六进制转换成十进制,然后,判断是否在第一行显示,输 入相应的地址数据,延时等待,输入需要显示的数据。 15 沧州职业技术学院毕业设计 结论 通过本次设计、制作调试,增强了我们对基本电路及单片机知识的了解,提高了动手能力,对信号的检测、输出、调试处理等传感器方面知识都有了进一步的理解,实现了传感器技术、单片机技术以及电子电路综合知识的整合,巩固了所学知识和培养了我们自学能力。 以上为毕业期间所设计的温室大棚控制控制系统,它经过多次修改和整理,可以满足设计的基本要求。采用STC89C52单片机、DHT11数字温湿度传感器、LCD1602液晶显示模块和M4QA045电机等器件设计温室大棚控制系统,实现温湿度采集、英文显示;温度自动调节,湿度越限报警功能。系统STC89C52以为核心部件,利用软件编程,能实现本设计题目的基本要求和发挥部分。尽量做到硬件电路简单稳定、充分发挥软件编程的优点,本设计方案具有造价低,工作可靠,实用性强等特点,由于时间有限和本身知识水平的限制,本系统还存在一些不够完善的地方,要作为实际应用还有一些具体细节问题需要解决。 因为本人水平有限,此设计存在一定的问题。譬如系统抗干扰能力差,且没有实现自动自动复位。由于使用的是单片机作为核心的控制元件,配合其它器件,使本温度控制系统具有功能强、性能可靠、电路简单、成本低的特点,加上经过优化的程序,使其有很高的智能化水平。但我可以自豪的说,制作的每一个步骤,都付诸了我们的辛苦劳动。当看着自己的作品能够健康的运行,真是莫大的幸福和欣慰。我相信其中的酸甜苦辣最终都会化为甜美的甘泉。这次做论文的经历也会使我终身受益,我感受到做论文是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。希望这次的经历能让我在以后学习中激励我继续进步。借此机会感谢一直以来给我帮助的所有老师、同学,你们的友谊是我人生的财富,是我生命中不可或缺的一部分。 16 沧州职业技术学院毕业设计 致谢 经过这段时间的忙碌和工作,本次毕业设计已经接近尾声,作为一个专科生的毕业设计,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有老师的督促指导,以及同学们的支持和帮助,想要完成这个设计是难以想象的。 在这里首先要感谢我的穆立江老师。穆老师平日里工作繁多,但在我做毕业设计的每个阶段,从设计草案的确定和修改,中期检查,后期详细设计等整个过程中都给予了我悉心的指导。他的治学严谨和科学研究的精神也是我永远学习的榜样,并将积极影响我今后的学习和工作。 然后,还要感谢大学三年来所有的老师,为我们打下机电一体化专业知识的基础;同时还要感谢所有的同学们,正是因为有了你们的支持和鼓励,此次毕业设计才会顺利完成。 最后感谢母校—沧州职业技术学院三年来对我的大力栽培。感谢老师们,感谢同学们。 17 沧州职业技术学院毕业设计 参考文献 [1] 孙育才.MCS-51系列单片微型计算机及其应用(第四版) [M].南京:东南大学出版社,2004 [2] 康华光.电子技术基础-模拟部分(第四版)[M].北京:高等教育出版社,1999 [3] 康华光.电子技术基础-数字部分(第四版)[M].北京:高等教育出版社,1999 [4] 石来德.机械参数电测技术[M].上海:上海科学技术出版社,1981 [5] Ernest O.Doebelin. Measurement Systems: Application and Design [M].America: McGraw-HILL BOOK COMPANY,1976 [6] 曹继松.测试电路[M].上海:上海交通大学出版社,1995 [7] 谢自美.电子线路设计实验测试[M].武汉:华中科技大学出版社,2000 [8] 马靖善,秦玉平.C语言程序设计[M].北京:清华大学出版社,2005 [9] 赖麒文.8051 单片机 C语言开发环境实务与设计 [M].北京:科学出版社,2002 [10] 徐爱钧.智能化测量控制仪表原理与设计[M].北京:北京航空航天大学出版社,2004 18 沧州职业技术学院毕业设计 附录 整合实物图所示: 附录图1—1 温湿度显示: 附录图1—2 19 沧州职业技术学院毕业设计 温度调节如图所示: 附录图1—3 湿度调节如图所示: 附录图1—4 20 沧州职业技术学院毕业设计 21 叠丑&日匿盈 Science&Technology Vision 科技视界 圈丑翘 温室大棚智能控制系统设计 王亭亭李雪颖周亚罗 (河北联合大学电气工程学院。河北唐山063000) 【摘要】基于单片机的温室大棚智能控制系统,以单片机为核心,通过各类传感器对温室内各项指标进行实时采集,通过单片机进行分析 处理及自动调节控制,可以消除环境中温度,湿度,光照等因素对生物生长的限制,使得生物能在最佳状态下生长,提高质量和产量、此外,本系 统还增加了蓝牙装置,便于用户完成远程监控。 【关键词】温室大棚;传感器;单片机;蓝牙 O引言 国外的温室设施己经发展到比较完备的程度.并形成了一定的标 准,但是价格昂贵,缺乏与我国气候特点相适应的测控软件,不利于在 我国广泛地推广。当今我国对大棚温度、湿度、二氧化碳含量.光照强 度的检测与控制都采用人工管理,存在测控不及时、测控精度低、劳动 强度大等弊端,大大增加了成本.浪费人力资源.而且很难达到预期的 效果。温室大棚智能温湿度控制系统由传感器系统、单片机、温室内的 执行机构及无线收发模块构成.该系统可完成对温室大棚生产过程中 的参数在线高精度测量.而且能实现棚内调温、灌溉等的智能控制或 报警提示,实现了温室大棚自动实现保湿、通风和光照调节。该系统具 有价格低廉、使用方便等优点。便于在我国推广。 1系统总体设计 本文设计的无线温室大棚智能控制系统….是由STCl2C5A60S2单片机为核心的下位机和计算机为核心的上位机组成的.下位机由相 应的传感器系统、单片机、执行机构等部分组成。传感器系统是温室系 统的输入检测模块.检测各种环境参数并将其转换成温室控制所需要 的电信号.整个系统的测量精度、控制精度与传感器获得信息的准确 性直接相关I。。单片机系统主要包括主控模块、数据采集模块、输出控 制模块、数据显示模块和数据通信模块,具有温室数据的采集、存储、 显示、上传等功能,可实现温室现场资源的统一管理。执行机构主要包 括加热阀、加湿阀、风电机、自动卷帘等设备,单片机控制执行机构可 以启动加温、降温、遮阳补光等调控设备,调控温室内的气候环境。上 位机可实现大棚远程控制.也可对大棚数据统计分析。 该系统整体结构如下: j兰兰兰竺兰兰}=2刊b::恫 |垄璺竺竺F=—割爱l 口 厂]蘼蓁}峥斟 —而i赢订——d惠l d U 壶豆葺苗d 童 2系统具体模块设计 2.1单片机 2.1.1STCl2C5A60S2系列单片机主要性能 STCl2C5A60S2单片机作为温室大棚智能控制系统的核心单片 机Ⅲ,是以805I单片机为内核.同时在8051单片机的基础上又增加了 很多功能。单片机内部集成了MAX810专用复位电路.并且增加了P4口的功能,P4口地址在COH。支持的外部中断模式有下降沿唤醒、低 电平唤醒、内部专用掉电唤醒。计时器唤醒等。而且在单片机内部集成 MD转换功能,转换口在P1口,有8路10位高速A/D转换器,速度可 以达到25万次每秒,具有转换速度高、低功耗的特点.作为本系统的 主控芯片非常合适, 2.2传感器 2.2.1温湿度传感器 DHTll数字温湿度传感器是一款含有已校准数字信号输出的温 湿度复合传感器。DHTl l通过SCK线、DATA线和单片机串行通信。 其中SCK为时钟线.DATA为数据线,时钟线SCK用于微处理器和 SHTl 1之间通信同步。DATA用于微处理器与DHTl l之间的通讯和 同步。采用单总线数据格式。一次通讯时间4ms左右,一次完整的数据 传输为40bit,数据分小数部分和整数部分,高位先出。 数据格式: 8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8biI 温度小数数据+8bit校验和本系统中.当空气中的温湿度高于或低于 所设定的值时,红色指示灯亮.当温湿度过高时,步进电机工作,打开 天窗:当温湿度过低时,进行补充。符合标准后,红色发光二极管熄灭。 2.2.2土壤湿度传感器 YL-69型土壤湿度传感器是一种简易的水分传感器.可用于检测 土壤的水分,当土壤缺水时,模块输出一个高电平.反之输出低电平。 本系统中.YL一69土壤湿度传感器工作时电源指示灯为红色,当土壤 湿度低于设定范围时.绿色发光二极管亮.同时继电器动作.此时只要 把土壤湿度传感器浸人水中.湿度达标,LED灯熄灭. 2.2.3光照强度传感器 GY一30光照强度传感器采用ROHM原装的BHl750FVI芯片以 及两线式串行总线接口的集成电路.这种集成电路可以根据收集的光 线强度数据来调整液晶或者键盘背景灯的亮度.利用它的高分辨率可 以探测较大范围的光强度变化。本系统中.当光照没有达到设定值时. 白色发光二极管亮,需要补光:光照达标后,白色发光二极管熄灭。 图2光照强度传感器 2.2.4烟雾传感器 MQ一2气体传感器对液化气、丙烷、氢气的灵敏度高。对天然气和 其它可燃蒸汽的检测亦很理想。这种传感器可检测多种可燃性气体. 是一款适合多种应用的低成本传感器。环境中c01浓度越大.电导率 越大,MQ一2型烟雾传感器输出电阻越低。在实验中,当MQ一2烟雾传 感器检测到CO:浓度不符合所设定的范围时.红色发光二极管亮.需 要讲行调节. 图3烟雾传感器 医赡 旧雾传墨器 2.3蓝牙模块 蓝牙是一种无线电技术,利用蓝牙技术能够有效地简化通信终 端设备之间的通信,从而使数据传输变得更加迅速高效.其传输速率 为1Mb/S。本系统采用HC一06蓝牙模块,该模块内置(下转第72页) ※基金项目:河北省大学生创新创业训练计划项目“大棚基地温湿度自动控制及灌溉系统”(201310081028)。 作者简介:王亭亭(1991一),女,河北联合大学2011级电气工程及其自动化专业学生。 李雪颖(199}_),女,河北联合大学2011级电气工程及其自动化专业学生。 通讯作者:周亚罗(1982_),女,汉族.硕士,河北联合大学,讲师.研究方向为电子技术与应用, 44I科技视界science&Techn。1。gy Visi。n 荜 万方数据 墨丑[口臣翟 Science&Technology Vision 科技视界 n啪 ‘L卅 n瞒 ●‘椭 n--㈣ .n钎 l“ 2札_ in嘲 ;n崩 ●t蚶 札崩 ●^氍 帆嫩 Ⅷ ㈣ ㈣ ㈣ 一 幢啪 ‘t埘 t.I竹t jn啪 : j“ =n蝴 j… ㈣ ¨●∞ 一 ●^蚴 ㈣ ㈣j 图6抛光数据 方法,只要定期对抛光机进行调整验证.才能更好的提升曲轴的加工 质量及FTQ。e 【参考文献】 [1]赵东洋,王光.曲轴抛光机的研究与改进们.科学论坛,2014(7). …∑A:产众疋:广 [2]Supfirta 720/3一NC使用说明(z1.2011. [3]高速随动数控曲轴磨削原理及若干关键技术研究叨.武汉理工大学学报, 2007. 《上接第44页)2.4GHz天线,功率可调。灵敏度可达80dBm,满足系统 要求。 2.4液晶显示模块 Nokia5110液晶显示器采用LPH7366模块.具有很多的特点: 84x48的点阵LCD.可以显示4行汉字.采用串行接口与主处理器进 行通信,包括电源和地在内的信号线仅有9条。支持多种串行通信协 议,传输速率高达4Mbps,可全速写入显示数据,无等待时间。 3软件设计 本系统采用c语言模块化编程方式.将系统的整体功能分为不同 的模块,各个模块单独设计、编程、调试、完成之后进行系统的总体联 调。本系统由主程序,系统初始化、信号采集、显示、控制、通信、报警、 按键扫描等子程序组成. 主程序流程图如下: 图4程序流程图 72I科技视界science&Techn。1。gy Visi。n 4小结 [责任编辑:曹明明] 该系统能够实现对温度、湿度、光照量等环境参数的采集,并通过 单片机进行相应的控制,创造出适合作物生长的最佳环境。远程通信 实现了温室大棚现场采集端和远程控制端的相互通信.使温室大棚的 管理更加趋于现代化。该系统功耗低、操作简单、扩展能力强,具有广 阔的市场应用前景。e 【参考文献】 [1]孙凯.基于单片机的智能温室控制系统的设计叽自动化技术与应用,2008,27渤:101-103. [2]褚向前,朱武.温室温度多传感器数据融合们.农机化研究,2008(4):180-185. [3】张毅刚.单片机原理及应用【M】.北京:高等教育出版社2003. 【责任编辑:薛俊歌] 万方数据 温室大棚智能控制系统设计 作者:王亭亭 , 李雪颖 , 周亚罗 作者单位:河北联合大学电气工程学院,河北唐山,063000 刊名: 科技视界 英文刊名:Science&Technology Vision 年,卷(期):2015(9) 1. 孙凯 基于单片机的智能温室控制系统的设计 [期刊论文]-自动化技术与应用 2008(8) 2. 褚向前,朱武 温室温度多传感器数据融合 [期刊论文]-农机化研究 2008(4) 3. 张毅刚 单片机原理及应用 2003 引用本文格式:王亭亭 . 李雪颖 . 周亚罗 温室大棚智能控制系统设计 [期刊论文]-科技视界 2015(9) 大连交通大学2010届本科生毕业设计(论文) 摘 要 本课题运用STC89C52单片机、DHT11温湿度传感器、继电器和M4QA045电机、LCD1602液晶显示模块等器件,设计了湿度报警电路、M4QA045电机驱动电路、电热器驱动电路,实现了温室大棚中温度、 湿度自动控制与报警系统,解决了温室大棚人工控制测试的温度及湿度误差大,且费时费力、效率 低等问题,促进了农作物的生长,从而提高温室大棚的产量,带来很好的经济效益和社会效益。 STC89C52单片机 DHT11温湿度传感器 继电器 M4QA045电机 温室大棚自动控制与报警系统 1 大连交通大学2010届本科生毕业设计(论文) ABSTRACT This subject had achieved the temperature and humidity control and alarm system in the greenhouse and had designed humidity measurement and alarm circuit, M4QA045 engine circuit and heating circuit by using STC89C52 SCM, DHT11 temperature and humidity sensor,LCD1602 and M4QA045 motor and so on. It solved the problem of low efficiency and measurement errors of temperature and humidity of manual control, it promoted the growth of crops, thereby increasing the yield of greenhouse and bringing good economic and social benefits. Keywords: STC89C52 SCM DHT11 temperature and humidity sensor electric relays M4QA045 motor control and alarm system greenhouse 2 大连交通大学2010届本科生毕业设计(论文) 第一章 绪论1 1.1选题背景 ............................................................. 1 1.2选题的现实意义 ....................................................... 2 第二章 系统硬件电路的设计3 2.1系统硬件构成及其测控原理 ............................................. 3 2.2单片机的选择 ......................................................... 4 2.2.1单片机概述 ..................................................... 4 2.2.2 STC89C52单片机的引脚说明 ...................................... 5 2.2.3 STC89C52单片机最小系统 ........................................ 7 2.3 显示模块的选择 ...................................................... 8 2.3.1 LCD1602概述 ................................................... 8 2.3.2 LCD1602基本参数及引脚功能 ..................................... 9 2.4 温湿度传感器的选择 ................................................. 12 2.4.1 DHT11数字温湿度传感器概述 .................................... 12 2.4.2 DHT11数字温湿度传感器性能说明 ................................ 12 2.4.3 DHT11数字温湿度传感器使用注意事项 ............................ 14 2.5 温度调节模块设计 ................................................... 17 2.6 湿度报警模块设计 ................................................... 15 第三章 温室大棚控制系统软件设计18 3.1 Keil C 软件概述 .................................................... 18 3.2 温室大棚控制系统程序设计 ........................................... 20 3.2.1整体系统框图 .................................................. 20 3.2.2 LCD1602显示模块程序设计 ...................................... 21 3.2.3 PWM程序设计 .................................................. 22 第四章 调试中遇到的问题23 结 论25 谢 辞25 参考文献26 附 录27 3 大连交通大学2010届本科生毕业设计(论文) 第一章 绪论 1.1选题背景 在人类的生活环境中,温湿度扮演着极其重要的角色。无论你生活在哪里,从事什 么工作,无时无刻不在与温度打着交道。自18世纪工业革命以来,工业发展与是否能 掌握温湿度有着密切的联系。在冶金、钢铁、石化、水泥、玻璃、医药等行业,可以说 几乎80%的工业部门都不得不考虑着温湿度的因素。温湿度不但对于工业如此重要,在 农业生产中温度的监测与控制也有着十分重要的意义。我国人多地少,人均占有耕地面 积更少。因此,要改变这种局面,只靠增加耕地面积是不可能实现的,因此我们要另辟 蹊径,想办法来提高单位亩产量。温室大棚技术就是其中一个好的方法。温室大棚就是 建立一个模拟适合生物生长的气候条件,创造一个人工气象环境,来消除温度对生物生 长的约束。而且,温室大棚能克服环境对生物生长的限制,能使不同的农作物在不适合 生长的季节产出,使季节对农作物的生长影响不大,部分或完全摆脱了农作物对自然条 件的依赖。由于温室大棚能带来可观的经济效益,所以温室大棚技术越来越普及,并且 已成为农民增收的主要手段。 随着大棚技术的普及,温室大棚数量不断增多,温室大棚的温湿度控制便成为一个 十分重要的课题。传统的温湿度控制是在温室大棚内部悬挂温度计和湿度计,通过读取 温度值和湿度值了解实际温湿度度,然后根据现有温湿度与额定温湿度进行比较,看温 湿度是否过高或过低,然后进行相应的通风或者洒水。这些操作都是在人工情况下进行 的,耗费了大量的人力物力。现在,随着国家经济的快速发展,农业产业规模的不断提 高,农产品在大棚中培育的品种越来越多,对于数量较多的大棚,传统的温度控制措施 就显现出很大的局限性。温室大棚的建设对温湿度检测与控制技术也提出了越来越高的 要求。 今天,我们的生活环境和工作环境有越来越多称之为单片机的小电脑在为我们服 务。单片机在工业控制、尖端武器、通信设备、信息处理、家用电器等各测控领域的应 用中独占鳌头。时下,家用电器和办公设备的智能化、遥控化、模糊控制化已成为世界 潮流,而这些高性能无一不是靠单片机来实现的。采用单片机来对温湿度进行控制,不 仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控温湿度的技术 指标,从而能够大大提高产品的质量和数量。单片机以其功能强、体积小、可靠性高、 造价低和开发周期短等优点,成为自动化和各个测控领域中必不可少且广泛应用的器 件,尤其在日常生活中也发挥越来越大的作用。因此,单片机对温湿度的控制问题是一 个工农业生产中经常会遇到的问题。因此,本课题围绕基于单片机的温室大棚控制系统 展开了应用研究工作。 1 大连交通大学2010届本科生毕业设计(论文) 1.2选题的现实意义 随着单片机和传感技术的迅速发展,自动检测领域发生了巨大变化,温室环境自动 监测控制方面的研究有了明显的进展,并且必将以其优异的性能价格比,逐步取代传统 的温湿度控制措施.但是,目前应用于温室大棚的温湿度检测系统大多采用模拟温度传 感器、多路模拟开关、A/D转换器及单片机等组成的传输系统。这种温湿度度采集系统 需要在温室大棚内布置大量的测温电缆,才能把现场传感器的信号送到采集卡上,安装 和拆卸繁杂,成本也高。同时线路上传送的是模拟信号,易受干扰和损耗,测量误差也 比较大。为了克服这些缺点,本文参考了一种基于单片机并采用数字化单总线技术的温 度测控系统应用于温室大棚的的设计方案闭,根据实用者提出的问题进行了改进,提出 了一种新的设计方案,在单总线上传输数字信号。 本文介绍的温湿度测控系统就是基于单总线技术及其器件组建的。该系统能够对大 棚内的温湿度进行采集,利用温湿度传感器将温室大棚内温湿度的变化,变换成数字量, 其值由单片机处理,最后由单片机去控制液晶显示器,显示温室大棚内的实际温湿度, 同时通过与预设量比较,对大棚内的温度进行自动调节,如果超过我们预先设定的湿度 限制,湿度报警模块将进行报警。这种设计方案实现了温湿度实时测量、显示和控制。 该系统抗干扰能力强,具有较高的测量精度,不需要任何固定网络的支持,安装简单方 便,性价比高,可维护性好。这种温湿度测控系统可应用于农业生产的温室大棚,实现 对温度的实时控制,是一种比较智能、经济的方案,适于大力推广,以便促进农作物的 生长,从而提高温室大棚的亩产量,以带来很好的经济效益和社会效益。 2 大连交通大学2010届本科生毕业设计(论文) 第二章 系统硬件电路的设计 2.1系统硬件构成及其测控原理 DHT11温湿度检测模块 LCD1602显示模块 复位模块 STC89C52温度调节模块 晶振模块 湿度报警模块 图2-1 系统整体框图 图2-2 系统整体电路图 本系统由如图2-1、图2-2所示,DHT11温湿度传感器采集数据,STC89C52单片机进行数据处理,LCD1602显示模块显示温湿度。由PWM控制温度调节模块进行温度调 3 大连交通大学2010届本科生毕业设计(论文) 节,当温度小于18?时,M4QA045电机停止运转,当温室大于28?时,M4QA045电 机全速运转,当温度处于18?和28?之间时,通过PWM控制M4QA045电机转速。由STC89C52单片机输出高低电平控制湿度报警模块,当湿度大于65%RH或者小于45%RH时,STC89C52单片机输出高电平,湿度报警模块报警,当湿度处于45%RH和 65%RH之间时,STC89C52单片机输出低电平,湿度报警模块关闭。 2.2单片机的选择 2.2.1单片机概述 单片微型计算机简称单片机,又称微控制器,嵌入式微控制器等,属于第四代电子 计算机。它把中央处理器、存储器、输入/输出接口电路以及定时器叶数器集成在一块 芯片上,从而具有体积小、功耗低、价格低廉、抗干扰能力强且可靠性高等特点,因此, 适合应用于工业过程控制、智能仪器仪表和测控系统的前端装置。正是由于这一原因, 国际上逐渐采用微控制器(MCU)代替单片微型计算机(SCM)这一名称。“微控制器”更能反映单片机的本质,但是由于单片机这个名称已经为国内大多数人所接受,所以仍沿用 “单片机”这一名称。 1、单片机的主要特点有: (1) 具有优异的性能价格比。 (2) 集成度高、体积小、可靠性高。 (3) 控制功能强。 (4) 低电压,低功耗。 2、单片机的主要应用领域: (1) 工业控制 (2) 仪器仪表 (3) 电信技术 (4) 办公自动化和计算机外部设备 (5) 汽车和节能 (6) 制导和导航 (7) 商用产品 (8) 家用电器 因此,在本课题设计的温湿度测控系统中,采用单片机来实现。在单片机选用方面, 由于STC89系列单片机与MCS-51系列单片机兼容,所以,本系统中选用STC89C52单片机。 4 大连交通大学2010届本科生毕业设计(论文) 2.2.2 STC89C52单片机的引脚说明 图2-3 STC89C52单片机引脚图 芯片引脚如图2-3所示: VCC : 电源。 GND: 地。 P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器 时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要 外部上拉电阻。 P1口: 是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口 使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表1所示。在flash编程和校验时,P1口接收低8位地址字节。 P2口:P2口是一个具有内部上拉电阻的8 位双向I/O口,P2输出缓冲器能驱动4个TTL 逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输 入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 5 大连交通大学2010届本科生毕业设计(论文) 在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。 P3口:P3口是一个具有内部上拉电阻的8 位双向I/O 口,p2 输出缓冲器能驱动4 个TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输 入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如上表2-1所示。在flash编程和校验时,P3口也接收一些控制信号。 RST: 复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。 看门狗计时完成后,RST 脚输出96 个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。 ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。 在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器 或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置 “1”,ALE操作将无效。这一位置 “1”,ALE 仅在执行MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE 使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。 PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当STC89C52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数 据存储器时,PSEN将不被激活。 EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12伏VPP电压。 XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。 程序存储器:如果EA引脚接地,程序读取只从外部存储器开始。对于89S52,如果EA 接VCC,程序读写先从内部存储器(地址为0000H~1FFFH)开始,接着从外部寻 址,寻址地址为:2000H~FFFFH。 数据存储器:STC89C52 有256 字节片内数据存储器。高128 字节与特殊功能寄存器重叠。也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的。 当一条指令访问高于7FH 的地址时,寻址方式决定CPU 访问高128 字节RAM 还是特殊功能寄存器空间。直接寻址方式访问特殊功能寄存器(SFR) 定时器2:定时器2是一个16位定时/计数器,它既可以做定时器,又可以做事件 6 大连交通大学2010届本科生毕业设计(论文) 计数器。其工作方式由特殊寄存器T2CON中的C/T2位选择(如表2所示)。定时器2有三种工作模式:捕捉方式、自动重载(向下或向上计数)和波特率发生器。工作模式 由T2CON中的相关位选择。定时器2 有2 个8位寄存器:TH2和TL2。在定时工作方式中,每个机器周期,TL2 寄存器都会加1。由于一个机器周期由12 个晶振周期构成,因此,计数频率就是晶振频率的1/12。 中断:STC89C52 有6个中断源如表2-2所示:两个外部中断(INT0 和INT1),三个定时中断(定时器0、1、2)和一个串行中断每个中断源都可以通过置位或清除特 殊寄存器IE 中的相关中断允许控制位分别使得中断源有效或无效。IE还包括一个中断允许总控制位EA,它能一次禁止所有中断。定时器2可以被寄存器T2CON中的TF2和EXF2的或逻辑触发。程序进入中断服务后,这些标志位都可以由硬件清0。实际上,中断服务程序必须判定是否是TF2 或EXF2激活中断,标志位也必须由软件清0[1]。 表2-2 中断控制寄存器 符号 位地址 功能 EA IE.7 中断总允许控制位。EA=0,中断总禁止;EA=1,各中断由 各自的控制位设定 - IE.6 预留 ET2 IE.5 定时器2中断允许控制位 ES IE.4 串行口中断允许控制位 ET1 IE.3 定时器1中断允许控制位 EX1 IE.2 外部中断1允许控制位 ET0 IE.1 定时器0中断允许控制位 EX0 IE.0 外部中断1允许控制位 2.2.3 STC89C52单片机最小系统 图2-4 晶振电路 7 大连交通大学2010届本科生毕业设计(论文) 图2-5 复位电路 如图2-4、图2-5所示,复位电路和时钟电路是维持单片机最小系统运行的基本模 块。单片机最小系统是在以51单片机为基础上扩展,使其能更方便地运用于测试系统 中,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被测试的技 术指标,从而能够大大提高产品的质量和数量。单片机以其功能强、体积小、可靠性高、 造价低和开发周期短等优点,称为在实时检测和自动控制领域中广泛应用的器件,在工 业生产中称为必不可少的器件,尤其是在日常生活中发挥的作用也越来越大[2]。 2.3 显示模块的选择 2.3.1 LCD1602概述 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,如图2-5所示,目前常用16×1,16×2,20×2和40×2行等模块。现在的字符型液晶模块 已经是单片机应用设计中最常用的信息显示器件了。1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。1602型LCD可以显示2行16个字符,有8位数据总线D0-D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光 功能[3]。 8 大连交通大学2010届本科生毕业设计(论文) 图2-6 LCD1602实物图 2.3.2 LCD1602基本参数及引脚功能 1602LCD主要技术参数: 显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm 引脚功能如表2-3所示: 表2-3 引脚功能 编号 符号 引脚说明 编号 符号 引脚说明 1 VSS 电源地 9 D2 数据 2 VDD 电源正极 10 D3 数据 3 VL 液晶显示偏压 11 D4 数据 4 RS 数据/命令选择 12 D5 数据 5 R/W 读/写选择 13 D6 数据 6 E 使能信号 14 D7 数据 7 D0 数据 15 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最 高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可 以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。 9 大连交通大学2010届本科生毕业设计(论文) 表2-4 LCD1602控制命令 序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示 0 0 0 0 0 0 0 0 0 1 2 光标返回 0 0 0 0 0 0 0 0 1 * 置输入模式 I/3 0 0 0 0 0 0 0 1 S D 4 显示开/关控制 0 0 0 0 0 0 1 D C B 光标或字符移位 S/R/5 0 0 0 0 0 1 * * C L 6 置功能 0 0 0 0 1 DL N F * * 7 置字符发生存贮器地址 0 0 0 1 字符发生存贮器地址 8 置数据存贮器地址 0 0 1 显示数据存贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 10 写数到CGRAM或DDRAM) 1 0 要写的数据内容 11 从CGRAM或DDRAM读数 1 1 读出的数据内容 LCD1602的读写操作,如图2-7、图2-8所示、屏幕和光标的操作都是通过指令编 程来实现的。 指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平 表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示 5x10的点阵字符。 指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收 命令或者数据,如果为低电平表示不忙。 指令10:写数据。 10 大连交通大学2010届本科生毕业设计(论文) 指令11:读数据。 图2-7 读操作时序 图2-8 写操作时序 图2-9 LCD1602内部显示地址 如图2-9所示,第二行第一个字符的地址是40H,那么是否直接写入40H就可以将 11 大连交通大学2010届本科生毕业设计(论文) 光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7 恒定为高电平1所以实际写入的数据应该是01000000B(40H) +10000000B(80H)=11000000B(C0H)。在对液晶模块的初始化中要先设置其显示模式,在 液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶 模块是否处于忙的状态。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等, 每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H), 显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。 1602LCD的一般初始化(复位)过程: (1)延时15mS (2)写指令38H(不检测忙信号) (3)延时5mS (4)写指令38H(不检测忙信号) (5)延时5mS (6)写指令38H(不检测忙信号) (7)以后每次写指令、读/写数据操作均需要检测忙信号 (8)写指令38H:显示模式设置 (9)写指令08H:显示关闭 (10)写指令01H:显示清屏 (11)写指令06H:显示光标移动设置 (12)写指令0CH:显示开及光标设置 2.4 温湿度传感器的选择 2.4.1 DHT11数字温湿度传感器概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它 应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越 的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高 等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的 形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单 线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离 可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针 单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。 2.4.2 DHT11数字温湿度传感器性能说明 12 大连交通大学2010届本科生毕业设计(论文) 表2-5 DHT11数字温湿度传感器性能 参数 条件 Min Typ Max 单位 湿度 分辨率 1 1 1 %RH 8 Bit 重复性 ?1 %RH 精度 25? ?4 %RH 0-50? ?5 %RH 互换性 可完全互换 量程范围 0? 30 90 %RH 25? 20 90 %RH 50? 20 80 %RH 响应时间 1/e(63%)25?,6 10 15 S 1m/s 空气 迟滞 ?1 %RH 长期稳定性 典型值 ?1 %RH/yr 温度 分辨率 1 1 1 ? 8 8 8 Bit 重复性 ?1 ? 精度 ?1 ?2 ? 量程范围 0 50 ? 响应时间 1/e(63%) 6 30 S 图2-10 典型应用电路 建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的 上拉电阻。DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状 态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容, 用以去耦滤波。 DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时 13 大连交通大学2010届本科生毕业设计(论文) 间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下: 一次完整的数据传输为40bit,高位先出,数据格式:8bit湿度整数数据+8bit湿度小数数据,+8bi温度整数数据+8bit温度小数数据+8bit校验和 数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。 用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。 总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。 总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。 测量分辨率分别为 8bit(温度)、8bit(湿度)。 2.4.3 DHT11数字温湿度传感器使用注意事项 表2-6 DHT11电气特性 参数 条件 min typ max 单位 供电 DC 3 5 5.5 V 供电电流 测量 0.5 2.5 mA 平均 0.2 1 mA 待机 100 150 uA 采样周期 秒 1 次 DHT11电器特性如表2-6所示,超出建议的工作范围可能导致高达3%RH的临时性漂移信号。返回正常工作条后,传感器会缓慢地向校准状态恢复。 电阻式湿度传感器的感应层会受到化学蒸汽的干扰,化学物质在感应层中的扩散可 能导致测量值漂移和灵敏度下降。在一个纯净的环境中,污染物质会缓慢地释放出去。 下文所述的恢复处理将加速实现这一过程。高浓度的化学污染会导致传感器感应层的彻 底损坏。 14 大连交通大学2010届本科生毕业设计(论文) 置于极限工作条件下或化学蒸汽中的传感器,通过如下处理程序,可使其恢复到校 准时的状态。在50-60?和< 10%rh的湿度条件下保持2="" 小时(烘干);随后在20-30?和="">70%RH的湿度条件下保持 5小时以上。 气体的相对湿度,在很大程度上依赖于温度。因此在测量湿度时,应尽可能保证湿 度传感器在同一温度下工作。如果与释放热量的电子元件共用一个印刷线路板,在安装 时应尽可能将DHT11远离电子元件,并安装在热源下方,同时保持外壳的良好通风。为 降低热传导,DHT11与印刷电路板其它部分的铜镀层应尽可能最小,并在两者之间留出 一道缝隙。 长时间暴露在太阳光下或强烈的紫外线辐射中,会使性能降低。 DATA信号线材质量会影响通讯距离和通讯质量,推荐使用高质量屏蔽线。 手动焊接,在最高260?的温度条件下接触时间须少于10秒。 (1)避免结露情况下使用。 (2)长期保存条件:温度10-40?,湿度60%以下。 2.5 温度调节模块设计 1、方案一 图2-12 方案一电路图 如图2-12所示,由PWM控制温度调节模块,当PWM端输入高电平时,电流经Q1放大,光耦导通,光耦输出电流经Q2放大后,使双向可控硅导通,M4QA045电机运转,当PWM端输入低电平时,双向可控硅控制端输入电流为0,交流电过零以后,双向可控硅 截止,M4QA045电机停止运转[4]。 2、方案二 15 大连交通大学2010届本科生毕业设计(论文) 图2-13 方案二电路图 如图2-13所示,由PWM控制温度调节模块,当PWM端输入高电平时,电流经Q4放大,常开端5闭合,M4QA045电机运转,当PWM端输入低电平时,常开端5断开,M4QA045电机停止运转。 3、方案比较 方案一采用光耦隔离强电,方案二采用继电器隔离强电,但方案一没有实现强电与 直流源的隔离,且方案一环节复杂,计算难度大,过多的环节延长响应时间,从而影响 温度调整模块的性能,所以选择方案二[5]。 图2-14 电热器驱动电路 基于以上两个方案的分析,加热器驱动电路也同样选用继电器隔离,当温度低于 18?时,相应引脚输出高电平,电流经过三极管放大,继电器常开端闭合,电热器工作, 16 大连交通大学2010届本科生毕业设计(论文) 当温度高于23?时,相应引脚输出低电平,继电器常开端关闭,电热器不工作[6]。 2.6 湿度报警模块设计 图2-14 湿度报警模块电路图 如图2-14所示,由STC89C52单片机在BUZZER端输入信号控制湿度报警模块。当 湿度大于65%RH或者小于45%RH时,BUZZER端输入高电平,电流经Q3放大,使蜂鸣器工作;当湿度处于45%RH和65%RH之间时,BUZZER端输入低电平,蜂鸣器不工作[7]。 17 大连交通大学2010届本科生毕业设计(论文) 第三章 温室大棚控制系统软件设计 3.1 Keil C 软件概述 单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为 CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少 使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语 言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试 器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。 运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不 使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也 会令你事半功倍。 Keil C51开发系统基本知识Keil C51开发系统基本知识: 1. 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学 易用。用过汇编语言后再使用C来开发,体会更加深刻。 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软 件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。 2. Keil C51单片机软件开发系统的整体结构 C51工具包的整体结构,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开 发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起 经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标 板进行调试,也可以直接写入程序存贮器如EPROM中。 18 大连交通大学2010届本科生毕业设计(论文) 使用独立的Keil仿真器时,注意事项: *仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频 率的晶振。 *仿真器上的复位按钮只复位仿真芯片,不复位目标系统。 *仿真芯片的31脚已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展 有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。 1、安装好了Keil软件以后,我们打开它。 2、 我们先新建一个工程文件,点击“Project->New Project?”菜单。 3、选择工程文件要存放的路径 ,输入工程文件名 xdch 最后单击保存。 4、在弹出的对话框中选择 CPU 厂商及型号。 5、选择好STC89C52芯片,接着点击确定,弹出对话框。 6、新建一个 C51 文件, 单击左上角的 New File,保存为DS18B20_4.C,(注意后缀名必须为.C),再单击“保存”。 7、存好后把此文件加入到工程中方法如下:用鼠标在 Source Group1 上单击右键, 然后再单击 Add Files to Group Source Group 1。 8、 选择要加入的文件, 找到 MAIN.C后, 单击 Add, 然后单击 Close。 9、在编辑框里输入代码。 10、生成 .hex 烧写文件,先单击Options for Target。 11、在下图中,我们单击 Output, 选中 Create HEX F,再单击“确定”。 以上是Keil软件的基本应用[8]。 19 大连交通大学2010届本科生毕业设计(论文) 3.2 温室大棚控制系统程序设计 3.2.1整体系统框图 单片机、LED1602初始化 DNT11数据采集 温湿度数据转换 N LCD1602温湿度数据显示 根据测得温度调整PWM占空比 根据测得湿度控制蜂鸣器 system_stop是否等于0? Y 结束 图4-1 系统整体框图 20 大连交通大学2010届本科生毕业设计(论文) 首先,初始化单片机设置中断,定义变量,然后初始化LCD1602显示模块,设置8 位格式,2行,5*7矩阵显示,整体显示,关光标,不闪烁设定输入方式,增量不移位, 清除屏幕显示。调用温湿度采集程序进行数据采集,经过数据转换程序,将十六进制转 换成十进制,将十进制数据输出到LCD1602显示模块进行显示,根据温度调整电机转速, 根据湿度判断是否报警,最后,进行新一轮的温湿度采集[9]。 3.2.2 LCD1602显示模块程序设计 LCD1602显示模块初始化 延时 数据转换十六进制?十进 制 是否在第一行显示数据? NY address = 0x80 + xaddress = 0xc0 + x 输入显示地址命令 延时 输入显示数据 结束 图4-2 显示程序框图 21 大连交通大学2010届本科生毕业设计(论文) 如图4-2,初始化LCD1602显示模块,设置8位格式,2行,5*7矩阵显示,整体显示,关光标,不闪烁设定输入方式,增量不移位,清除屏幕显示,延时等待,将采集到 的温湿度数据进行转换,十六进制转换成十进制,然后,判断是否在第一行显示,输入 相应的地址数据,延时等待,输入需要显示的数据。 3.2.3 PWM程序设计 中断初始化,变量定义 开始定时器T0 等待中断 调用中断子程序 T0_number = T0_number > 1000 T0_number <> 输出0 图4-3 PWM程序框图 如图4-3所示,进行中断程序初始化,设置定时器T0中断时间为1ms,中断100次,即100ms作为一个脉冲周期,每中断一次,由变量T0_number进行计数,当变量T0_number大于100时,给变量T0_number赋值0,重新开始计数,当变量T0_number小于变量PWM_width_H时,输出高电平,当变量T0_number大于变量PWM_width_H时,输出低电平,以此控制脉宽[10]。 22 大连交通大学2010届本科生毕业设计(论文) 第四章 调试中遇到的问题 在软件的调试过程中,遇到的问题有很多,下面就几个比较突出的问题进行说明。 1)在对Keil C的使用时不知道怎么才能让它生成HEX文件,从而进行仿真,因为以前没有用过类似的软件,不会并且也不知道需要生成HEX文件,导致前期的工作很难进行 2 )因为用的是DHT11数字传感器,在编程过程中需要对所测得温度进行处理,而 且需要给定一个温度范围,建立一个温度与电机转速的数学模型,经过反复的计算、实 验才实现。 3)因为考虑到经济实用方面,所以在进行实物操作之前,采用proteus软件对程 序和硬件电路进行仿真,可是在仿真过程中,独立按键总是不灵敏,这需要对延迟时间 进行调整,而程序中设置的延迟时间总是不能够很符合实际操作,所以在这方面浪费了 大量的时间进行反复的操作和实验 4)在仿真过程中,因为用到的是LCD1602显示模块,这种显示模块是可以显示字 符的,并且这种模块本身带有字库,但事实仿真过程中,电路要求相对宽松,不需加上 拉电阻,而实际的电路调试过程需要加上拉电阻。 23 大连交通大学2010届本科生毕业设计(论文) 结 论 以上为毕业期间所设计的温室大棚控制控制系统,它经过多次修改和整理,可以满 足设计的基本要求。采用STC89C52单片机、DHT11数字温湿度传感器、LCD1602液晶显 示模块和M4QA045电机等器件设计温室大棚控制系统,实现温湿度采集、英文显示;温 度自动调节,湿度越限报警功能。 因为本人水平有限,此设计存在一定的问题。譬如系统抗干扰能力差,且没有实现 自动自动复位。由于使用的是单片机作为核心的控制元件,配合其它器件,使本温度控 制系统具有功能强、性能可靠、电路简单、成本低的特点,加上经过优化的程序,使其 有很高的智能化水平。 24 大连交通大学2010届本科生毕业设计(论文) 谢 辞 经过这段时间的忙碌和工作,本次毕业设计已经接近尾声,作为一个本科生的毕业 设计,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有导师的督促指导,以 及同学们的支持和帮助,想要完成这个设计是难以想象的。 在这里首先要感谢我的导师费继友教授。费教授平日里工作繁多,但在我做毕业设 计的每个阶段,从设计草案的确定和修改,中期检查,后期详细设计,装配草图等整个 过程中都给予了我悉心的指导。他的治学严谨和科学研究的精神也是我永远学习的榜 样,并将积极影响我今后的学习和工作。 然后,还要感谢大学四年来所有的老师,为我们打下测控技术与仪器专业知识的基 础;同时还要感谢所有的同学以及研究生们,正是因为有了你们的支持和鼓励,此次毕 业设计才会顺利完成。 最后感谢母校—大连交通大学四年来对我的大力栽培。 25 大连交通大学2010届本科生毕业设计(论文) [1] 孙育才.MCS-51系列单片微型计算机及其应用(第四版) [M].南京:东南大学出版社,2004 [2] 康华光.电子技术基础-模拟部分(第四版)[M].北京:高等教育出版社,1999 [3] 康华光.电子技术基础-数字部分(第四版)[M].北京:高等教育出版社,1999 [4] 石来德.机械参数电测技术[M].上海:上海科学技术出版社,1981 [5] Ernest O.Doebelin. Measurement Systems: Application and Design [M].America: McGraw-HILL BOOK COMPANY,1976 [6] 曹继松.测试电路[M].上海:上海交通大学出版社,1995 [7] 谢自美.电子线路设计实验测试[M].武汉:华中科技大学出版社,2000 [8] 马靖善,秦玉平.C语言程序设计[M].北京:清华大学出版社,2005 [9] 赖麒文.8051 单片机 C语言开发环境实务与设计 [M].北京:科学出版社,2002 [10] 徐爱钧.智能化测量控制仪表原理与设计[M].北京:北京航空航天大学出版社,2004 26 大连交通大学2010届本科生毕业设计(论文) 附 录 #include #include #define LCD_DB P2 sbit DQ = P1^0; sbit BUZZER = P1^1; sbit PWM = P1^2; sbit LCD_RS = P1^4; sbit LCD_RW = P1^5; sbit LCD_E = P1^6; sbit HEAT = P1^7; void initial(void); void read_DHT11(void); void LCD_write_command(unsigned char com); void LCD_display_char(unsigned char x, unsigned char y, unsigned char dat); unsigned char read_DHT11_char(void); void control_temperature_humidity(void); void delay_xms(unsigned int time_xms); void delay_x10us(unsigned int time_x10us); unsigned char stop_system = 0; unsigned char lineOne[] = "TS(0-50): C"; unsigned char lineTwo[] = "HS(20-90): %RH"; unsigned int T0_number = 0, T1_number, PWM_width_H; unsigned char temperature_ten, temperature_one, humidity_ten, humidity_one; unsigned char temperature_H, temperature_L, humidity_H, humidity_L, checkData; void initial(void) { unsigned char i, j; 27 大连交通大学2010届本科生毕业设计(论文) TMOD = 0x11; //定时器0工作方式1,16位计数器;定时器1工作方式1,16位 计数器 TH1 = 0xFC; //定时器1溢出周期1ms,延时 TH1 = 0x66; TH0 = 0xFC; //定时器0中断周期1ms,PWM TL0 = 0x66; EA = 1; ET1 = 1; ET0 = 1; EX0 = 1; IT1 = 1; TR0 = 1; LCD_write_command(0x38); //设置8位格式,2行,5x7 LCD_write_command(0x0c); //设置整体显示,关闭光标,且不闪烁 LCD_write_command(0x06); //设置输入方式,增量不移位 LCD_write_command(0x01); //清屏 for (i = 0; i < 16;="" i++)=""> { LCD_display_char(i, 1, lineOne[i]); } for (j = 0; j < 16;="" j++)=""> { LCD_display_char(j, 2, lineTwo[j]); } LCD_display_char(14, 1, 0xDF); //显示 } void read_DHT11(void) { DQ = 0; delay_xms(18); 28 大连交通大学2010届本科生毕业设计(论文) DQ = 1; delay_x10us(2); if (DQ == 0) { while (DQ == 0); while (DQ == 1); humidity_H = read_DHT11_char(); humidity_L = read_DHT11_char(); temperature_H = read_DHT11_char(); temperature_L = read_DHT11_char(); } } unsigned char read_DHT11_char(void) { unsigned char i, temp_one, temp_two; for (i = 0; i < 8;="" i++)=""> { while (DQ == 0); delay_x10us(3); if (DQ == 0) { temp_one = 0; } else { temp_one = 1; } temp_two <= 1;="">=> temp_two |= temp_one; while(DQ == 1); } return temp_two; 29 大连交通大学2010届本科生毕业设计(论文) } void LCD_write_command(unsigned char com) { LCD_DB = com; LCD_RS = 0; LCD_RW = 0; LCD_E = 1; delay_xms(1); LCD_E = 0; delay_xms(5); } void LCD_display_char(unsigned char x, unsigned char y, unsigned char dat) { if (y == 1) { LCD_write_command(0x80 + x); } else { LCD_write_command(0xc0 + x); } LCD_DB = dat; LCD_RS = 1; LCD_RW = 0; LCD_E = 1; delay_xms(1); LCD_E = 0; delay_xms(5); } void LCD_display_DHT11(void) { 30 大连交通大学2010届本科生毕业设计(论文) temperature_ten = temperature_H / 10 + 0x30; temperature_one = temperature_H % 10 + 0x30; humidity_ten = humidity_H / 10 + 0x30; humidity_one = humidity_H % 10 + 0x30; LCD_display_char(12, 1, temperature_ten); LCD_display_char(13, 1, temperature_one); LCD_display_char(11, 2, humidity_ten); LCD_display_char(12, 2, humidity_one); } void control_temperature_humidity(void) { if (temperature_H > 28) //温度?转速 { PWM_width_H = 100; } else if (temperature_H < 18)=""> { PWM_width_H = 0; HEAT = 1; } else { if (temperature_H >= 23) { HEAT = 0; } PWM_width_H = (temperature_H - 18) * 10; } if (humidity_H > 65 || humidity_H < 45)="" 湿度?蜂鸣=""> { BUZZER = 1; } 31 大连交通大学2010届本科生毕业设计(论文) else { BUZZER = 0; } } void delay_xms(unsigned int time_xms) { T1_number = 0; TR1 = 1; while (1) { if (time_xms == T1_number) { break; } } TR1 = 0; } void delay_x10us(unsigned int time_x10us) { while (time_x10us--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 32 大连交通大学2010届本科生毕业设计(论文) _nop_(); } } void main(void) { initial(); while(1) { delay_xms(2000); read_DHT11(); LCD_display_DHT11(); control_temperature_humidity(); } } void INT_0(void) interrupt 0 { stop_system = 1; } void Timer_0(void) interrupt 1 { TH0 = 0xFC; //定时器0中断周期1ms,PWM TL0 = 0x66; T0_number++; if (T0_number > 100) { T0_number = 0; } else if (T0_number < pwm_width_h)=""> 33 大连交通大学2010届本科生毕业设计(论文) { PWM = 1; } else { PWM = 0; } } void Timer_1(void) interrupt 3 { TH1 = 0xFC; //定时器1溢出周期1ms,延时 TL1 = 0x66; T1_number++; } 34 第1章 绪 论 我国南方温度炎热而漫长,大力推广大棚蔬菜的种植来满足人们日常生活对蔬菜的需要。随着人们生活水平的日益增长,对蔬菜的要求也较高,对大棚蔬菜的温度控制就是一个重要因素。温度过高,蔬菜就会停止生长或者糜烂。 本系统就基于单片机AT89C52实现对大棚温度的自动化控制。用数字温度模块DS18B20采集,将采集到的温度用显示屏显示,再根据采集到的温度,控制马达的转速,从而实现对大棚温度的控制。当温度大于35℃,喇叭产生报警信号。 1.1 系统的概述 应用自动控制和电子计算机实现农业生产和管理的自动化,是农业现代化的重要标志之一。近年来电子技术和信息技术的飞速发展,带来了温室控制与管理技术方面的一场革命,随着“设施农业”、“虚拟农业”等新名称的出现。温度计算机控制与管理系统正在不断吸收自动控制和信息管理领域的理论和方法,结合温室作物种植的特点,不断创新,逐步完善,从而使温室种植业实现真正意义上的现代化,产业化。 本系统以AT89C52单片机为控制核心的测控仪,主要是为了对蔬菜大棚内的温度,地检测与控制而设计的。该测控仪具有检测精度高、使用简单、成本较低和工作稳定可靠等特点,所以具有一定的应用前景。 1.2 系统的要求 本系统通过单片机AT89C52控制, 用DS18B20数字温度模块采集温度。通过LCD1602液晶显示屏显示当前温度,当温度高于20℃,马达将带动风扇的转动,实现自动控制大棚里的温度。当检测到的温度高于35℃时,发出报警信号。本设计将实现大棚温度的自动化控制。 1.3 系统的主要模块 1.3.1 本系统的主要组成部分 本系统为一个全自动温度检测与控制系统,由以下几个部分组成:AT89C52单片机,温度检测,显示电路,马达,及报警装置等组成。组成图如图1-1。 图 1-1 温度自动控制构成图 由图1-1所示,本系统的核心部分是AT89C52,此芯片是该电路的枢纽。由它先控制着温度的检测,用检测到的温度实现马达的自动控制,以及显示。若检测到的温度高于设定的值,则发出报警信号。 1.3.2 各部分的功能 AT89C52单片机:它是系统的中央处理器,担负着系统的控制和运算。温度检测装置:DS18B20数字温度模块对大棚内温度进行采集,将温度转换成数字。显示设备:主要是用于显示检测到的大棚温度。马达:主要用于带动风扇的转动。报警装置:产生报警信号。 1.3.3 工作原理 首先对硬件系统DS18B20定义端口为P1.3,P2.4,P2.5,P2.6和P0口控制液晶LCD1602的显示,定义端口P1.5为马达控制端口,P1.7为喇叭控制端口。首先对温度采集,将采集到的温度转换数字,采集到的温度由LCD 液晶显示屏显示。再将采集到的温度所属软件设置的哪个范围,而控制P1.5的电平输出。 第2章 设计的理论基础 整个控制系统由软件程序设计。根据系统具体要求,可以对具体部分进行分析设计。但要实现对各部分的设计,需要充分了解各部分的理论基础。本设计系统的基本组成单元包括:单片机控制单元,DS18B20温度检测电路,LCD1602显示屏,直流马达,蜂鸣器报警装置。 2.1 AT89C52的工作原理 2.1.1 CPU的结构 CPU 是单片机内部的核心部分,是单片机的指挥和执行机构,它决定了单片机的主要功能特性。从功能上看,CPU 包括两个基本部分:运算器和控制器[1]。 2.1.2 CPU的结构I/O口结构 AT89C52单片机有4个8位并行I/O接口,记作P0、P1、P2和P3,每个端口都是8位准双向口,共占32根引脚。每一条I/O线都能独立地用作输入或输出。每个端口都包括一个锁存器,一个输出驱动器和输入缓冲器,作输出时数据可以锁存,作输入时数据可以缓冲,但是这四个通道的功能完全不同。如图2-1。 图2-1 AT89C52引脚及管脚功能 2.1.3 程序存储器 程序存储器通过16位程序计数器寻址,寻址能力为64K 字节。这能在6K 地址空间内任意寻址,但没有指令使程序能控制从程序存储器空间转移到数据存储空间。对AT89C52芯片来说,片内有8K 字节ROM/EPROM,片外可扩展60K 字节EPROM ,片内和片外程序存储器统一编址。 2.1.4 定时器 定时器T0具有方式0、方式1、方式2和方式3四种工作方式。T1具有方式0、方式1和方式2三种工作方式。不管是定时工作方式还是计数方式,定时器T0和T1在对内部时钟或对外部时间计数时,不占用CPU 时间,除非定时器/计数器溢出,才可能中断CPU 的当前操作。由此可见,定时器是单片机中效率最高而且工作灵活的部件。 2.1.5 中断系统 中断是指中央CPU 正在处理某事情的时候,外部发生了某一事件,请求CPU 迅速去处理,于是,CPU 暂时中断当前的工作,转入处理所发生的事件;中断服务处理完成以后,再回到原来被中断的工作,这样的过程称为中断[2]。 2.2 单总线数字温度传感器DS18B20检测电路 由于传统的热敏电阻等测温元件测出的一般都是电压,再转换成对应的温度,需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高。这里采用DALLAS 公司的数字温度传感器DS18B20作为测温元件。 2.2.1 DS18B20简介 DS18B20数字温度传感器采用DS18B20可组网数字温度传感器芯片封装二成,具有耐磨耐碰,体积小使用方便,封装形式多样等优点,适用于各种狭小空间设备数字温度和控制领域[3]。 2.2.2 DS18B20 的性能特点 ① 适应电压范围更宽,电压范围:3.0~5.5V ,在寄生电源方式下可由数据线供电。② 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实 现微处理器与DS18B20的双向通讯。③ DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。④ DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。⑤ 温范围-55℃~+125℃,在-10~+85℃时精度为±0.5。零待机功耗。⑥ 可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。⑦ 在9位分辨率时最多在93.75ms 内把温度转换为数字,12位分辨率时最多在750ms 内把温度值转换为数字,速度更快。 DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH 和TL 、配置寄存器。DS18B20的管脚排列、各种封装形式,DQ 为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND 为地信号;VDD 为可选择的VDD 引脚。当工作于寄生电源时,此引脚必须接地。 图3-1 DS18B20的引脚功能图 图3-2 DS18B20的内部结构图 2.2.3 DS18B20的测温原理 DS18B20的测温原理,低温度系数晶振的振荡频率受温度的影响很小, 用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量. 计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 ℃所对应的一个基数值[4]。 另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20→发ROM 功能命令→发存储器操作命令→处理数据[5]。 2.3 LCD1602液晶显示器 2.3.1 LCD1602简介 字符型LCD1602通常有14条引脚线或16条引脚线的LCD ,多出来的2条线是背光电源线VCC(15脚) 和地线GND(16脚) ,其控制原理与14脚的LCD 完全一样,引脚定义如表2-1所示: 表 2-1引脚接口说明表 第1脚:VSS 为地电源。第2脚:VDD 接5V 正电源。 第3脚:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比 度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K 的电位器调整对比度。 第4脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和R/W共同为低电平时可以写入指令或者显示地址,当RS 为低电平R/W为高电平时可以读忙信号,当RS 为高电平R/W为低电平时可以写入数据。 第6脚:E 端为使能端,当E 端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。 2.3.2 LCD1602的指令说明及时序 LCD1602液晶模块内部的控制器共有11条控制指令[6],如表2-2所示: 表2-2 控制命令表 LCD1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。1为高电平、0为低电平。 指令1:清显示,指令码01H, 光标复位到地址00H 位置。 指令2:光标复位,光标返回到地址00H 。 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。 指令7:字符发生器RAM 地址设置。 指令8:DDRAM 地址设置。 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10:写数据。 指令11:读数据。 LCD1602读写时序如表2-3所示: 表2-3 基本操作时序表 2.4 直流马达 电动马达,又称为马达或电动机,是一种将电能转化成机械能,并可再使用机械能产生动能,用来驱动其他装置的电气设备。 电动机种类非常繁多,但可大致分为交流电动机及直流电动机以用于不同的场合。 2.4.1 马达工作的原理 马达的旋转原理的依据为佛来明左手定则,当一导线置放于磁场内,若导线通上 电流,则导线会切割磁场线使导线产生移动。 电流进入线圈产生磁场,利用电流的磁效应,使电磁铁在固定的磁铁内连续转动的装置,可以将电能转换成力学能。 与永久磁铁或由另一组线圈所产生的磁场互相作用产生动力 直流马达的原理是定子不动,转子依相互作用所产生作用力的方向运动[7]。 电枢:可以绕轴心转动的软铁芯缠绕多圈线圈。 场磁铁:产生磁场的强力永久磁铁或电磁铁。 集电环:线圈约两端接至两片半圆形的集电环,随线圈转动,可供改变电流方向的变向器。每转动半圈,线圈上的电流方向就改变一次。 电刷:通常使用碳制成,集电环接触固定位置的电刷,用以接至电源。 2.4.2 马达的基本构造 电动机的种类很多,以基本结构来说,其组成主要由定子和转子所构成。 定子在空间中静止不动,转子则可绕轴转动,由轴承支撑。 定子与转子之间会有一定空气间隙,以确保转子能自由转动。 定子与转子绕上线圈,通上电流产生磁场,就成为电磁铁,定子和转子其中之一亦可为永久磁铁[8]。 2.5 蜂鸣器 蜂鸣器是一种一体化结构的电子讯响器。蜂鸣器主要分为压电式蜂鸣器和电磁化蜂鸣器两种类型。本系统采用的是电磁式蜂鸣器[9]。 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁铁圈,使电磁铁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。蜂鸣器发声原理是电流通过电磁铁圈,使电磁线圈产生磁场来驱动振动膜发声的。程序中改变单片机引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。另外,改变输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小。 第3章 系统的硬件组成电路设计 系统的硬件组成部分包括:主控制器AT89C52单片机、温度传感器DS18B20、显示电路LCD1602、马达、报警装置等构成。 3.1 系统总硬件设计 首先对硬件系统DS18B20定义端口为P1.3,P2.4,P2.5,P2.6和P0口控制液晶LCD1602的显示,定义端口P1.5为马达控制端口,P1.7为喇叭控制端口。首先对温度采集,将采集到的温度转换数字,采集到的温度由LCM 液晶显示屏显示。再将采集到的温度所属软件设置的哪个范围,而控制P1.5的电平输出。电路原理图如3-1所示: 图 3-1 电路原理图 3.2 单总线数字温度传感器DS18B20检测电路 DQ 为数据输入/输出引脚,连接P1.3。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源,GND 为地信号;VCC 为电源信号。图3-2为DS18B20检测电路。 图 3-2 DS18B20检测电路 3.3 LCD1602显示模块 用AT89C52的P0口作为数据线,用P2.4、P2.5、P2.6分别作为LCD 的E 、R/W、RS 。其中E 是下降沿触发的片选信号,连接P2.6,R/W是读写信号,连接P2.5,RS 是寄存器选择信号,连接P2.4。图3-3为LCD1602的硬件连接。 图 3-3 LCD1602的硬件连接 VEE 用连接阻值为10K 的电阻,主要用于调节对比度的调整。接正电源时对比度最低,接地电源时,对比度最高。对比度过高时,会产生“鬼影”。因此连接一10K 的电阻用以调整[10]。 第4章 系统软件的设计 一个应用系统要完成各项功能,首先必须有较完善的硬件做保证。同时还必须得到相应设计合理的软件的支持,尤其是微机应用高速发展的今天,许多由硬件完成的工作,都可通过软件编程而代替。甚至有些必须采用很复杂的硬件电路才能完成的工作,用软件编和有时会变得很简单。因此充分利用其内部丰富的硬件资源和软件资源。 程序设计语言有三种:机器语言、汇编语言、高级语言。本系统运用的是高级语言所编写,也就是C 语言。 4.1主程序设计 从软件的功能不同可分为四大类:一是检测软件,它是用来检测温度。二是显示部分,用来显示所检测到的温度。三是调控部分,用来控制马达的转速。四是当温度大于35℃,蜂鸣器发出报警信号。每一个执行软件也就是一个小的功能执行模块。这里将各执行模块一一列出,并为每一个执行模块进行功能定义。图4-1为软件设计流程图。 图 4-1 软件设计流程图 4.2 温度检测 4.2.1读取温度设计 DSl8B20可以从单总线获取电源,当信号线为高电平时,将能量贮存在内部电容器中;当单信号线为低电平时,将该电源断开,直到信号线变为高电平重新接上寄生电源为止。此外,还可外接5 V电源,给DS18B20供电[11]。图 4-2 图 4-2 DS18B20读取温度流程图 读取温度子程序的主要功能是读出RAM 中的9个字节,在读出时需进行CRC 校验,校验有错时不进行温度数据的改写。DS18B20的各个命令对时序的要求特别严格,所以必须按照所要求的时序才能达到预期的目的,同时,要注意读进来的是高低位在后,低位在前,共12位数,小数4位,整数7位,还有一位符号位。读取温度的主程序如下: unsigned int ReadTemperature(void) { unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay(200); Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<> t=a+b; return(t); } 4.2.2 温度数据处理设计 读出温度数据后,TempL 的低四位为温度的小数部分,可以精确到0.0625℃,TempL 的高四位和TempH 的低四位为温度的整数部分,TempH 的高四位全部为1表示负数,全为0表示正数。所以先将数据提取出来,分为三个部分:小数部分、整数部分和符号部分。小数部分进行四舍五入处理:大于0.5℃的话,向个位进1;小于0.5℃的时候,舍去不要。当数据是个负数的时候,显示之前要进行数据转换,将其整数部分取反加一。还因为DS18B20最低温度只能为-55℃,所以可以将整数部分的最高位换成一个“-”,表示为负数。图4-3为温度数据处理流程图。 图 4-3 温度数据处理流程 由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。温度高字节高5位是用来保存温度的正负,高字节低3位和低字节来保存温度值。其中低字节的低4位来保存温度的小数位。由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。也就说,本系统的温度精确到了0.1度[12]。 温度数据数理主程序如下: str[0]=TempH/100; //十位温度 str[1]=(TempH%100)/10; //十位温度 str[2]=(TempH%100)%10; //个位温度, 带小数点 str[3]=TempL; if(flag_get==1) //定时读取当前温度 { temp=ReadTemperature(); if(temp&0x8000) { str[0]=0x40;//负号标志 temp=~temp; // 取反加1 temp +=1; } else str[0]=0; TempH=temp>>4; TempL=temp&0x0F; TempL=TempL*6/10;//小数近似处理 flag_get=0; 4.3 液晶显示器LCD1602 4.3.1 LCD1602初始化 端口定义如下: sbit RS = P2^4;//Pin4 sbit RW = P2^5; //Pin5 sbit E = P2^6;//Pin6 #define Data P0 //数据端口 函数显示子码:用数组和指针将字符逐个显示出来[13]。 /*********************************************************************/ void ShowChar(unsigned char pos,unsigned char c) { unsigned char p; if (pos>=0x10) p=pos+0xb0; //是第二行则命令代码高4位为0xc else p=pos+0x80; //是第二行则命令代码高4位为0x8 WriteCommand (p);//write command WriteData (c); //write data } /************************************************************************ */ void ShowString (unsigned char line,char *ptr) { unsigned char l,i; l=line<> for (i=0;i<> ShowChar (l++,*(ptr+i));//循环显示16个字符 } /*********************************************************************/ 4.4马达的控制 温度低于20℃时,P1.7角的输出信号为1,马达不转动。当温度高于20℃,且低于25℃ 马达开始转动且占空比为0.5,温度高于25℃,低于30℃,占空比为0.75。温度高于30℃时,低于35℃时,占空比为0.875。温度高于35℃时,占空比为0.9375。从而实现温度越高,马达的速率越快,从而实现温度的平衡[14]。 马达的控制主程序如下: Fan=1; mDelay(10); Tru=1; mDelay(10); if((TempH>20)&&(TempH<> { Fan=0; mDelay(10);//占空比为0.5 } if((TempH>25)&&(TempH<> { Fan=0; mDelay(30);//占空比为0.675 } if((TempH>30)&&(TempH<> { Fan=0; mDelay(70);//占空比为0.875 } if(TempH>35) //产生报警信号 { Tru=0; mDelay(30); Fan=0; mDelay(150);//占空比为0.9375 } 4.5 报警器的启动 当温度低于35℃时,蜂鸣器不工作。当检测到的温度高于35℃时,蜂鸣器发出频率为2HZ 的报警声。 报警声控制的主程序如下: if(TempH>35) //产生报警信号 { Tru=0; mDelay(10); 频率为2HZ Fan=0; mDelay(150); } 第5章 总结与展望 这次设计的软件已经完成,且能基本实现要求。 ㈠总结 通过这次对大棚温度自动控制的设计与制作,让我们合作完成了一个完整的设计,虽然这次的实习做的温度显示以及马达的控制都相对比较简单,但是也给将来进入硬件开发有了一个起点的基础。在这次实习的过程,刚开始的时候,真的有点不知所措,因为学习完单片机已有数日,以及微机原理课程,一些知识已忘记。幸好有三个星期的时间来准备。画电路原理图,一开始就觉得有点烦,因为protues 软件安装的版本较低,做起来非常的费时又费力,一些芯片,还不可以仿真。常常有解决不了的问题,就上网查询,或者阅览资料书。虽然这项工作枯燥无味,但锻炼了我们的意志,耐性,坚韧,和团队协作的能力。因为常会碰到很难解决的问题,所以要坚持不懈。这次设计是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。它不仅加深了我对单片机技术课程的理解,还让我感受到了电子设计的乐趣,也让我更好的运用WORD 文档,对我来说,这次毕业设计是非常有意义的。 ㈡展望 本系统使用的温度控制器结构简单、测温准确,具有一定的实际应用价值。该智能温度控制器只是DS18B20在温度控制领域的一个简单实例,还是许多需要完善的地方,例如可以将测得的温度通过单片机与通讯模块相连接,以手机短消息的方式发送给用户,使用户能够随时对温度进行监控。还可以增加对湿度的自主控制。此外,还能广泛地应用于其他一些工业生产领域。 测温控温系统得到快速的发展,国外的测量控制系统已经成熟,产品也较多。近两年,国内也出现了许多高精度的温度控制产品,但相对于用户来说,价格还是偏高。而由于竞争越来越激烈,现在企业发展的趋势是如何最有效的提高生产效率,降低生产成本。寻求性能可靠、价格低廉,应用广泛的元器件是生产过程的首先要考虑的问题。 参考文献 [1] 谢自美,尹仕,肖看,赵云娣,罗杰. 电子线路综合设计[M].武汉:华中科技大学出版社, 2007. [2] 杨旭方. 单片机控制与应用实训教程[M].北京: 电子工业出版社, 2010.5. [3] 夏继强. 单片机应用设计培训教程[M].北京:北京航空航天大学出版社, 2008. [4] 高峰. 单片机微型计算机与接口技术[M].北京:科学出版社.2003 [5] 李广弟, 朱月秀, 王秀山. 单片机基础[M].北京:北京航空航天大学出版社, 2001.7. [6] 胡汉才. 单片机原理及其接口技术[M].北京: 清华大学出版社, 2004 [7] 求是科技. 单片机典型模块设计实例导航[M].北京: 人民邮电出版社, 2004 [8] 王化详, 张淑英. 传感器原理[M]天津: 天津大学出版社, 2002.5 [9] 王港元. 电工电子实践指导[M]江西: 江西科学技术出版社, 2005.6 [10] 杨素行著. 模拟电子技术基础(第二版) [M].北京: 高等教育出版社, 2006. [11] 陈静. 单片机应用系统中的编程语言[J].淮北职业技术学院学 报.2009.8(1):43-44. [12] 仝庆华. 基于Proteus 单片机虚拟实验室[J].山西大同大学学报(自然科学版).2009.25(2):23-25. [13] 包敬海,侯昭武,吴国辉. 基于AT89C52单片机设计智能锅炉控制系统[J]. [北京]中国科技信息.2009 [14] 周红丽,张天开等.基于单片机的九路温度监控系统[J ].青岛:微计算机信息.2008. [15] 刘华东, 张亚华. 单片机原理与应用(第二版)[M].北京:电子工业出版社.2006:1-5. 致 谢 毕业设计完成了,在这个过程中我学到了很多东西。首先我要感谢我的导师窦伟山老师,他在我们完成论文的过程中,给予了我们很大的帮助。从毕业设计选题到设计完成,窦老师都给予了我耐心的指导与细心关怀。 此外,此系统的设计能够顺利完成,也得益于我们小组成员的不懈努力。有些我不了解的知识,在我们的精心讨论下,都得已解决。以至于我们能更好的完成毕业设计。 最后要感谢的是我的家人,他们培养了我,在遇到困难时,要勇敢的向前,不被困难所打到。让我在漫长的人生旅途中,无论遇到什么事情都能坚持不懈的努力,认真做好每一件事情。在未来的日子里,我会更加努力工作和做一名优秀的人,不辜负家人对我的期望,我一定会好好的孝敬和报答他们! 附录A *----------------------------------------------- 名称:基本单片机AT89C52的大棚温度自控系统 ------------------------------------------------*/ #include #include"stdio.h" #include #define uchar unsigned char #define uint unsigned int; /******************************************************************/ /* 定义端口 */ /******************************************************************/ sbit DQ=P1^3;//ds18b20 端口 sbit Fan=P1^5; //风扇端口 sbit Tru=P1^7;//喇叭的端口 sfr dataled=0x80;//显示数据端口 /******************************************************************/ /* 全局变量 */ /******************************************************************/ uint temp,i,TempH; uchar flag_get,count,num,minute,second,x; long str[6]; /******************************************************************/ /* 函数声明 */ /******************************************************************/ void delay1(uchar MS); unsigned int ReadTemperature(void); void Init_DS18B20(void); unsigned char ReadOneChar(void); void WriteOneChar(unsigned char dat); void delay(unsigned int i); /******************************************************************/ /* 延时函数声明 */ /******************************************************************/ void mDelay(unsigned char j) { unsigned int i; for(;j>0;j--) { for(i=0;i<125;i++) {;}="">125;i++)> } /******************************************************************/ /* 主函数 */ /******************************************************************/ main() { unsigned char TempH,TempL; TMOD|=0x01;//定时器设置 TH0=0xef; TL0=0xf0; IE=0x82; TR0=1; P2=0x00; count=0; InitLcd(); mDelay(20); while(1) { Fan=1; mDelay(10); Tru=1; mDelay(10); if((TempH>20)&&(TempH<=25)) {="" fan="0;" mdelay(10);="">=25))> if((TempH>25)&&(TempH<> { Fan=0; mDelay(30); } if((TempH>30)&&(TempH<=35)) {="" fan="0;" mdelay(70);="">=35))> if(TempH>35) //产生报警信号 { Tru=0; mDelay(10); Fan=0; mDelay(150); } for(i=1;i<> Tem[i]=str[i]; disp(); str[0]=TempH/100; //十位温度 str[1]=(TempH%100)/10; //十位温度 str[2]=(TempH%100)%10; //个位温度, 带小数点 str[3]=TempL; if(flag_get==1) //定时读取当前温度 { temp=ReadTemperature(); if(temp&0x8000) { str[0]=0x40;//负号标志 temp=~temp; // 取反加1 temp +=1; } else str[0]=0; TempH=temp>>4; TempL=temp&0x0F; TempL=TempL*6/10;//小数近似处理 flag_get=0; } } } /******************************************************************/ /* 定时器中断 */ /******************************************************************/ void tim(void) interrupt 1 using 1//中断,用于温度检测间隔 { TH0=0xef;//定时器重装值 TL0=0xf0; num++; if (num==50) {num=0; flag_get=1;//标志位有效 second++; if(second>=60) {second=0; } } } /******************************************************************/ /* 延时函数 */ /******************************************************************/ void delay(unsigned int i)//延时函数 { while(i--); } /******************************************************************/ /* 初始化 */ /******************************************************************/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ 拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(10); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(5); } /******************************************************************/ /* 读一个字节 */ /******************************************************************/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(5); } return(dat); } /******************************************************************/ /* 写一个字节 */ /******************************************************************/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } delay(5); } /******************************************************************/ /* 读取温度 */ /******************************************************************/ unsigned int ReadTemperature(void) { unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay(200); Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<=8; t="">=8;> return(t); } 附录B #include #include sbit RS = P2^4;//Pin4 sbit RW = P2^5; //Pin5 sbit E = P2^6;//Pin6 #define Data P0 //数据端口 unsigned char Tem[5]; unsigned char SecondLine[] unsigned char FirstLine[] unsigned char time[] /******************************************************************/ /* 函数声明 */ /******************************************************************/ void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us>>1;/* Crystal frequency in 12MHz*/ while(--uscnt); } /******************************************************************/ void DelayMs(unsigned char ms)//delay Ms { while(--ms) { DelayUs(250); DelayUs(250); } DelayUs(250); DelayUs(250); } void WriteCommand(unsigned char c) { DelayMs(5);//short delay before operation E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0; } /****************************************************************/ void WriteData(unsigned char c) { DelayMs(5); //short delay before operation E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0; } /*********************************************************************/ void ShowChar(unsigned char pos,unsigned char c) { unsigned char p; if (pos>=0x10) p=pos+0xb0; //是第二行则命令代码高4位为0xc else p=pos+0x80; //是第二行则命令代码高4位为0x8 WriteCommand (p);//write command WriteData (c); //write data } /*************************************************************************/ void ShowString (unsigned char line,char *ptr) { unsigned char l,i; l=line<> for (i=0;i<> ShowChar (l++,*(ptr+i));//循环显示16个字符 } /*********************************************************************/ void InitLcd() { DelayMs(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏 } /******************************************************************/ /* LCD1602显示 */ /******************************************************************/ void disp(void) 31 { FirstLine[0]='T'; FirstLine[1]='h';; FirstLine[2]='e'; FirstLine[3]=' '; FirstLine[4]='t'; FirstLine[5]='e'; FirstLine[6]='m'; FirstLine[7]='p'; FirstLine[8]='e'; FirstLine[9]='r'; FirstLine[10]='a';; FirstLine[11]='t'; FirstLine[12]='u'; FirstLine[13]='r'; FirstLine[14]='e'; FirstLine[15]=' '; SecondLine[0]='i'; SecondLine[1]='s'; SecondLine[2]=':'; SecondLine[3]='0'+Tem[1]; SecondLine[4]='0'+Tem[2]; SecondLine[5]='.'; SecondLine[6]='0'+Tem[3]; SecondLine[7]='C'; ShowString(0,FirstLine); ShowString(1,SecondLine); } 32范文二:温室大棚控制系统
范文三:温室大棚智能控制系统设计
范文四:温室大棚控制系统设计
范文五:温室大棚温度控制系统