《基于单片机的温度采集及显示系统设计与实现》11000字(论文)_第1页
《基于单片机的温度采集及显示系统设计与实现》11000字(论文)_第2页
《基于单片机的温度采集及显示系统设计与实现》11000字(论文)_第3页
《基于单片机的温度采集及显示系统设计与实现》11000字(论文)_第4页
《基于单片机的温度采集及显示系统设计与实现》11000字(论文)_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于单片机的温度采集及显示系统设计与实现摘要在现代生活中温度、湿度和人们的生产、生活有着密切的关系。所以粮食的贮藏和保护也是必须要关心的。要想保护好粮食,温度与湿度则是先决条件。温湿度的采集和数据传输伴随着现代社会高新技术的迅猛发展也有着重大的突破,打破了以前的技术上的壁垒,提高了技术效率。本次设计是选择了以STC89C52系列的单片机做为整个系统的主要控制单元,以DHT11数字式温湿度传感器做为温度、湿度的采集单元。用NRF24L01做为无线传输模块来传输所采集的温湿度数值,最后通过单片机由LCD1602液晶显示模块将所得数据呈现出来,以此达到监控系统的设计。关键词:温湿度;传感器;无线传输;单片机目录TOC\o"1-3"\h\u167491概述 概述1.1课题研究的意义粮食是我们的必需品是人类赖以生存的根本保证。因此粮食的安全保障是非常重要的,而温度和湿度就是关键,粮食的科学贮藏是具有非常重要的战略意义和经济意义。大多数粮库是以人工测量温度和湿度的方法,这不仅使得存在施工劳动强度大、效率低的问题,如果是大型的粮库则测量的温度和湿度的作业量将是十分庞大的,人工的耗费量也是巨大的,若不及时完成将可能造成大量粮食的边和和浪费。随着生产技术的迅速发展,一个成本低而且有准确度高的测量仪器势必能够在行业中占得有利位置,而且基于无线传输方便携带的温湿度测量仪会取得广大人民的亲赖。新的无线通信技术不断地发现,现在生活里的人们可以享受高科技带来的优质服务。尤其是应用在民用及工业的数据采集上。随着社会的进步人们逐渐意识到了无线传输技术的重要性和带来的便利,也突破了无线传输布线困难的技术壁垒,也节省了大量的人力和物力,也使得移动设备的越做越小、占地小而且价格便宜。1.2研究的现状及发展趋势由于技术限制,传感器并不能同时实现测量温度和湿度这两个功能,思索不得不同时使用温度传感器和湿度传感器。温度传感器早在十九世纪就被发明出来了,最先运用在德国,它可以将温度这个摸不着的东西转变成为变成电信号,物理学家赛贝为热电偶传感器做出了杰出的贡献。随着新兴技术发展,半导体技术愈发成熟,二十世纪之后多种温度传感器相继被开发出了,例如半导体热电偶传感器和相关集成温度传感器。还有根据不同的物理规律,在各个领域研发出来的传感器,声学里的温度传感器,光学里的红外传感器等等。得益于传感器成熟且迅速的发展,电子温度计在人们生产生活中广泛应用。智能化的温度传感器在上个世纪九十年代中期面世。它的出现归功于微电子技术和模块化自动测温技术的。日前,具有高效优良性能的智能温度传感器已经在国际上发行。湿度传感器并没有像温度传感器那么早被发明,等到九十年代才有相关产品的出现,属于新起行业。湿度传感器的构造也并不难,就是在电容或者电阻上涂覆感湿材料,感湿材料形成的感湿膜就可以采集湿度。现代化的农业生产是需要科学技术的支撑,而粮库的温湿度环境保护跟是需要科学技术的大力支持,现代科技使得网络和通信技术极速向前,互联网早已在人们生活中不可或缺基于无线传输的手机更是深入人心。

所到之处随处人们拿着手机,使得人们的生活多姿多彩。1.3课题研究的内容1、利用DHT11温湿度传感器实时检测温湿度。并将采集来的数据处理后传送到单片机。2、通过无线通信把从单片机传输过来的温湿度数据从主机的nRF24L01传送到从机的nRF24L01接收。接收数据后将数据传送到从机单片机。3、在12864液晶显示屏上显示出温湿度,以及周围环境为安全还是要进行高温报警。4、超出程序设定的范围时蜂鸣器响进行报警。2系统硬件设计近年来由于无线传输技术、传感器技术的高速发展,使监控系统的广泛应用于各种领域。2.1系统总体设计本系统设计是以为STC89C52单片机为核心,通过DHT11温湿度传感器采集温湿度的值由NRF24L01模块传输并对其进行处理,最后显示在1602液晶显示上。程序写入温湿度的范围,如果DHT11检测得到的值超过了程序设定的范围,那么程序控制蜂鸣器响报警启动。单片机将温湿度数据通过两块NRF24L01模块实行收发功能。其中系统电源为正5V供电。2.1.1发送端原理框图发送端:发送端:由DHT11温湿度传感器收集到数据通过单片机和nrf24l01无线传输模块执行传输后由LCD1602显示出数值在发送到接收端。MCS-51MCS-51电源模块nRF2401无线模块LCD1602显示模块DHT11温湿度传感器图2-1发送端系统方框图2.1.2接收端原理框图接收端:接收端:通过nrf24l01接受数据再经过单片机和按键电路以及声光报警电路的监测最后显示在lcd1602显示模块上。MCS-51MCS-51LCD1602显示模块nRF2401无线模块按键电路声光报警电路图2-2接收端系统方框图2.2方案论证2.2.1主控芯片方案方案一:采用STC89C52单片机是低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程\t"/item/STC89C52/_blank"Flash存储器在单芯片上,拥有灵巧的8位\t"/item/STC89C52/_blank"CPU 和在系统可\t"/item/STC89C52/_blank"编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。方案二:采用MSP430F149系列单片机作为主控芯片。其焊接引脚是极其细小,很容易折断,制版成本高且没有现成的仪器,耽误制作时间。

