目录 第1章 绪论... 6 1.1 本课题的背景及研究意义... 6 1.2 国内外现状... 6 1.3 总体设计思路... 7 第2章 总体设计... 7 2.1 方案选择... 7 2.1.1控制芯片的选择... 7 2.1.2温湿度传感器模块的选择... 7 第3章 系统硬件电路设计... 8 3.1 整体方案设计... 8 3.1.1系统概述... 8 3.1.2系统框图... 8 3.2 单片机最小系统电路... 8 3.2.1单片机介绍... 8 3.2.2单片机最小系统... 11 3.3 DHT11数字传感器... 12 3.3.1 DHT11数字温湿度传感器... 12 3.3.2 DHT11引脚... 12 3.3.3 DHT11电路... 13 3.4 液晶显示电路... 13 3.4.1 1602液晶简介... 13 3.4.2液晶引脚说明... 14 3.4.3指令介绍... 15 3.4.4液晶显示模块电路... 18 3.6 STC89C52的系统时钟设计... 19 第4章 软件设计... 20 4.1 程序语言及开发环境... 20 4.2 程序流程图... 20 4.2.1总体流程图... 20 4.2.2 1602液晶程序设计... 21 5.2.4温度传感器程序设计... 22 第5章 总结分析... 24 参考文献... 26 附 录 27 附录1 原理图... 27 附录2 源程序... 27 附录3 实物图(正、反面)... 32 附录4 元件清单... 33 附录5 小组分工与合作... 33
第1章 绪论1.1 本课题的背景及研究意义20世纪末,电子技术获得了飞速的发展,在其推动下,现在电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是一旦重要事情,一时的耽误可能酿成大祸。 目前单片机正朝着高性能和多品种方向发展,趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。单片机应用的重要意义在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现大部分功能,现在已经能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。 温度、湿度和人类的生产、生活有着密切的关系,同时也是工业生产中最常见的基本参数,例如机械、电子、石油、化工等各类工业中广泛要求对温度、湿度进行检测与控制。随着人们生活水平的提高,人们对自己的生存环境越来越关注,而空气中温湿度的变化对人体的舒适度和情绪有着直接的影响,所以对温湿度的检测及控制就十分有必要了。 1.2 国内外现状温度、湿度是工业农业生产不可求二少的考虑因素,但传统的方法是用温度表、毛发温度表、双金属式测量机以及温度试纸等测试器材,通过人工检测,对不符合温度和湿度要求的库房进行通风、降温和去湿等工作。这种人工测试方法费时费力、效率低、且测试的温度及湿度误差大,又具有较大的不确定性。而含有微型计算机或者微处理器的测量仪器,由于它拥有对数据储存,运算逻辑判断及自动化功能,有着只能功能,很快得到人们的青睐和关注。 模拟集成温度传感器是在20世纪80年代问世的,他是将温度传感器集成一个芯片上,可完成温度测量及模拟信号输出功能的专用IC。模拟集成温度传感器的主要特点是测量温度误差小、价格低、响应速度快、传输距离远、体积小、微功耗等,适合远距离测温、控温,不需要进行非线性校准,外围电路简单。他是目前在国内外应用最为普遍的一种集成传感器。 1.3 总体设计思路选取单片机作为系统的主控部件,根据主控机的指令对温度进行实时采集并通过液晶显示部分及时将测量结果显示出来。因策,如何准确获得被测信号以及对被控对象状态的监察是单片机的核心人物。传感器是实现测量与控制的首要换届,对于温湿度计,系统应具有两大传感模块:即温度传感器模块和湿度传感器模块。 此外,在微型计算机控制系统中,应该设计液晶显示模块,将温度和湿度的数据显示出来,为了安全生产,对于一些重要的参数或系统部位,应当设有紧急状态报警模块,但由于本设计是一个家用的温湿度计,因此设计得较为简洁。 第2章 总体设计2.1 方案选择2.1.1控制芯片的选择 方案一:采用STC89C52单片机,支持串口编程,计算速度快,用户程序空间(flash)8K,内部带有带电可擦写可编程读写存储器(EEPROM)。 方案二:采用AT89C51单片机,只能通过专用硬件编程器编程,用户程序空间小,性价比低,计算速度较STC89C52单片机慢。 STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。因此本设计用STC89C52单片机作为控制器。 2.1.2温湿度传感器模块的选择 方案一:采用DTH11 方案二:采用SHT11 方案比较:DHT11核心部件采用湿敏电阻,其成本低,稳定性差,SHT11核心部件采用湿敏电容,成本高,稳定性好。通过成本比较,选择方案一DTH11。
第3章 系统硬件电路设计3.1 整体方案设计3.1.1系统概述整个系统以STC89C52单片机为核心器件,配合电阻电容晶振等器件,构成单片机的最小系统。其它个模块围绕着单片机最小系统展开。温湿度采集模块,检测当前环境的温度值,并对并把温湿度数据传输给单片机;显示模块,采用1602液晶作为显示模块,负责显示测量到的湿度值和温度值;最后一个是电源模块,采用5V的USB供电,本系统如需移动测量时,可采用移动电源进行供电。 3.1.2系统框图file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png 3.2 单片机最小系统电路3.2.1单片机介绍(1)概述 STC89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和512bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的STC89C52单片机可为您提供许多较复杂系统控制应用场合。 STC89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线。STC89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。 (2)主要功能特性 ◆兼容MCS51指令系统;◆8k可反复擦写(>1000次)Flash ROM; ◆32个双向I/O口; ◆512字节RAM ;◆3个16位可编程定时/计数器中断;◆时钟频率0-24MHz; ◆内置4KB EEPROM;◆全双工串行口◆4个外部中断源; ◆共8个中断源;◆2个读写中断口线; ◆3级加密位; ◆低功耗空闲和掉电模式; ◆软件设置睡眠和唤醒功能; (3)8051单片机的引脚功能 MCS-51系列单片机一般采用40个引脚,双列直插式封装,用HMOS工艺制造,其外部引脚排列如图4-1所示。其中,各引脚的功能为: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.jpg 图4-1 STC89C52引脚图 ① 主电源引脚 VCC(40脚),接+5V电源正端; GND(20脚),接+5V电源地端; ② 外接晶体或外部振荡器引脚 XTAL1(19脚),接外部晶振的一个引脚。在单片机内部,它是一个反相放大器 的输入端。当采用外部振荡器时,此引脚应接 地。 XTAL2(18脚),接外部晶振的另一个引脚。在片内接至反相放大器的输出端和 内部时钟电路的输入端。当采用外部振荡器时,此脚接外部振荡器的输出端。 ③ 控制信号线 RESET(9脚),复位信号输入端,复位/掉电时内部RAM的备用电源输入端。 ALE(30脚),地址锁存允许/编程脉冲输入,用ALE锁存从P0口输出的低8 位地址。在对片内EPROM编程时,编程脉冲由此输入。 PSEN(29脚),外部程序存储器读选通信号,低电平有效。 EA(31脚),访问外部存储器允许/编程电压输入。EA为高电平时,访问内部存 储器;低电平时,访问外部存储器。 ④ 多功能I/O口引脚 8051单片机设有4个双向I/O口(P0、P1、P2、P3),每一组I/O口线都可以独立地用作输入或输出口,其中: P0口(32~39脚)——双向口(三态),可作为输入/输出口,可驱动8个LSTTL门电路。实际应用中常作为分时使用的地址/数据总线口,对外部程序或数据存储器寻址时低8位地址与数据总线分时使用P0口:先送低8位地址信号到P0口,由地址锁存信号ALE的下降沿将地址信号锁存到地址锁存器后,再作为数据总线的口线对数据进行输入或输出。 P1口(1~8脚)——准双向口(三态),可驱动4个LSTTL门电路。用作 输入线时,口锁存器必须由单片机先写入“1”,每一位都可编程为输入或输出 线。 P2口(21~28)——准双向口(三态),可驱动4个LSTTL门电路。可作 为输入/输出口,实际应用中一般作为地址总线的高8位,与P0口一起组成16 位地址总线,用于对外部存储器的接口电路进行寻址。 P3口(10~17脚)——准双向口(三态),可驱动4个LSTTL门电路。双 功能口,作为第一功能使用时,与P1口一样;作为第二功能使用时,每一 位都有特定用途,其特殊用途如表4.1所示: 表4.1 P3口第二用途 端口引脚 | 第二功能 | 注 释 | P3.0 | RXD | 串行口数据接收端 | P3.1 | TXD | 串行口数据发送端 | P3.2 | /INT0 | 外中断请求0 | P3.3 | /INT1 | 外中断请求1 | P3.4 | T0 | 定时/计数器0外部计数信号输入 | P3.5 | T1 | 定时/计数器1外部计数信号输入 | P3.6 | /WR | 外部RAM写选通信号输出 | P3.7 | /RD | 外部RAM读选通信号输出 |
3.2.2单片机最小系统STC89C52的最小系统由三个部分组成,晶振电路部分、复位电路部分、电源电路等三个部分组成。 晶振电路包括2个30pF的电容C2和C3,以及12M的晶振X1。电容的作用在这里是起振作用,帮助晶振更容易的起振,取值范围是15-33pF。晶振的取值也可以是24M,晶振的取值越高,单片机的执行速度越快。在进行电路设计的时候,晶振部分越靠近单片机越好。 单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。 复位电路由10uF的极性电容C1和10K的电阻R4构成。利用电容电压不能突变的性质,可以知道,当系统一上电,RESET脚将会出现高电平,并且这个高电平持续的时间由电路的RC值来决定。典型的51单片机当RESET脚的高电平持续两个机器周期以上就将复位,所以适当组合RC的取值就可以保证可靠的复位。 最后一个是电源部分,采用5V的USB直接供电,可采用手机充电器、电脑USB口、移动电源等设备进行供电。 此外,除了单片机最小系统的3个部分之外,这里还多了一些外部电路。 由于STC89C51的P0口是漏极开路输出,因此在P0口接了一个10K的排阻R1,使得P0口可以作为普通的I/O口使用,本设计用P0口来做液晶的数据口。 特别注意的是,对于31脚(EA),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行。由于我们的程序存储在了单片机内部,所以EA要接高电平,保证单片机是从内部读取程序去执行的。 3.3DHT11数字传感器 3.3.1DHT11数字温湿度传感器 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。 3.3.2 DHT11引脚DHT11有四个引脚,3号引脚一般悬空,如图2-3所示。DHT11的供电电压为3—5.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png 3.3.3DHT11电路DHT11一共引出四个引脚,其中一个接VCC,一个接GND,剩下两个分别接到单片机的IO口。在本设计中,把DHT11的2引脚接到单片机的P21口。电路图如图所示: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image007.jpg 3.4 液晶显示电路3.4.1 1602液晶简介液晶显示器是一种显示器件,具有小体积、轻重量、低功耗等特色。由于其功耗低、显示的信息量大(例如,文本,图形,曲线等)、无电磁辐射、使用寿命长,它已被广泛应用在便携式电子产品。 本系统显示采用了工业字符型液晶模块1602,可显示2行16个字符,能方便显示英文字母大小写、阿拉伯数字、常用符号等。通过自定义还可显示简单的汉字。在通信系统,智能操作仪表和办公设备的自动化中被广泛的应用,主要功能是显示ASCII字符,因此被称为“字符型显示装置”。1602液晶分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图(图4-10)所示: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg 图4-10 液晶尺寸说明 1602LCD主要技术参数: ◆显示容量:16×2个字符 ◆芯片工作电压:4.5—5.5V ◆工作电流:2.0mA(5.0V) ◆模块最佳工作电压:5.0V ◆字符尺寸:2.95×4.35(W×H)mm 3.4.2液晶引脚说明1602的引脚如表4-3所示: 编号 | 符号 | 引脚说明 | 编号 | 符号 | 引脚说明 | 1 | VSS | 电源地 | 9 | D2 | 数据 | 2 | VCC | 电源正极 | 10 | D3 | 数据 | 3 | VO | 液晶显示偏压 | 11 | D4 | 数据 | 4 | RS | 数据/命令选择 | 12 | D5 | 数据 | 5 | R/W | 读/写选择 | 13 | D6 | 数据 | 6 | EN | 使能信号 | 14 | D7 | 数据 | 7 | D0 | 数据 | 15 | BLA | 背光源正极 | 8 | D1 | 数据 | 16 | BLK | 背光源负极 |
表4-3 1602液晶引脚说明 第一脚:接地电源VSS。 第二脚:5V正电源为VCC。 第三脚:VO为液晶显示器对比度调整的端口,对比度的强弱由接电源的不同决定,对比度的调整可以通过一个10k的电位器。 第四脚:RS是寄存器选择,高电平表示数据寄存器,低电平表示指令寄存器。 第五脚:R / W的读和写信号线,高电平为读操作,低电平为写操作。其中RS与R/W的关系决定了当时状态。例如两端共同为0时能够写入命令或者显示其地址,当两端同为1时可以读忙碌信号,当RS为1,R/W为0时能够将数据录入。 第六脚:使能端EN,当EN端由1至0时,液晶模块中的命令开始被运行。 第七至十四脚:D0-D7为8位双向数据线。 第十五脚:背光源正极。 第十六脚:背光源负极。 3.4.3指令介绍(1)清屏指令 指令如表4-4所示 表4-4 清屏指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.jpg 功能: 1)能够将液晶显示内容删除,就是讲DDRAM所有内容都添加进“空白”的 ASCI码20II; 2)能够使光标回到原始位置,就是把光标重新摆放回液晶显示屏的左上方; 3)把地址显示器即AC的数值归位零 (2)光标归位指令 指令如表4-5所示 表4-5 光标归位指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg 功能: 1)将光标重新摆放回显示器的左上方; 2)地址计数器即AC的数值被设为零; 3)DDRAM所有的内容将保持原内容不会变化; (3)进入模式设置指令 指令如表4-6所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg表4-6 进入模式设置指令功能表 功能: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg当输入一位数据之后光标移动的方向将被设置,参数设定的情况如下: (4)显示开关设置指令 指令如表4-7所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg表4-7 显示开关设置指令功能表 功能: 能够控制显示器的开关与否,光标的显示或者关闭,光标是否需要闪烁,参数 设定的情况如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image019.jpg (5)设定显示屏或光标移动方向指令 指令如表4-8所示 表4-8 设定显示屏或光标移动方向指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg 功能: 将光标移动或者整个显示屏幕移动位置,参数设定的情况如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image021.jpg (6)功能设定指令 指令如表4-9所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image023.jpg表4-9 功能设定指令功能表 功能: 数据总线的位数何所显示出来的行数字型将被设定,参数设定情况如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg (7)设定CGRAM地址指令 指令如表4-10所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg表4-10 设定CGRAM地址指令功能表 功能: 下一次被存入数据的CGRAM地址将被设置,字符号为DB5DB4DB3即未来显 示此字符的时候被采用的字符的地址(000-111)可同时定义八个字符,行号为 DB2DB1DB0 (000-111)八行。 (8)设定DDRAM地址指令 指令如表4-11所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg表4-11 设定DDRAM地址指令功能表 功能: 下一次要存入数据的DDRAM地址将被设置。 (9)读取忙或AC地址指令 指令如表4-12所示 表4-12 读取忙或AC地址指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg 功能: 下一次要存入数据的DDRAM地址将被设置。 1)HF(忙碌信号)读取,假如液晶显示器忙碌的时候则BF=1,暂时不能接收被单片机送出的数据和指令,当BF=0的时候则相反。 2)地址计数器(AC)内容被接收。 (10)数据写入DDRAM或者CGRAM指令 指令如表4-13所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg表4-13 数据写入DDRAM或者CGRAM指令指令功能表 功能: 1)DREAM被写入字符码,液晶显示屏随即显示出相应的字符; 2)OGRAM被存入由使用者设计的图案 3.4.4液晶显示模块电路本液晶模块的电路的连接图如图4-11所示。第1脚和第2脚分别接到了电路的GND和VCC,这2个脚是液晶工作的电源输入脚。第3脚通过一个10K的电位器连接到地端,可通过调节该电位器来调节液晶的对比度。第4脚是液晶的寄存器控制脚,接到了单片机的P27脚上。第5脚是液晶的读写控制脚,直接接地。第6脚是液晶的使能脚,接到了单片机的P26脚上。第7脚到第14脚是液晶的数据/地址8位总线,接到了单片机的P0口上。最后第15脚和第16脚是液晶的背光电源脚,直接连接系统VCC和GND。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg 图 4-11液晶模块连接图 3.6 STC89C52的系统时钟设计时钟电路是用来产生89C51单片机工作时所必须的时钟信号,89C51本身就是一个复杂的同步时序电路,为保证工作方式的实现,89C51在唯一的时钟信号的控制下严格的按时序执行指令进行工作,时钟的频率影响单片机的速度和稳定性。通常时钟由于两种形式:内部时钟和外部时钟。 我们系统采用内部时钟方式来为系统提供时钟信号。89C51内部有一个用于构成振荡器的高增益反向放大器,该放大器的输入输出引脚为XTAL1和XTAL2,它们跨接在晶体振荡器和用于微调的电容,便构成了一个自激励振荡器。 电路中的C1、C2的选择在30PF左右,但电容太小会影响振荡的频率、稳定性和快速性。晶振频率为在1.2MHZ~12MHZ之间,频率越高单片机的速度就越快,但对存储器速度要求就高。为了提高稳定性我们采用温度稳定性好的NPO电容,采用的晶振频率为12MHZ。时钟电路如图所示: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg 时钟复位电路 第4章 软件设计4.1 程序语言及开发环境 C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔实验室的Dennis M. Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件、三维、二维图形和动画,具体应用例如单片机以及嵌入式系统开发。 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。 4.2 程序流程图4.2.1总体流程图程序开始后,先对液晶模块显示进行初始化,通过延时一秒等待DHT11温湿度传感器启动。DHT11温湿度传感器启动后,对其进行数据初始化后,进行温湿度信息的采集、转化、处理,最后通过液晶显示器读出。DHT11温湿度传感器经过一次数据采集和处理后需返回次延时程序处理来重新初始化后采集温湿度数据。具体流程图如图所示:
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image038.png |
4.2.2 1602液晶程序设计液晶开始显示之前,必须先确定一个位置,表示要在哪个地方显示,比如第1行第5列的位置。在完成坐标定位之后就可以开始显示内容了。液晶在显示的时候,是一位一位完成的。比如数字“123”,就会先显示百位的“1”,然后是十位的“2”,最后是个位的“3”。显示字符串的话,也是一样的道理,比如显示“hello”,也是从最开始的字母“h”开始显示,一位一位的完成,直到显示完字母“o”,才完成一次显示任务。要说明的是,每次显示一串字符或一个数字的时候,只需在最开始的时候完成一次定位,之后每显示完一个字符,液晶会自动跳到下一个位置的,无需每个字符都定位一次。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image039.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image040.png 开始
|
|
|
|
|
|
| |
|
| |
|
|
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image041.png |
file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image042.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image043.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image044.png file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image045.png
file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image046.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image047.png file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image048.png
图5-2液晶显示流程图 液晶显示子函数:
voidwrite_shu(uchar x,uchar y,uchar num)//数据显示函数 { uchar s,g; if(y==0) lcd_write_com(0x80+x); else lcd_write_com(0xc0+x); s=num/10;// 数据分离显示 lcd_write_data(0x30+s); g=num%10;//数据分离显示 lcd_write_data(0x30+g); } ucharwrite_byte1() //读一个字节 { uchari,comdata,temp1; for(i=0;i<8;i++) { FLAG=2; while((!dat)&&FLAG++);//判断数据位是0还是1 Delay_10us(); Delay_10us(); Delay_10us(); temp1=0; if(dat)temp1=1; // 如果高电平高过预定0高电平值则数据位为 1 FLAG=2; while((dat)&&FLAG++);//flag先与后加1 如果dat一直为1 uchar型变量 flag 溢出变为0 再自加1 if(FLAG==1)break; //超时则跳出for循环 comdata<<=1;//左移一位 高位在前 低位在后 comdata|=temp1; } return (comdata); }
5.2.4温度传感器程序设计读取温度值的流程图如图5-4所示,首先是初始化传感器,相当于是一次复位的过程,由于本设计只接了一个传感器,因此无需区别传感器的序列号,直接发一个指令0xcc跳过ROM寻找,接着发一个0x44的指令给传感器,让传感器启动温度转换。然后再次复位传感器,接着还是一样的跳过ROM指令0xcc,再往下就是发0xbe给传感器准备读取传感器的检测结果,最后就是读取传感器返回的检测结果。
|
|
|
|
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image049.png |
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image050.png |
图5-4 温度传感器程序流程图 温度传感器子程序:
void DHT11_5() //读5个字节数据 两个字节为温度数据 两个字节为湿度数据 最后一个字节为校验 { uchar i,temp; //主机拉低18ms dat=0; Delay_t(180); dat=1; //总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //主机设为输入 判断从机响应信号 dat=1; //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!dat) //T ! { FLAG=2; //超时标志位 while((!dat)&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束 FLAG=2; while( (dat)&&FLAG++);//判断从机拉高80us是否结束 for(i=0;i<5;i++)//数据接收状态 { DHT11=write_byte1(); } dat=1; //释放数据总线 为下一次读取做好准备 temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]); if(temp==DHT11[4]) //数据校验 { RTflag=1; } if(RTflag==1) //如果RTflag=1 说明读取到得数据正确 { RTflag=0; // tm[0]=DATARHT[0]/10; // tm[1]=DATARHT[0]%10; // tm[2]=DATARHT[1]/10; //湿度 // tm[3]=DATARHT[2]/10; // tm[4]=DATARHT[2]%10; // tm[5]=DATARHT[3]/10; //温度 //write_str(0,0,"measurement");//第一行显示湿度 write_str(3,0,"shidu:");//第一行显示湿度 write_shu(9,0,DHT11[0]); write_str(11,0,"%"); //write_str(0,1,"Temperature");//第二行为显示温度 write_str(3,1,"wendu:");//第二行为显示温度 write_shu(9,1,DHT11[2]); write_str(11,1,"^C"); } } } void lcdinit() { uchar i; lcd_write_com(0x80+2); for(i=0;i<11;i++) { lcd_write_data(table1); delay(50); } lcd_write_com(0x80+0x40+1); for(i=0;i<13;i++) { lcd_write_data(table2); delay(50); } } void main() { lcd_init(); //1602初始化 //delay(1000); //等待DHT11温湿度传感器数据稳定 开始激活DHT11 lcdinit(); delay(5000); lcd_write_com(0x01); while(1)//循环读取 并更新数据显示 {
目录 第1章 绪论... 6 1.1 本课题的背景及研究意义... 6 1.2 国内外现状... 6 1.3 总体设计思路... 7 第2章 总体设计... 7 2.1 方案选择... 7 2.1.1控制芯片的选择... 7 2.1.2温湿度传感器模块的选择... 7 第3章 系统硬件电路设计... 8 3.1 整体方案设计... 8 3.1.1系统概述... 8 3.1.2系统框图... 8 3.2 单片机最小系统电路... 8 3.2.1单片机介绍... 8 3.2.2单片机最小系统... 11 3.3 DHT11数字传感器... 12 3.3.1 DHT11数字温湿度传感器... 12 3.3.2 DHT11引脚... 12 3.3.3 DHT11电路... 13 3.4 液晶显示电路... 13 3.4.1 1602液晶简介... 13 3.4.2液晶引脚说明... 14 3.4.3指令介绍... 15 3.4.4液晶显示模块电路... 18 3.6 STC89C52的系统时钟设计... 19 第4章 软件设计... 20 4.1 程序语言及开发环境... 20 4.2 程序流程图... 20 4.2.1总体流程图... 20 4.2.2 1602液晶程序设计... 21 5.2.4温度传感器程序设计... 22 第5章 总结分析... 24 参考文献... 26 附 录 27 附录1 原理图... 27 附录2 源程序... 27 附录3 实物图(正、反面)... 32 附录4 元件清单... 33 附录5 小组分工与合作... 33
第1章 绪论1.1 本课题的背景及研究意义20世纪末,电子技术获得了飞速的发展,在其推动下,现在电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是一旦重要事情,一时的耽误可能酿成大祸。 目前单片机正朝着高性能和多品种方向发展,趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。单片机应用的重要意义在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现大部分功能,现在已经能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。 温度、湿度和人类的生产、生活有着密切的关系,同时也是工业生产中最常见的基本参数,例如机械、电子、石油、化工等各类工业中广泛要求对温度、湿度进行检测与控制。随着人们生活水平的提高,人们对自己的生存环境越来越关注,而空气中温湿度的变化对人体的舒适度和情绪有着直接的影响,所以对温湿度的检测及控制就十分有必要了。 1.2 国内外现状温度、湿度是工业农业生产不可求二少的考虑因素,但传统的方法是用温度表、毛发温度表、双金属式测量机以及温度试纸等测试器材,通过人工检测,对不符合温度和湿度要求的库房进行通风、降温和去湿等工作。这种人工测试方法费时费力、效率低、且测试的温度及湿度误差大,又具有较大的不确定性。而含有微型计算机或者微处理器的测量仪器,由于它拥有对数据储存,运算逻辑判断及自动化功能,有着只能功能,很快得到人们的青睐和关注。 模拟集成温度传感器是在20世纪80年代问世的,他是将温度传感器集成一个芯片上,可完成温度测量及模拟信号输出功能的专用IC。模拟集成温度传感器的主要特点是测量温度误差小、价格低、响应速度快、传输距离远、体积小、微功耗等,适合远距离测温、控温,不需要进行非线性校准,外围电路简单。他是目前在国内外应用最为普遍的一种集成传感器。 1.3 总体设计思路选取单片机作为系统的主控部件,根据主控机的指令对温度进行实时采集并通过液晶显示部分及时将测量结果显示出来。因策,如何准确获得被测信号以及对被控对象状态的监察是单片机的核心人物。传感器是实现测量与控制的首要换届,对于温湿度计,系统应具有两大传感模块:即温度传感器模块和湿度传感器模块。 此外,在微型计算机控制系统中,应该设计液晶显示模块,将温度和湿度的数据显示出来,为了安全生产,对于一些重要的参数或系统部位,应当设有紧急状态报警模块,但由于本设计是一个家用的温湿度计,因此设计得较为简洁。 第2章 总体设计2.1 方案选择2.1.1控制芯片的选择
方案一:采用STC89C52单片机,支持串口编程,计算速度快,用户程序空间(flash)8K,内部带有带电可擦写可编程读写存储器(EEPROM)。 方案二:采用AT89C51单片机,只能通过专用硬件编程器编程,用户程序空间小,性价比低,计算速度较STC89C52单片机慢。 STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。因此本设计用STC89C52单片机作为控制器。 2.1.2温湿度传感器模块的选择
方案一:采用DTH11 方案二:采用SHT11 方案比较:DHT11核心部件采用湿敏电阻,其成本低,稳定性差,SHT11核心部件采用湿敏电容,成本高,稳定性好。通过成本比较,选择方案一DTH11。
第3章 系统硬件电路设计3.1 整体方案设计3.1.1系统概述整个系统以STC89C52单片机为核心器件,配合电阻电容晶振等器件,构成单片机的最小系统。其它个模块围绕着单片机最小系统展开。温湿度采集模块,检测当前环境的温度值,并对并把温湿度数据传输给单片机;显示模块,采用1602液晶作为显示模块,负责显示测量到的湿度值和温度值;最后一个是电源模块,采用5V的USB供电,本系统如需移动测量时,可采用移动电源进行供电。 3.1.2系统框图file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
3.2 单片机最小系统电路3.2.1单片机介绍(1)概述 STC89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和512bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的STC89C52单片机可为您提供许多较复杂系统控制应用场合。 STC89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线。STC89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。 (2)主要功能特性 ◆兼容MCS51指令系统;◆8k可反复擦写(>1000次)Flash ROM; ◆32个双向I/O口; ◆512字节RAM ;◆3个16位可编程定时/计数器中断;◆时钟频率0-24MHz; ◆内置4KB EEPROM;◆全双工串行口◆4个外部中断源; ◆共8个中断源;◆2个读写中断口线; ◆3级加密位; ◆低功耗空闲和掉电模式; ◆软件设置睡眠和唤醒功能;
(3)8051单片机的引脚功能 MCS-51系列单片机一般采用40个引脚,双列直插式封装,用HMOS工艺制造,其外部引脚排列如图4-1所示。其中,各引脚的功能为: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.jpg 图4-1 STC89C52引脚图 ① 主电源引脚 VCC(40脚),接+5V电源正端; GND(20脚),接+5V电源地端; ② 外接晶体或外部振荡器引脚 XTAL1(19脚),接外部晶振的一个引脚。在单片机内部,它是一个反相放大器 的输入端。当采用外部振荡器时,此引脚应接 地。 XTAL2(18脚),接外部晶振的另一个引脚。在片内接至反相放大器的输出端和 内部时钟电路的输入端。当采用外部振荡器时,此脚接外部振荡器的输出端。 ③ 控制信号线 RESET(9脚),复位信号输入端,复位/掉电时内部RAM的备用电源输入端。 ALE(30脚),地址锁存允许/编程脉冲输入,用ALE锁存从P0口输出的低8 位地址。在对片内EPROM编程时,编程脉冲由此输入。 PSEN(29脚),外部程序存储器读选通信号,低电平有效。 EA(31脚),访问外部存储器允许/编程电压输入。EA为高电平时,访问内部存 储器;低电平时,访问外部存储器。 ④ 多功能I/O口引脚 8051单片机设有4个双向I/O口(P0、P1、P2、P3),每一组I/O口线都可以独立地用作输入或输出口,其中: P0口(32~39脚)——双向口(三态),可作为输入/输出口,可驱动8个LSTTL门电路。实际应用中常作为分时使用的地址/数据总线口,对外部程序或数据存储器寻址时低8位地址与数据总线分时使用P0口:先送低8位地址信号到P0口,由地址锁存信号ALE的下降沿将地址信号锁存到地址锁存器后,再作为数据总线的口线对数据进行输入或输出。 P1口(1~8脚)——准双向口(三态),可驱动4个LSTTL门电路。用作 输入线时,口锁存器必须由单片机先写入“1”,每一位都可编程为输入或输出 线。 P2口(21~28)——准双向口(三态),可驱动4个LSTTL门电路。可作 为输入/输出口,实际应用中一般作为地址总线的高8位,与P0口一起组成16 位地址总线,用于对外部存储器的接口电路进行寻址。 P3口(10~17脚)——准双向口(三态),可驱动4个LSTTL门电路。双 功能口,作为第一功能使用时,与P1口一样;作为第二功能使用时,每一 位都有特定用途,其特殊用途如表4.1所示: 表4.1 P3口第二用途 端口引脚 | 第二功能 | 注 释 | P3.0 | RXD | 串行口数据接收端 | P3.1 | TXD | 串行口数据发送端 | P3.2 | /INT0 | 外中断请求0 | P3.3 | /INT1 | 外中断请求1 | P3.4 | T0 | 定时/计数器0外部计数信号输入 | P3.5 | T1 | 定时/计数器1外部计数信号输入 | P3.6 | /WR | 外部RAM写选通信号输出 | P3.7 | /RD | 外部RAM读选通信号输出 |
3.2.2单片机最小系统STC89C52的最小系统由三个部分组成,晶振电路部分、复位电路部分、电源电路等三个部分组成。 晶振电路包括2个30pF的电容C2和C3,以及12M的晶振X1。电容的作用在这里是起振作用,帮助晶振更容易的起振,取值范围是15-33pF。晶振的取值也可以是24M,晶振的取值越高,单片机的执行速度越快。在进行电路设计的时候,晶振部分越靠近单片机越好。 单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。 复位电路由10uF的极性电容C1和10K的电阻R4构成。利用电容电压不能突变的性质,可以知道,当系统一上电,RESET脚将会出现高电平,并且这个高电平持续的时间由电路的RC值来决定。典型的51单片机当RESET脚的高电平持续两个机器周期以上就将复位,所以适当组合RC的取值就可以保证可靠的复位。 最后一个是电源部分,采用5V的USB直接供电,可采用手机充电器、电脑USB口、移动电源等设备进行供电。 此外,除了单片机最小系统的3个部分之外,这里还多了一些外部电路。 由于STC89C51的P0口是漏极开路输出,因此在P0口接了一个10K的排阻R1,使得P0口可以作为普通的I/O口使用,本设计用P0口来做液晶的数据口。 特别注意的是,对于31脚(EA),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行。由于我们的程序存储在了单片机内部,所以EA要接高电平,保证单片机是从内部读取程序去执行的。
3.3DHT11数字传感器
3.3.1DHT11数字温湿度传感器
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。 3.3.2 DHT11引脚DHT11有四个引脚,3号引脚一般悬空,如图2-3所示。DHT11的供电电压为3—5.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png
3.3.3DHT11电路DHT11一共引出四个引脚,其中一个接VCC,一个接GND,剩下两个分别接到单片机的IO口。在本设计中,把DHT11的2引脚接到单片机的P21口。电路图如图所示: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image007.jpg
3.4 液晶显示电路3.4.1 1602液晶简介液晶显示器是一种显示器件,具有小体积、轻重量、低功耗等特色。由于其功耗低、显示的信息量大(例如,文本,图形,曲线等)、无电磁辐射、使用寿命长,它已被广泛应用在便携式电子产品。 本系统显示采用了工业字符型液晶模块1602,可显示2行16个字符,能方便显示英文字母大小写、阿拉伯数字、常用符号等。通过自定义还可显示简单的汉字。在通信系统,智能操作仪表和办公设备的自动化中被广泛的应用,主要功能是显示ASCII字符,因此被称为“字符型显示装置”。1602液晶分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图(图4-10)所示:
file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg
图4-10 液晶尺寸说明 1602LCD主要技术参数: ◆显示容量:16×2个字符 ◆芯片工作电压:4.5—5.5V ◆工作电流:2.0mA(5.0V) ◆模块最佳工作电压:5.0V ◆字符尺寸:2.95×4.35(W×H)mm 3.4.2液晶引脚说明1602的引脚如表4-3所示:
编号 | 符号 | 引脚说明 | 编号 | 符号 | 引脚说明 | 1 | VSS | 电源地 | 9 | D2 | 数据 | 2 | VCC | 电源正极 | 10 | D3 | 数据 | 3 | VO | 液晶显示偏压 | 11 | D4 | 数据 | 4 | RS | 数据/命令选择 | 12 | D5 | 数据 | 5 | R/W | 读/写选择 | 13 | D6 | 数据 | 6 | EN | 使能信号 | 14 | D7 | 数据 | 7 | D0 | 数据 | 15 | BLA | 背光源正极 | 8 | D1 | 数据 | 16 | BLK | 背光源负极 |
表4-3 1602液晶引脚说明
第一脚:接地电源VSS。 第二脚:5V正电源为VCC。 第三脚:VO为液晶显示器对比度调整的端口,对比度的强弱由接电源的不同决定,对比度的调整可以通过一个10k的电位器。 第四脚:RS是寄存器选择,高电平表示数据寄存器,低电平表示指令寄存器。 第五脚:R / W的读和写信号线,高电平为读操作,低电平为写操作。其中RS与R/W的关系决定了当时状态。例如两端共同为0时能够写入命令或者显示其地址,当两端同为1时可以读忙碌信号,当RS为1,R/W为0时能够将数据录入。 第六脚:使能端EN,当EN端由1至0时,液晶模块中的命令开始被运行。 第七至十四脚:D0-D7为8位双向数据线。 第十五脚:背光源正极。 第十六脚:背光源负极。 3.4.3指令介绍(1)清屏指令 指令如表4-4所示 表4-4 清屏指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.jpg
功能: 1)能够将液晶显示内容删除,就是讲DDRAM所有内容都添加进“空白”的 ASCI码20II; 2)能够使光标回到原始位置,就是把光标重新摆放回液晶显示屏的左上方; 3)把地址显示器即AC的数值归位零 (2)光标归位指令 指令如表4-5所示 表4-5 光标归位指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg
功能: 1)将光标重新摆放回显示器的左上方; 2)地址计数器即AC的数值被设为零; 3)DDRAM所有的内容将保持原内容不会变化; (3)进入模式设置指令 指令如表4-6所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg表4-6 进入模式设置指令功能表
功能: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg当输入一位数据之后光标移动的方向将被设置,参数设定的情况如下:
(4)显示开关设置指令 指令如表4-7所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg表4-7 显示开关设置指令功能表
功能: 能够控制显示器的开关与否,光标的显示或者关闭,光标是否需要闪烁,参数 设定的情况如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image019.jpg
(5)设定显示屏或光标移动方向指令 指令如表4-8所示 表4-8 设定显示屏或光标移动方向指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg
功能: 将光标移动或者整个显示屏幕移动位置,参数设定的情况如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image021.jpg
(6)功能设定指令 指令如表4-9所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image023.jpg表4-9 功能设定指令功能表
功能: 数据总线的位数何所显示出来的行数字型将被设定,参数设定情况如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg
(7)设定CGRAM地址指令 指令如表4-10所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg表4-10 设定CGRAM地址指令功能表
功能: 下一次被存入数据的CGRAM地址将被设置,字符号为DB5DB4DB3即未来显 示此字符的时候被采用的字符的地址(000-111)可同时定义八个字符,行号为 DB2DB1DB0 (000-111)八行。 (8)设定DDRAM地址指令 指令如表4-11所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg表4-11 设定DDRAM地址指令功能表
功能: 下一次要存入数据的DDRAM地址将被设置。 (9)读取忙或AC地址指令 指令如表4-12所示 表4-12 读取忙或AC地址指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg
功能: 下一次要存入数据的DDRAM地址将被设置。 1)HF(忙碌信号)读取,假如液晶显示器忙碌的时候则BF=1,暂时不能接收被单片机送出的数据和指令,当BF=0的时候则相反。 2)地址计数器(AC)内容被接收。 (10)数据写入DDRAM或者CGRAM指令 指令如表4-13所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg表4-13 数据写入DDRAM或者CGRAM指令指令功能表
功能: 1)DREAM被写入字符码,液晶显示屏随即显示出相应的字符; 2)OGRAM被存入由使用者设计的图案 3.4.4液晶显示模块电路本液晶模块的电路的连接图如图4-11所示。第1脚和第2脚分别接到了电路的GND和VCC,这2个脚是液晶工作的电源输入脚。第3脚通过一个10K的电位器连接到地端,可通过调节该电位器来调节液晶的对比度。第4脚是液晶的寄存器控制脚,接到了单片机的P27脚上。第5脚是液晶的读写控制脚,直接接地。第6脚是液晶的使能脚,接到了单片机的P26脚上。第7脚到第14脚是液晶的数据/地址8位总线,接到了单片机的P0口上。最后第15脚和第16脚是液晶的背光电源脚,直接连接系统VCC和GND。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg
图 4-11液晶模块连接图 3.6 STC89C52的系统时钟设计时钟电路是用来产生89C51单片机工作时所必须的时钟信号,89C51本身就是一个复杂的同步时序电路,为保证工作方式的实现,89C51在唯一的时钟信号的控制下严格的按时序执行指令进行工作,时钟的频率影响单片机的速度和稳定性。通常时钟由于两种形式:内部时钟和外部时钟。 我们系统采用内部时钟方式来为系统提供时钟信号。89C51内部有一个用于构成振荡器的高增益反向放大器,该放大器的输入输出引脚为XTAL1和XTAL2,它们跨接在晶体振荡器和用于微调的电容,便构成了一个自激励振荡器。 电路中的C1、C2的选择在30PF左右,但电容太小会影响振荡的频率、稳定性和快速性。晶振频率为在1.2MHZ~12MHZ之间,频率越高单片机的速度就越快,但对存储器速度要求就高。为了提高稳定性我们采用温度稳定性好的NPO电容,采用的晶振频率为12MHZ。时钟电路如图所示: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg 时钟复位电路
第4章 软件设计4.1 程序语言及开发环境 C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔实验室的Dennis M. Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件、三维、二维图形和动画,具体应用例如单片机以及嵌入式系统开发。 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。 4.2 程序流程图4.2.1总体流程图程序开始后,先对液晶模块显示进行初始化,通过延时一秒等待DHT11温湿度传感器启动。DHT11温湿度传感器启动后,对其进行数据初始化后,进行温湿度信息的采集、转化、处理,最后通过液晶显示器读出。DHT11温湿度传感器经过一次数据采集和处理后需返回次延时程序处理来重新初始化后采集温湿度数据。具体流程图如图所示:
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image038.png |
4.2.2 1602液晶程序设计液晶开始显示之前,必须先确定一个位置,表示要在哪个地方显示,比如第1行第5列的位置。在完成坐标定位之后就可以开始显示内容了。液晶在显示的时候,是一位一位完成的。比如数字“123”,就会先显示百位的“1”,然后是十位的“2”,最后是个位的“3”。显示字符串的话,也是一样的道理,比如显示“hello”,也是从最开始的字母“h”开始显示,一位一位的完成,直到显示完字母“o”,才完成一次显示任务。要说明的是,每次显示一串字符或一个数字的时候,只需在最开始的时候完成一次定位,之后每显示完一个字符,液晶会自动跳到下一个位置的,无需每个字符都定位一次。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image039.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image040.png 开始
|
|
|
|
|
|
| |
|
| |
|
|
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image041.png |
file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image042.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image043.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image044.png file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image045.png
file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image046.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image047.png file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image048.png
图5-2液晶显示流程图 液晶显示子函数:
voidwrite_shu(uchar x,uchar y,uchar num)//数据显示函数
{
uchar s,g;
if(y==0)
lcd_write_com(0x80+x);
else
lcd_write_com(0xc0+x);
s=num/10;// 数据分离显示
lcd_write_data(0x30+s);
g=num%10;//数据分离显示
lcd_write_data(0x30+g);
}
ucharwrite_byte1() //读一个字节
{
uchari,comdata,temp1;
for(i=0;i<8;i++)
{
FLAG=2;
while((!dat)&&FLAG++);//判断数据位是0还是1
Delay_10us();
Delay_10us();
Delay_10us();
temp1=0;
if(dat)temp1=1; // 如果高电平高过预定0高电平值则数据位为 1
FLAG=2;
while((dat)&&FLAG++);//flag先与后加1 如果dat一直为1 uchar型变量 flag 溢出变为0 再自加1
if(FLAG==1)break; //超时则跳出for循环
comdata<<=1;//左移一位 高位在前 低位在后
comdata|=temp1;
}
return (comdata);
}
5.2.4温度传感器程序设计读取温度值的流程图如图5-4所示,首先是初始化传感器,相当于是一次复位的过程,由于本设计只接了一个传感器,因此无需区别传感器的序列号,直接发一个指令0xcc跳过ROM寻找,接着发一个0x44的指令给传感器,让传感器启动温度转换。然后再次复位传感器,接着还是一样的跳过ROM指令0xcc,再往下就是发0xbe给传感器准备读取传感器的检测结果,最后就是读取传感器返回的检测结果。
|
|
|
|
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image049.png |
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image050.png |
图5-4 温度传感器程序流程图 温度传感器子程序:
void DHT11_5() //读5个字节数据 两个字节为温度数据 两个字节为湿度数据 最后一个字节为校验
{
uchar i,temp;
//主机拉低18ms
dat=0;
Delay_t(180);
dat=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
dat=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!dat) //T !
{
FLAG=2; //超时标志位
while((!dat)&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
FLAG=2;
while(
(dat)&&FLAG++);//判断从机拉高80us是否结束
for(i=0;i<5;i++)//数据接收状态
{
DHT11=write_byte1();
}
dat=1; //释放数据总线 为下一次读取做好准备
temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]);
if(temp==DHT11[4]) //数据校验
{
RTflag=1;
}
if(RTflag==1) //如果RTflag=1 说明读取到得数据正确
{
RTflag=0;
// tm[0]=DATARHT[0]/10;
// tm[1]=DATARHT[0]%10;
// tm[2]=DATARHT[1]/10; //湿度
// tm[3]=DATARHT[2]/10;
// tm[4]=DATARHT[2]%10;
// tm[5]=DATARHT[3]/10; //温度
//write_str(0,0,"measurement");//第一行显示湿度 write_str(3,0,"shidu:");//第一行显示湿度 write_shu(9,0,DHT11[0]);
write_str(11,0,"%");
//write_str(0,1,"Temperature");//第二行为显示温度 write_str(3,1,"wendu:");//第二行为显示温度 write_shu(9,1,DHT11[2]);
write_str(11,1,"^C"); }
}
} void lcdinit() { uchar i; lcd_write_com(0x80+2); for(i=0;i<11;i++) { lcd_write_data(table1); delay(50); } lcd_write_com(0x80+0x40+1); for(i=0;i<13;i++) { lcd_write_data(table2); delay(50); } } void main()
{
lcd_init(); //1602初始化
//delay(1000); //等待DHT11温湿度传感器数据稳定 开始激活DHT11 lcdinit(); delay(5000); lcd_write_com(0x01); while(1)//循环读取 并更新数据显示
{
delay(1000);//等待DHT11温湿度传感器数据稳定 开始激活DHT11
write_byte1();//读一个字节
DHT11_5(); //读数据
delay(1000); //延时等待
}
}
delay(1000);//等待DHT11温湿度传感器数据稳定 开始激活DHT11 write_byte1();//读一个字节 DHT11_5(); //读数据 delay(1000); //延时等待 } }
|