方案三:采用STC12C5A60S2增强型51单片机作为主控芯片。该功能强大,但是难掌握,操作复杂。。

综合考虑对于单片机的掌握熟练和性价比选择方案一,即使采用STC89C52来控制整个系统。2.2.2无线传输模块方案

方案一:采用NRF24L01模块,其协议简单,容易操作,体积小内部电路简单,外部接线也比较简单,虽然体积小但是处理数据能力强,能够及时完成发送和接受,理论传输距离200米,实际应用中还不止。方案二:采用NRF905是由频率合成器、功率合成器、晶体振荡器和调制器组成。它有很少的外围元件,不需要外部声表面振荡器。但由于该系统应用于农牧业,应用环境非常庞大,不能满足设计的需要。依据设计的要求以及操作可行性,选择方案一,采用NRF24L01作为本系统的通信模块。2.2.3温湿度传感器模块方案方案一:采用HMP45D温湿度传感器,温度为铂电阻温度传感器,湿度为湿敏电容湿度传感器。湿敏电容器不应长期暴露在含有化学物质的气体中,否则会改变其性能。需要应定期拆下并清洁滤纸或更换新的滤纸。所以这是不合适的。方案二:采用DHT11温湿度传感器。能够与多款单片机连接。该产品具有很多优点,包括响应快、体积超小、功耗超低。在许多场合都受用,特别是条件苛刻的应用场合。考虑到成本以及操作性,选择DHT11检测周围环境的温湿度。2.2.4显示模块方案

方案一:采用LED数码显示管。优点是成本低,但点阵显示的精度不够,不能显示字符。方案二:LCD1602用于显示信息。是一种通用字符液晶显示模块,可以显示字符和数字,价格便宜,易于控制。结合实际考虑到成本、精度、美观等方面的因素,选择较为符合的方案二

3硬件电路设计3.1STC8952单片机的简介STC89C51RC系列单片机是基于Intel标准的8052,指令代码完全兼容传统的8051系列单片机,12时钟/机器周期和6时钟/机器周期可任意选择,最新的D版本内集成MAX810专用复位电路。使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。3.1.1STC8952引脚说明VCC(40引脚):电源电压

VSS(20引脚):接地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,写入信号。P3.7:RD,读取信号。RST(9引脚):复位输入。图3-1STC89C52的引脚图3.1.2STC8952特性参数主要特性:工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)

2、工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz

3、通用I/O口(32个),复位后为:P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻。4、片上集成512字节RAM

5、ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片。

6、共3个16位定时器/计数器。即定时器T0、T1、T2

7、外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒。

3.1.3单片机的最小系统单片机的最小系统就是指单片机能正常工作最简单的电路。包括:电源、单片机、时钟电路和复位电路。图3-2单片机的最小系统3.2DHT11传感器设计温湿度模块DH11温湿传感器伴随着科技的不断发展,而许多电器设备很多都离不开对温度、湿度等环境因素的要求。因此,温度、湿度传感器用途越来越广泛。新一代的数字传感器不再需要外置的AD转换模块。目前常用的微机与外设之间进行数据传输的串行总线主要有I2C总线、SPI总线和SCI总线。3.2.1DHT11温湿度传感器简介:DHT11数字温湿度传感器是一种具有校准数字信号输出的温湿度复合传感器。传感器采用特殊的数字模块采集技术和温湿度传感技术,确保产品具有高可靠性和优良的长期稳定性。DHT11传感器由电阻式湿度传感器和NTC温度传感器组成,并与高性能8位MCU相连。因此,该产品具有质量优良、响应速度超快、抗干扰能力强、性价比高等优点。每个DHT11传感器在非常精确的湿度校准室中进行校准。校准系数以程序的形式存储在OTP存储器中,在传感器内部的信号处理过程中调用。采用单线串行接口,使系统集成简单快捷,具有体积小、功耗极低的特点。信号传输距离可达20m以上。当连接线长度小于20m时,应采用5KΩ当上拉电阻大于20m时,应根据情况选用合适的上拉电阻,使其成为各种应用甚至最苛刻应用的最佳选择。产品为4针单排包装。连接方便,可根据用户需要提供特殊的包装形式。应用领域:暖通空调、检测仪器、汽车、数据记录仪、日用消费品、自动控制、气象站、家用电器、湿度调节器、医疗、除湿机。图2-5DHT11外形图3.2.2引脚说明RST(9引脚):复位输入。高电平。XTAL1(19引脚):振荡器反相放大器和内部时钟发生电路的输入端。3.2.3参数特性1、不仅能够检测相对湿度和而且能够对温度进行测量,这是因为其内部一体化结构方式,节省空间。2、可以直接进行数字信号的输出,避免用户对电信号的苦恼,解除信号预处理带来的负担。3、极大程度的为用户控制器节省I/O口资源,内部结构简单,而且不再需要多余的电器元件。4、稳定性好,超低功耗。5、体积面积小。6、各个型号的管脚都可以互换。降低错误率7、适用范围很广,在食品、药品、工控等各个行业均可以用到。3.3显示电路设计3.3.11602液晶1602液晶是用来显示字母、数字、符号等的点阵型液晶模块,它是由若干个5乘以7或者5乘以11点阵字符位组成,特点是:零辐射、低功耗、散热小、体积小、图像还原精确、字符显示锐利等。同时还具有背光和字符对比度调节功能。LCD1602液晶显示模块可以只用D4-D7作为四位数据分两次传送。这样的话,可以节省MCU的I/O口资源。lcd1602可以显示2行16个字符,有8为数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光软件。1602液晶显示模块的各种操作包括:读写、光标和屏幕操作都是通过指令编程来实现的。3.3.2技术参数1602LCD主要技术参数:显示容量:16×2个字符;工作电流:2.0mA(5.0V);模块最佳工作电压:5.0V;有80字节显示数据存储器DDRAM;字符尺寸:2.95×4.35(W×H)mm。+5V电压,2、引脚功能说明表3-1引脚说明表引脚符号说明引脚符号说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:RS为寄存器选择第15脚:背光源正极。第16脚:背光源负极。图3-3显示电路3.4报警电路设计报警电路结构是由三极管和蜂鸣器组成的。是为了更加完善系统的功能。图3-4蜂鸣器报警电路按键电路采用三个独立按键实现对环境温度、湿度参数阈值设定,按键S1为设置按键、S2为操作数值参数加上升功能,S3为数值参数操作下降功能,S2和S3的使用条件是,系统需要处于数值调整界面下。图3-8按键控制电路3.5无线收发模块本系统利用该模块对采集来的温湿度进行传输,分为两个部分,主机上的该模块发送信息,在从机上接受最后在显示屏上显示温湿度。3.5.1nRF24L01概述nRF24L01是拥有着自己的一套协议,主要是由20个引脚组成的数字射频芯片,有内部和外部之分。其内部有若干寄存器,外部留有spi接口,外部单片机通过spi接口配置此芯片内部的寄存器。内部寄存器大概分为控制寄存器和数据寄存器。我们可以利用用单片机把它配置为接收模式或发送模式,还可以配置频道、地址、每次发送的字节数、是否带CRC校验、功率等。配置成发送模式以后,用单片机把要发送的数据写进去,它就会自动把数据发出去;配置成接收模式以后,单片机通过观察它的IRQ引脚,就可以知道是否接收到了数据,IRQ为低电平,说明接收到了数据,单片机可以通过SPI口把接收到数据取出来。无论是发送信号还是接受信号的过程中工作电流都非常小。1GND2VCC3CE4CSN5SCK6MOSI7MISO8IRQ图3-5nRF24L01引脚模块3.5.2nRF24L01引脚介绍CE:使能发射或接收;

CSN,SCK,MOSI,MISO:SPI:微处理器可通过此引脚设置模块:

IRQ:中断标志位;

VDD:电源输入端;VSS:电源地;

XC2,XC1:晶体振荡器引脚;

ANT1,ANT2:天线接口;

图3-6nRF24L01引脚封装3.5.3nRF24L01工作模式表3-1nRF24L01各工作模式模式上电接收芯片使能寄存器状态接收模式111-发送模式101数据在TXFIFO寄存器中待机模式II101-0TXFIFO为空待机模式I1-1无数据传输掉电模式0-0-待机模式1:该模式用于降低芯片损耗,但是虽然为待机状态,但是晶体振器依然在工作;

待机模式下,无线模块的损耗最小这就是它功耗低的原因,当然此模块也不工作,但原先配置寄存器的值不会消失,依旧存有。4系统软件设计4.1软件开发平台及开发语言介绍4.1.1Keil开发平台在单片机的开发设计中除了硬件还有软件,Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。4.1.2C语言介绍C语言是国际上广泛流行的计算机高级语言。尽管C语言提供了许多低级处理的\t"/item/c%E8%AF%AD%E8%A8%80/_blank"功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似\t"/item/c%E8%AF%AD%E8%A8%80/_blank"嵌入式处理器以及超级计算机平台上进行编译,进行程序设计。C语言既保持了BCPL和B语言的优点,又克服了他们的缺点,开发C语言的目的在于尽可能降低用它缩写的软件对硬件品台的依赖程度,使之局域可移植性。C语言的优点有:C语言具备高级语言和低级语言的特征;含有多种数据类型;运算符丰富;有while、for等多种控制语句可以嵌套使用;C语言适用范围大4.2系统主程序设计本系统具体工作过程是由:发送端DHT11传感进行温湿度采集并测量,将测量得到的数据送入STC89C52单片机进行处理,然后通过无线模块nRF24L01将数据远传到接收端,同时控制液晶1602显示即时的温度数值,并与程序中设定的报警温湿度上、下限值进行比较。当检测到温湿度界于上下限温度范围之间时,蜂鸣器不响,液晶正常显示实时温湿度,如果低于设定的下限值,蜂鸣器发出报警,同时蓝色LED点亮。该系统主程序流程图如图4-1所示图4-1系统主程序流程图4.3无线传输模块设计在发射数据时,按照时序把要发送的数据和接收机的地址传送给无线模块,然后判断MCU是否将TRX_CE引脚置高,如果是,那么nRF24L01就进入ShockBurstTX模式,此时便可以发送数据了。当数据发送完毕时,DR引脚被置高,nRF24L01停止发送数据,TRX_CE引脚也随之置低让nRF24L01进入空闲模式。最后发射成功时,若CE为低则nRF24L01进入空闲模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入空闲模式2。在接收数据时,当设置TRX_CE为高,TX_EN为低时,nRF24L01处于ShockBurstRX模式,此时便可以可以接收数据了。等待一段时间后,nRF24L01将不断监测,等待接收数据,然后等待载波检测引脚CD被置高,当接收到地址数据后AM引脚被置高,随之无线接收模块开始接收数据,并进行CRC校验,等到接收完真确的数据包后,nRF24L01的各引脚会做出相应的变化,将DR引脚置高,TRX_CE置低,然后进入空闲模式,而无线接收部分的单片机则通过SPI接口将接收到的数据移入单片机内部,当单片机将本次接收到的数据存入内部后就再次进入接收模式。图4-1SPI读操作图4-2SPI写操作图4-3nRF24L01无线传输模块操作图4.41602液晶显示模块设计图4-61602液晶显示模块程序流程图4.5DHT11传感器模块设计图4-5DHT11传感器模块程序流程图4.6温湿度报警模块设计温湿度报警限制的调整主要是通过三个按键来进行调整,一个按键为上下限确定按键,另外两个按键分别为加按键和减按键。开始开始是否调整报警限值否温度下限调整是检测温湿度温度下限是否调整温度上限调整温度上限是否调整湿度下限是否调整湿度下限调整湿度上限是否调整湿度上限调整否否否否是是是是图4-7温湿度报警限值调整流程图5仿真与调试5.1仿真软件与仿真结果5.1.1Proteus仿真软件Proteus软件是电路分析与实物仿真软件。运行于Windows操作系统上,可以仿真、分析各种模拟器件和集成电路。比较好的仿真单片机及外围器件的工具。迄今为止是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、等,2010年增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。Proteus仿真软件的特点是:能实现单片机仿真和spice电路仿真结合。支持第三方软件编译和调试环境,如kill等软件提供软件调试功能。。具有强大的原理图绘制功能。5.1.2仿真结果由于无线传输模块nrf24l01在模拟仿真中无法实现所以采用双机通信原理实现部分仿真。图5-1硬件仿真图5.2系统功能测试为了保证无线通信信号的可靠传输。使用时,先打开接收主机电源,再打开测量子机电源;依次打开两块电路板电源后,3秒内将看到测量子机的温度和湿度信息,通过无线通信方式远传到接收主机液晶显示屏;如下图所示。图5-2接收端正面图5-2测量端正面接收端可以由用户自行设置好温度和湿度报警的上限和下限报警阈值,一旦接收到的温度处于非阈值范围内,接收端立即产生对应类型的声光报警信号。用户可以实时掌握测量端的温度和湿度测量数据,便于实现远程的温度和湿度信息监控。本次课程设计由测量端和接收端构成,其温度范围:上限30度-下限10度;湿度范围:上限90%-下限20%报警方式:超过温度上限时D1灯亮,蜂鸣器响 低于温度下限时D2灯亮,蜂鸣器响 超过湿度上限时D3灯亮,蜂鸣器响;低于湿度下限时D4灯亮;蜂鸣器响; 正常温湿度范围值时,D1D2D3D4灯不亮我们对着测量端的DHT11传感器哈气时,接收端的温湿度就会有所变换。当湿度超过设点范围时,D3灯亮并且蜂鸣器响起,如下图所示。图5-3湿度超限当温度、湿度都没有超出设点范围时,灯不亮并且蜂鸣器也不响起,如下图所示。图5-4温湿度未超限5.3调试5.3.1硬件调试本次设计中,主控模块是非常重要的部分,它不仅是本次设计的核心,在本次硬件调试中也遇到了问题,接上电源的时候,液晶显示亮了,但没有任何显示,于是做了如下的工作:1.首先应当检查是否接通电源,使用万用表检测各个芯片是否正常通点。2.测出电位器出现漏焊,关闭电源重新焊接。5.3.2软件调试当硬件制作完成后,软件调试依据模块的流程图确定好软件的流程,然后开始写程序中的一些子程序。调试中应当分步合并,不可一下将全部程序合并在一起调试。结论本文是以STC89C52单片机为核心单元的无线温湿度监控系统设计,用DHT11温湿度传感器做为数据信号的采集,然后通过NRF24L01模块的无线传输传送给单片机从而实现测量并且监控温湿度的作用。系统设计过程中分为几个方面进行。关于系统方案设计与选择方面:根据各项功能的实现方法以及硬件连接方式,将整个系统划分为数据采集模块、单片机模块、无线通信模块、液晶显示模块和电源模块系统以硬件软件两个部分组成,硬件的设计主要包括了单片机的控制单元、温湿度采集单元、无线传输单元、显示单元等部分组成。软件部分的设计,分别用Proteus、Keil等软件对DHT11传感器模块、NRF24L01无线通信模块以及1602液晶显示模块等程序的设计。本设计主要的产物是以单片机为主的实物,讲各个硬件模块完好的连接,在单片机中烧入程序,然后再运行程序,在实物测试中发现硬件电路与软件的不协调之处,并修正。验证各个模块功能的完整性,达到预期的效果,最后完成整个系统的调试。参考文献[1]徐新艳.单片机原理、应用与实践[M].北京:高等教育出版社,2005.[2]卢允伟.温湿度检测无线传感网的节能数据收集技术[D];浙江工业大学;2012[3]林泽.黄际巍,张书经.分布式无线粮情监测系统的设计与应用[J].电子工程师,2013,34(07):71-73.[4]尹海宏.陈雷.基于单片机的数据采集系统[J].信息技术报.2010,05(3):36-38.[5]张连华.单片机系统设计方法[J].科学之友,2010,07(5):38-42.[6]侯俊才,胡耀华.数字式粮仓温湿度监测系统设计[J].农机化研究,2012(9):103-106.[7]田素贞,屈芳升.基于单片机的粮仓温湿度检测系统的设计与研究[J].河南科学,2012,30(1):90-93[8]王冬霞,张玉辉,洪耀球.温湿度传感器SHT15及其在嵌入式系统中的应用[J].电子设计工程,2011,19(2):40-43.[9]向红军,雷彬.基于SHT15型智能传感器的弹药库温/湿度监控系统的设计[J].国外电子元器件,2012(1):64-66.[10]杨海.基于AT89C52单片机的药品库房温湿度控制系统设计[J].机械与电子,2010(7):82-83.[11]肖坤.无线粮仓温度监控系统的设计[M].合肥:合肥工业大学,2008[12]闫金瑞,胡原凯,张立辉.粮仓温湿度无线监测系统的设计[J].技术市场,2017(3).[13]卢超.粮仓无线温湿度监控系统[J].计算机系统应用,2011(09):161-164.[14]刘雪梅,李建勇,宋孟华.基于无线通信的粮仓温湿度监测系统设计[J].机电信息,2017(27).[15][16]徐敏;诸葛振荣等.基于1-Wire技术的数字温度仪[J].机电工程.2007(04-:20-21[17]秦珀石,李琳,王生耀等.测控温度数据采集管理软件设计[J].电子质.2005(09):30-32[18]王何宇,朱莉.基于nRF905的温湿度无线数据传输系统[J].微处理器与可编程器件应用.2011,25(05):78-81[19]倪天龙.单总线传感器DHT11在温湿度测控中的应用[J].单片机与嵌入式系统应用,2010,(5):60-62.[20]英庆,王代华,张志杰.基于nRF24L0l的无线数据传输系统[J].现代电子技术2008.附录一:附录二:/*******************************************发送端程序实现功能:显示温湿度。湿度20-90温度0-50按键K1、K2、K3设置上下限 初始湿度:上限60%下限20% 初始温度:上限30度下限10度 低于温度下限时D2灯亮,蜂鸣器响 超过湿度上限时D3灯亮,蜂鸣器响;低于湿度下限时D4灯亮;蜂鸣器响; *******************************************/#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitDQ=P3^7; sbitCE=P1^0;//发送或接受模式选择端sbitCSN=P1^1;//SPI片选信号sbitSCK=P1^2;//SPI时钟线sbitMOSI=P1^3;//数据输出端sbitMISO=P1^4;//数据接收端sbitIRQ=P1^5;//可屏蔽中断脚sbitlcden=P2^5; sbitlcdrs=P2^7; sbitlcdrw=P2^6; uintwendu;uintshidu;//*********************************************NRF24L01*************************************#defineTX_ADR_WIDTH5 //5uintsTXaddresswidth#defineRX_ADR_WIDTH5 //5uintsRXaddresswidth//***************************************NRF24L01寄存器指令*******************************************************#defineREAD_REG0x00 //读寄存器指令#defineWRITE_REG0x20 //写寄存器指令#defineRD_RX_PLOAD0x61 //读取接收数据指令#defineWR_TX_PLOAD0xA0 //写待发数据指令#defineFLUSH_TX0xE1 //冲洗发送FIFO指令#defineNOP0xFF //保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#defineEN_RXADDR0x02//可用信道设置#defineSETUP_AW0x03//收发地址宽度设置#defineSETUP_RETR0x04//自动重发功能设置#defineRF_CH0x05//工作频率设置#defineSTATUS0x07//状态寄存器#defineOBSERVE_TX0x08//发送监测功能#defineCD0x09//地址检测#defineRX_ADDR_P00x0A//频道0接收数据地址#defineRX_ADDR_P10x0B//频道1接收数据地址#defineRX_ADDR_P50x0F//频道5接收数据地址#defineTX_ADDR0x10//发送地址寄存器voidDelay(uints);voidinerDelay_us(ucharn);voidinit_NRF24L01(void);ucharSPI_RW(ucharbyte);ucharSPI_Read(ucharreg);voidSetRX_Mode(void);ucharSPI_RW_Reg(ucharreg,ucharvalue);ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);ucharnRF24L01_RxPacket(uchar*rx_buf);voidnRF24L01_TxPacket(uchar*tx_buf);//******************************************************************************************uchar bdatasta;//状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;/*************************延时函数********************/voidinerDelay_us(ucharn){ for(;n>0;n--) _nop_();}/**********NRF24L01初始化****************************/voidinit_NRF24L01(void){inerDelay_us(100); CE=0;//chipenable CSN=1;//Spidisable SCK=0;// SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); SPI_RW_Reg(WRITE_REG+RF_CH,0); SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07); }/****************************************************************************************************/*函数:uintSPI_RW(uintuchar)/****************************************************************************************************/ucharSPI_RW(ucharbyte){ ucharbit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++)//output8-bit { MOSI=(byte&0x80);//output'uchar',MSBtoMOSI byte=(byte<<1);//shiftnextbitintoMSB.. SCK=1;//SetSCKhigh.. byte|=MISO; //capturecurrentMISObit SCK=0; //..thensetSCKlowagain }return(byte); //returnreaduchar}/****************************************************************************************************/*函数:ucharSPI_Read(ucharreg)/*功能:NRF24L01的SPI时序/****************************************************************************************************/ucharSPI_Read(ucharreg){ ucharreg_val; CSN=0;//CSNlow,initializeSPIcommunication... SPI_RW(reg);//Selectregistertoreadfrom.. reg_val=SPI_RW(0);//..thenreadregistervalue CSN=1;//CSNhigh,terminateSPIcommunication return(reg_val);//returnregistervalue}/****************************************************************************************************/ucharSPI_RW_Reg(ucharreg,ucharvalue){ ucharstatus; CSN=0;//CSNlow,initSPItransaction status=SPI_RW(reg);//selectregister SPI_RW(value);//..andwritevaluetoit.. CSN=1;//CSNhighagain return(status);//returnnRF24L01statusuchar}/*********************************************************************************************************/*函数:uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)/*********************************************************************************************************/ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars){ ucharstatus,uchar_ctr; CSN=0;//SPI使能 status=SPI_RW(reg); for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)// SPI_RW(*pBuf++); CSN=1;//关闭SPI return(status);//}/***********************************************************************************************************/*函数:voidnRF24L01_TxPacket(unsignedchar*tx_buf)/*功能:发送tx_buf中数据/**********************************************************************************************************/voidnRF24L01_TxPacket(uchar*tx_buf){ CE=0; //StandByI模式 SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG+CONFIG,0x0e); CE=1; //置高CE,激发数据发送 inerDelay_us(20); }/********************延时函数,延时一毫秒************************/voiddelay1ms(uintz){ uintx,y; for(x=z;x>0;x--) for(y=114;y>0;y--);}voidwrite_com(ucharcom)//1602液晶写命令函数{ lcdrs=0; P0=com; delay1ms(5); lcden=1; delay1ms(5); lcden=0;}voidwrite_data(uchardate)//1602液晶写数据函数{ lcdrs=1; P0=date; delay1ms(5); lcden=1; delay1ms(5); lcden=0;}voidwrite_str(uchar*str)//1602液晶写字符串函数{while(*str!='\0')//未结束{write_data(*str++);delay1ms(1);}}/***************************1602液晶初始化命令******************************/voidinit_1602(){// ucharnum; uchartable[16]={0}; uchartable1[16]={0}; write_com(0x80);lcdrw=0;//先将RW拉低 lcden=0;//再把EN拉低 write_com(0x38);//显示模式设置 write_com(0x0c); write_com(0x06); write_com(0x01);//清除屏幕 write_com(0x80);}/**************************DTH11驱动程序部分*************************/bitinit_DTH11(){ bitflag; ucharnum; DQ=0; delay1ms(19); //>18ms DQ=1; for(num=0;num<10;num++); //20-40us 34.7us for(num=0;num<12;num++); flag=DQ; for(num=0;num<11;num++); //DTH响应80us for(num=0;num<24;num++); //DTH拉高80us returnflag;}ucharDTH11_RD_CHAR(){ ucharbyte=0; ucharnum; ucharnum1; while(DQ==1); for(num1=0;num1<8;num1++) { while(DQ==0); byte<<=1; //高位在前 for(num=0;DQ==1;num++); if(num<10) byte|=0x00; else byte|=0x01; } returnbyte;}voidDTH11_DUSHU(){ ucharnum; if(init_DTH11()==0) { shidu=DTH11_RD_CHAR(); DTH11_RD_CHAR(); wendu=DTH11_RD_CHAR()-3;//比正常值高3度左右 DTH11_RD_CHAR(); }}/***************************主函数**************************/voidmain(){ ucharTxBuf[20]={0}; init_NRF24L01(); wendu=0;//温度初始数值0 shidu=0;//湿度初始数值0 delay1ms(1000); //DTH11开始1s有错误输出 init_1602();//1602液晶初始化函数 while(1) { DTH11_DUSHU();//调用读取温湿度数值函数 write_com(0x80);write_str("SendingData");write_com(0x80+0x40);write_str("TEM"); write_data(':'); write_data(wendu%10+48);write_data(0xdf); write_data('C');write_str("HUM");write_data(':'); write_data(shidu/10%10+48); write_data(shidu%10+48); write_data('%'); TxBuf[1]=wendu/256; //将高八位装入 TxBuf[2]=wendu%256; //装入低八位 TxBuf[3]=shidu/256; //将高八位装入 TxBuf[4]=shidu%256; //装入低八位 TxBuf[2]=0x00;//缓存器2内容清零 TxBuf[3]=0x00;//缓存器1内容清零 TxBuf[4]=0x00;//缓存器2内容清零 delay1ms(500); sta=SPI_Read(STATUS); SPI_RW_Reg(WRITE_REG+STATUS,sta); CSN=0; SPI_RW(FLUSH_TX);//清空发送缓冲 CSN=1; }}/***********************************************************接收端程序实现功能:显示温湿度。湿度20-90温度0-50按键K1、K2、K3设置上下限 初始湿度:上限60%下限20% 初始温度:上限30度下限10度 低于温度下限时D2灯亮,蜂鸣器响 超过湿度上限时D3灯亮,蜂鸣器响;低于湿度下限时D4灯亮;蜂鸣器响; ***********************************************************/ #include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitCE=P1^0;//发送或接受模式选择端sbitCSN=P1^1;//SPI片选信号sbitSCK=P1^2;//SPI时钟线sbitMOSI=P1^3;//数据输出端sbitMISO=P1^4;//数据接收端sbitIRQ=P1^5;//可屏蔽中断脚sbitlcden=P2^5; sbitlcdrs=P2^7; sbitlcdrw=P2^6; uintwendu;uintshidu;sbitD1=P1^6; sbitD2=P1^7; sbitD3=P3^0; sbitD4=P3^1; sbitBELL=P2^0; //蜂鸣器报警控制端sbitK1=P3^5; //设置键/确定键sbitK2=P3^6; //数字调整键加1sbitK3=P3^7; //数字调整键减1uintwendu,shidu;//温湿度变量/********************延时函数,延时一毫秒************************/voiddelay(uintz){ uintx,y; for(x=112;x>0;x--) for(y=z;y>0;y--);}//*********************************************NRF24L01*************************************#defineTX_ADR_WIDTH5 //5uintsTXaddresswidth#defineRX_ADR_WIDTH5 //5uintsRXaddresswidth//***************************************NRF24L01寄存器指令*******************************************************#defineREAD_REG0x00 //读寄存器指令#defineWRITE_REG0x20 //写寄存器指令#defineRD_RX_PLOAD0x61 //读取接收数据指令#defineWR_TX_PLOAD0xA0 //写待发数据指令#defineFLUSH_TX0xE1 //冲洗发送FIFO指令//*************************************SPI(nRF24L01)寄存器地址****************************************************#defineEN_RXADDR0x02//可用信道设置#defineSETUP_AW0x03//收发地址宽度设置#defineSETUP_RETR0x04//自动重发功能设置#defineRF_CH0x05//工作频率设置#defineSTATUS0x07//状态寄存器#defineOBSERVE_TX0x08//发送监测功能#defineCD0x09//地址检测#defineRX_ADDR_P00x0A//频道0接收数据地址#defineRX_ADDR_P10x0B//频道1接收数据地址#defineRX_ADDR_P50x0F//频道5接收数据地址#defineTX_ADDR0x10//发送地址寄存器//**************************************************************************************voidinerDelay_us(ucharn);voidinit_NRF24L01(void);ucharSPI_RW(ucharbyte);ucharSPI_Read(ucharreg);ucharSPI_RW_Reg(ucharreg,ucharvalue);ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);ucharnRF24L01_RxPacket(uchar*rx_buf);voidnRF24L01_TxPacket(uchar*tx_buf);//******************************************************************************************uchar bdatasta;//状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;/******************************************************************************************/*延时函数/******************************************************************************************/voidinerDelay_us(ucharn){ for(;n>0;n--) _nop_();}/**************************1602显示****************************/voidwrite_cmd(charcmd)//写指令函数{ lcdrs=0; P0=cmd; delay(1); lcden=1; delay(1); lcden=0;}voidwrite_data(uchardat)//写数据函数{ lcdrs=1; P0=dat; delay(1); lcden=1; delay(1); lcden=0;}voidwrite_str(uchar*str)//写字符串函数{ while(*str!='\0') { write_data(*str++); delay(5); }}voidinit_1602()//1602初始化函数{ lcdrw=0; lcden=0; write_cmd(0x38);//显示模式设置 write_cmd(0x0c);//显示开关,光标关闭 write_cmd(0x06);//显示光标移动设置 write_cmd(0x01);//清除屏幕write_cmd(0x80);;//数据指针移到第一行第一个位置}//****************************************************************************************/*NRF24L01初始化//***************************************************************************************/voidinit_NRF24L01(void){inerDelay_us(100);CE=0;//chipenableCSN=1;//SpidisableSCK=0;//SpiclocklineinithighSPI_RW_Reg(WRITE_REG+EN_AA,0x03);SPI_RW_Reg(WRITE_REG+RF_CH,0);SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);CE=1;//chipdisable}/****************************************************************************************************/*函数:uintSPI_RW(uintuchar)/****************************************************************************************************/ucharSPI_RW(ucharbyte){ ucharbit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++)//output8-bit { MOSI=(byte&0x80);//output'uchar',MSBtoMOSI byte=(byte<<1);//shiftnextbitintoMSB.. SCK=1;//SetSCKhigh.. byte|=MISO; //capturecurrentMISObit SCK=0; //..thensetSCKlowagain }return(byte); //returnreaduchar}/****************************************************************************************************/*函数:ucharSPI_Read(ucharreg)/*功能:NRF24L01的SPI时序/****************************************************************************************************/ucharSPI_Read(ucharreg){ ucharreg_val; CSN=0;//CSNlow,initializeSPIcommunication... SPI_RW(reg);//Selectregistertoreadfrom.. reg_val=SPI_RW(0);//..thenreadregistervalue CSN=1;//CSNhigh,terminateSPIcommunication return(reg_val);//returnregistervalue}/****************************************************************************************************/ucharSPI_RW_Reg(ucharreg,ucharvalue){ ucharstatus; CSN=0;//CSNlow,initSPItransaction status=SPI_RW(reg);//selectregister SPI_RW(value);//..andwritevaluetoit.. CSN=1;//CSNhighagain return(status);//returnnRF24L01statusuchar}/****************************************************************************************************//*函数:uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)/****************************************************************************************************/ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars){ ucharstatus,uchar_ctr; CSN=0; //SetCSNlow,initSPItranaction for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++) pBuf[uchar_ctr]=SPI_RW(0);// CSN=1; return(status);//returnnRF24L01statusuchar}/*********************************************************************************************************/*函数:uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)/*********************************************************************************************************/ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars){ ucharstatus,uchar_ctr; CSN=0;//SPI使能 status=SPI_RW(reg); for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)// SPI_RW(*pBuf++); CSN=1;//关闭SPI return(status);//}/******************************************************************************************************//*函数:unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf)/******************************************************************************************************/ucharnRF24L01_RxPacket(uchar*rx_buf){ ucharrevale=0; SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); CE=0; SPI_RW_Reg(WRITE_REG+CONFIG,0x0f); CE=1; inerDelay_us(130); { CE=0; //SPI使能 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//readreceivepayloadfromRX_FIFObuffer revale=1; //读取数据完成标志 wendu=rx_buf[1]*256+rx_buf[2]; shidu=rx_buf[3]*256+rx_buf[4]; write_cmd(0x84);//在第一行显示 write_data((rx_buf[1]*256+rx_buf[2])/10%10+48);//+48的作用是实现十进制和ASCII码之间的转换,目的是使1602液晶正常显示十进制数 write_data((rx_buf[1]*256+rx_buf[2])%10+48); write_cmd(0xc4);//在第二行显示 write_data((rx_buf[3]*256+rx_buf[4])%

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论