基于无线网络的温度检测器课程设计_第1页
基于无线网络的温度检测器课程设计_第2页
基于无线网络的温度检测器课程设计_第3页
基于无线网络的温度检测器课程设计_第4页
基于无线网络的温度检测器课程设计_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

广东药学院课程设计论文报告设计项目:无线网络控制的温度监测器班级:组员:指导老师:2015/1/8目录一、设计要求二、设计原理及方案三、系统硬件设计1、设计主要器件1.1、AT89C52单片机1.2、温度传感器DS18B201.3、NRF24L01无线收发器2、硬件电路设计2.1、发射端2.1.1、温度采集模块2.1.2、控制单元STC89C52单片机2.1.3、无线收发模块NRF24L012.1.4、电源模块2.1.5、时钟振荡电路设计2.1.6、复位电路设计2.2、接收端2.2.1、蜂鸣器报警模块2.2.2、键盘电路模块2.2.3、液晶显示模块系统软件设计1、程序流程图1.1、数据采集流程图1.2、无线发送流程图1.3、无线接收流程图2、源程序代码2.1、发射板2.1.1、DS18B20.h2.1.2、DS18B20.c2.1.3、NRF24L01.h2.1.4、NRF24L01.c2.1.5、main.h2.1.6、main.c2.2、接收板2.2.1、LCD1602.h2.2.2、LCD1602.c2.2.3、NRF24L01.h2.2.4、NRF24L01.c2.2.5、main.h2.2.6、mian.c五、总结与心得正文基于无线网络的温度监控系统摘要:无线温度监控器是一种用于仓库和蔬菜大棚等具有温度检测、无线传输、温度显示和超限报警功能的仪器。系统由发送端和接收端两部分组成。发送端将温度传感器检测到的温度值经单片机进行数据处理后,通过无线收发模块无线发送,接收端将接收到的数据信息显示在液晶屏上,并附加温度限设置和超限报警功能。本设计利用软件Keil进行系统程序设计,利用单片机学习板进行硬件仿真,待仿真成功后进行了实物制作和调试,最终成功设计出了无线温度检测器。文中详细介绍了温度采集模块、无线传输模块、显示模块、温度限设置模块和报警电路的设计方法和过程。当采样点的温度值超出规定值时,系统通过报警电路提醒监测人员。同时,检测人员可以通过键盘对具体报警点的温度值进行设置。另外,该系统温度检测具有较高的精度,无线数据传输稳定,而且传输距离较远。关键词:温度检测;单片机;无线传输一、【设计要求】设计并制作一款基于无线网络的温度监测器。分主机和从机,从机采集温度数据并通过无线网络发送。主机通过无线网络接收从机数据,通过液晶屏显示温度,当温度到达规定值时,主机通过蜂鸣器报警。二、【设计原理及方案】采用单片集成电路AT89C52结合数字型温度传感器DS18B20设计实现。无线数据传输部分通过无线收发模块NRF24L01传输。其中AT89C52及其外围电路实现数据的处理及输出的控制,温度传感器DS18B20采集温度参数并通过无线传输模块发送到主机,主机通过LCD1602液晶显示温度值。三、【系统硬件设计】系统主要由主从机两部分组成,从机主要完成温度的采集及无线发送;主机完成无线信号的接收、显示及报警功能。温度采集部分采用数字化温度传感器DS18B20,单片机实现温度传感器采集到的数据进行处理,然后通过NRF24L01无线收发器将数据发送出去;数据显示及报警模块由无线收发器将接收到的信号传送给控制器,通过液晶显示模块将温度值显示出来,并能通过蜂鸣器和LCD进行报警。1、设计主要器件AT89C52单片机,温度传感器DS18B20,NRF24L01无线收发器,LCD1602液晶显示器。1.1、AT89C52单片机目前使用最为广泛的是51系列单片机,其中STC89C52系列单片机是宏晶科技推出的新一代超强抗干扰/高速/低功耗的单片机,是一款增强型51单片机,完全兼容8051单片机,增加了新的功能,新增两级中断优先级,多一个外中断,内置EEPROM,看门狗,具有掉电模式,512B内存,支持ISP在线编程,不用编程器,程序可擦写10万次,管脚完全兼容,性能更好,驱动能力更强,超强抗干扰能力,价格也比传统的89系列低。考虑到快速开发以及本系统的应用要求,最后采用了最常用的STC89C52单片机。STC89C52单片机主要性能:(1)高速:1个时钟/机器周期,增强型8051内核,速度比普通8051快8到12倍。(2)宽电压:5.5—4.IV/3.7V,3.6V—2.4V/2.lV。(3)低功耗设计:空闲模式(可由任意一个中断唤醒)和掉电模式(可由任意一个外部中断唤醒,可支持下降沿/低电远程唤醒)。(4)工作频率:0—35MHz,普通8051:0—420MHz。(5)时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置。(6)芯片内EEPROM功能,擦写次数10万以上。(7)ISP/IAP,在系统可编程/在应用可编程,无需编程器/仿真器。(8)2个16位定时器,兼容普通8051的定时器T0/T1。(9)硬件看门狗(WDT)。(10)全双工异步串行口(UART),兼容普通8051,可当2个串口使用。(11)先进的指令集结构,兼容普通8051指令集,有硬件乘法/除法指令。1.2、温度传感器DS18B20DSl8B20是美国Dallas半导体公司继DSl820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,它能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在93.75ms和750ms内完成9位和12位的数字量读取。它采用独特的单总线接口方式,即允许在一条信号线上挂接数十甚至上百个数字式传感器,从而使测温装置与各传感器的接口变得十分简单,克服了模拟式传感器与微机接口时需要的A/D转换器及其它复杂外围电路的缺点,而且,可以通过总线供电,温度变换功率来源于数据总线,总线本身也可以向所挂接的DSl8B20供电,而无需额外电源,由它组成的温度测控系统非常方便,而且成本低、体积小、可靠性高。DSl8B20的测温范围-55℃~+125℃,最高分辨率可达0.0625℃,由于每一个DSl8B20出厂时都刻有唯一的一个序列号并存入其ROM中,因此CPU可用简单的通信协议就可以识别,从而节省了大量的引线和逻辑电路。由于DSl8B20具有独特的单总线接口方式在测温时有明显的优势,占用单片机的I/O引脚资源少,和单片机的通信协议比较简单,成本较低,而且具有负压特性(电源极性接反时,温度计不会因发热而烧毁,只是不能正常工作),和其他数字温度传感器相比,它更适合本系统。所以,选用DSl8B20作为温度测量的传感器。1.3、NRF24L01无线收发器NRF24L01是NORDIC公司最近生产的一款无线通信芯片,采用FSK调制,内部集成NORDIC自己的EnhancedShortBurst协议。可以实现点对点或是1对6的无线通信。无线通信速度可以达到2Mbps。NORDIC公司提供通信模块的GERBER文件,可以直接加工生产。嵌入式工程师或是单片机爱好者只需要为单片机系统预留5个GPIO,1个中断输入引脚,就可以很容易实现无线通信的功能,非常适合用来为MCU系统构建无线通信功能。2、硬件电路设计2.1、发射端无线温度检测器的温度采集端由电源模块、STC89C52单片机、温度采集电路、无线发送模块NRF24L01、时钟电路及复位电路组成。温度采集端硬件框图如图2.1所示。图2.1温度采集端硬件框图2.1.1、温度采集模块1.DSl8B20内部结构DSl8B20芯片的内部结构如图2.2所示。图2.2DS18B20内部结构图2.DSl8B20有4个主要的数据部件:(1)64位激光ROM。64位激光ROM从高位到低位依次为8位CRC、48位序列号和8位家族代码(28H)。(2)温度灵敏元件。(3)非易失性温度报警触发器TH和TL。可通过软件写入用户报警上下限值。(4)配置寄存器。配置寄存器为高速暂存存储器中的第五个字节。DSl8B20在工作时按此寄存器中的分辨率将温度转换成相应精度的数值,其各位定义如表2.1所示。表2.1DS18B20配置寄存器模式设置表TMR1R011111其中,TM:测试模式标志位,出厂时被写入0,不能改变;R0、Rl:温度计分辨率设置位,其对应四种分辨率表3.2所列,出厂时R0、Rl置为缺省值:R0=1,R1=1(即12位分辨率),用户可根据需要改写配置寄存器以获得合适的分辨率。配置寄存器与分辨率关系如表2.2所示。表2.2配置寄存器与分辨率关系表R0R1温度计分辨率/bit最大转换时间/us00993.750110187.5101137511127503.高速暂存存储器高速暂存存储器由9个字节组成,其分配如表2.3所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第1和第2个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表3.3所示。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。表2.3DS18B20存储器映像表温度低位温度高位THTL配置保留保留保留8位CRC4.对DSl8B20的设计,需要注意以下问题:(1)对硬件结构简单的单线数字温度传感器DSl8B20进行操作,需要用较为复杂的程序完成。编制程序时必须严格按芯片数据手册提供的有关操作顺序进行,读、写程序要严格按要求编写。尤其在使用DSl8B20的高测温分辨力时,对时序及电气特性参数要求更高。(2)测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。DSl8B20在三线制应用时,应将其三线焊接牢固;在两线应用时,应将VCC与GND接在一起,焊接牢固。若VCC脱开未接,传感器只送85.0℃的温度值。2.1.2、控制单元STC89C52单片机1.STC89C52单片机的特点单片机是在一块硅片上集成了各种部件的微型机,这些部件包括中央处理器CPU、数据存储器RAM、程序存储器ROM、定时器/计数器和多种I/O接口电路。STC89C52单片机的基本结构如图2.3所示。图2.3STC89C52单片机的基本结构2.STC89C52单片机的引脚及功能STC89C52单片机的管脚分布如图2.4所示。图2.4STC89C52单片机的管脚图STC89C52的I/O端口:P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)。在flash编程和校验时,P1口接收低8位地址字节。引脚第二功能P1.0/T2(定时器/计数器T2的外部计数输入)P1.1/T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)P1.5/MOSI(在系统编程用)P1.6/MISO(在系统编程用)P1.7/SCK(在系统编程用)P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高8位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P3输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为STC89C52特殊功能(第二功能)使用。在flash编程和校验时,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(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)此外,P3口还接收一些用于flash闪存编程和程序校验的控制信号。RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。ALE/PROG:当访问外部程存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意每当访问外部数据存储器时将跳过一个ALE脉冲。对flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。PSEN:程序储存允许PSEN输出是外部程序存储器的读选通信号,当STC89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。EA/VP:外部访问允许欲使CPU仅访问外部程序存储器,EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。2.1.3、无线收发模块NRF24L01无线收发模块NRF24L01的各引脚与单片机的P1口相连,电路连接图如图2.4,图2.5所示。图2.5NRF24L01引脚示意图图2.6无线收发模块NRF24L01与单片机的电路连接图无线收发模块NRF24L01引脚功能:CSN(P1.6):芯片的片选线,CSN为低电平芯片工作。SCK(P3.4):芯片控制的时钟线(SPI时钟)。MISO(P3.3):芯片控制数据线(Masterinputslaveoutput)。MOSI(P1.7):芯片控制数据线(Masteroutputslaveinput)。IRQ(P3.2):中断信号。无线通信过程中MCU主要是通过IRQ与NRF24L01进行通信。CE(P3.5):芯片的模式控制线。在CSN为低的情况下,CE协同NRF24L01的CONFIG寄存器共同决定NRF24L01的状态。2.1.4、电源模块本次设计电源采用usb口将220v交流电源转换为5v直流电源后再通过AMS1117-3.3变压器转换为3.3v直流电源输入。电源模块中加装了LED灯,指示电源通断。电源模块设计如图2.7,图2.8所示。图2.7USB接口电路图2.8电源转换电路2.1.5、时钟振荡电路设计XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30pf左右。STC89C52单片机内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,在焊接电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。本次时钟电路设计采用内部方式,即利用芯片内部的振荡电路,晶体振荡器选用12MHz,电容选用33pf。时钟振荡电路如图2.9所示。图2.9时钟振荡电路连接图2.1.6、复位电路设计在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个脚保持高电平,单片机便循环复位。复位后P0-P3口均在引脚表现为高电平,程序计数器和特殊功能寄存器全部清零。当复位脚由高电平变为低电平时,芯片从ROM的00H处重新开始执行程序。复位电路通常采用上电自动复位和按钮复位两种方式,本设计采用按钮复位电路。复位电路图如图2.10所示。图2.10复位电路连接图2.2、接收端无线温度测量器的温度接收端由电源模块、STC89C52单片机、液晶显示电路、无线收发模块NRF24L01、键盘电路、报警电路、时钟电路及复位电路组成。其中电源模块、STC89C52单片机、无线收发模块NRF24L01、时钟电路和复位电路与发射端相同。温度接收端硬件框图如图2.11所示。图2.11温度接收端硬件框图2.2.1、蜂鸣器报警模块报警电路由两部分组成。第一部分由三极管和蜂鸣器组成,第二部分由两个LED灯和1k电阻组成。当实时温度大于温度上限设定值时蜂鸣器发出声响,同时LED1灯亮,当实时温度大于温度下限设定值时蜂鸣器发出声响,同时LED2灯亮,而当实时温度回到温度设定值时,蜂鸣器和红色LED灯自动停止。蜂鸣器报警模块如图2.12所示,LED灯连接如图2.13所示,蜂鸣器及LED灯引脚图如图2.14所示。图2.12蜂鸣器报警模块图2.13LED灯报警模块图2.14蜂鸣器及LED灯连接图2.2.2、键盘电路本系统选择使用独立式按键。键盘电路由四个按键与单片机P3口相连构成,实现温度限的设置功能。通电后,液晶屏显示设定温度为LST:+99℃L:00℃。按下Key1键,LS切换,开关灯及蜂鸣器报警,按下Key2键,切换上限温度和下限温度调节,Key3和Key4则分别是加减温度设定值。键盘电路图如图2.15所示。图2.15键盘电路图2.2.3、液晶显示模块1.LCD1602主要管脚介绍显示模块用于显示实时温度和设定温度。这里采用1602液晶显示屏,其主要参数为:显示容量(16*2个字符)、芯片工作电压(4.5-5.5V)和工作电流(2.0mA)。LCD1602共有16个引脚,各管脚的功能如表2.4所示。表2.4LCD1602管脚功能介绍表引脚符号状态功能1VSS输入电源地2Vdd输入电源+5V3V0输入对比度控制端4RS输入寄存器选择5R/W输入读、写操作6E输入使能信号7DB0三态数据总线(LSB)8DB1三态数据总线9DB2三态数据总线10DB3三态数据总线11DB4三态数据总线12DB5三态数据总线13DB6三态数据总线14DB7三态数据总线(MSB)15LEDA输入背光+5V16LEDK输入背光地说明:V0:液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,使用时可以通过一个10k的电位器调整对比度。RS:寄存器选择,高电平时选择数据存储器,低电平时选择指令寄存器。R/W:读写信号线,高电平时进行读操作,低电平进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址;当RS为高电平,R/W为低电平时可以写入数据。E:使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。2.LCD1602控制指令LCD1602控制指令介绍表如表2.5所示。表2.5LCD1602控制指令介绍表格式功能RSR/WDB7DB6DB5DB4DB3DB2DB1DB0清屏指令0000000001显示开关控制0000001DCB光标、画面移动000000S/CR/L**功能设置00001DLNF**说明:(1)清屏指令清屏指令的主要功能有:清除液晶显示器的内容,即DDRAM的内容全部填入“空白”的ASCII码20H;光标归位,即将光标撤回液晶显示屏的左上方;将地址计数器(AC)的值设为0。(2)显示开关控制显示开关控制的功能是设置显示、光标及闪烁的开、关等。其中:D表示显示:1为开,0为关;C表示光标:1为开,0为关;B表示闪烁:1为开,0为关。(3)光标及画面移动光标及画面移动的功能是控制光标、画面的移动,不影响DDRAM。其中:S/C=1,画面平移一个字符位;S/C=0,光标平移一个字符位;R/L=1:右移;R/L=0:左移。(4)功能设置功能设置主要是对LCD1602的工作方式进行设置。其中:DL=1,8位数据接口;DL=0,4位数据接口;N=1,两行显示;N=0,一行显示;F=1,5×10点阵字符;F=0,5×7点阵字符。3.LCD1602与单片机连接图液晶显示模块设计如图2.15所示。数据线DB0-DB7连接单片机的P0口;RS、R/W、E这3条控制线分别接单片机的P1.3、P1.4和P1.5口。图2.15液晶显示模块LCD1602四、系统软件设计1、程序流程图1.1、数据采集流程图初始化初始化跳过ROM跳过ROM进行数据转换进行数据转换发送存储器命令发送存储器命令读取温度值读取温度值判断正负判断正负取反加一负值取反加一正值结束结束数据采集流程图1.2、无线发送流程图开始开始TRX_CE,TXEN全部置高TRX_CE,TXEN全部置高射频寄存器开启,数据打包发送,DR=1射频寄存器开启,数据打包发送,DR=1TRX-CE=1?NTRX-CE=1?AUTO-RET=1AUTO-RET=1N前导码完成后置DR=0N前导码完成后置DR=0结束结束无线发送流程图1.3、无线接收流程图开始开始TRX_CE=1,TXEN=0TRX_CE=1,TXEN=0接收部分检测载波,CD置高接收部分检测载波,CD置高ADDR正确?ADDR正确?NDR和AM置低AM为低AM置高DR和AM置低AM为低AM置高移去字头地址CRC?移去字头地址CRC?N从SPI接收数据从SPI接收数据DR置高DR置高TRX-CE=0?TRX-CE=0?N进入空闲状态进入空闲状态结束结束无线接收流程图2、源程序代码2.1接收板2.1.1、DS18B20.hifndef__DS18B20_H__#define__DS18B20_H__#include<reg52.h>sbitDS18B20_DQ=P1^0;externvoidDS18B20_Delay(unsignedintn);externvoidDS18B20_Write_Byte(unsignedchardat);externunsignedcharDS18B20_Read_Byte();externbitDS18B20_Init();externunsignedintGet_temp(void);externunsignedcharflag_temper;#endif2.1.2、DS18B20.c#include"DS18B20.h"#include<intrins.h>unsignedcharflag_temper=0;voidDS18B20_Delay(unsignedintn){ unsignedinti; for(i=0;i<n;i++);}voidDS18B20_Write_Byte(unsignedchardat){ unsignedchari; for(i=0;i<8;i++) { DS18B20_DQ=0; _nop_(); _nop_(); DS18B20_DQ=dat&0x01; dat>>=1; DS18B20_Delay(6); DS18B20_DQ=1; _nop_(); _nop_(); } }unsignedcharDS18B20_Read_Byte(){ unsignedchardat,i; for(i=0;i<8;i++) { DS18B20_DQ=0; _nop_(); _nop_(); DS18B20_DQ=1; _nop_(); _nop_(); dat>>=1; if(DS18B20_DQ==1) { dat|=0X80; } else { dat&=0x7f; } DS18B20_Delay(6); } returndat; }bitDS18B20_Init(){ bitFlag_exist=1; DS18B20_DQ=1; _nop_(); _nop_(); DS18B20_DQ=0; DS18B20_Delay(50); DS18B20_DQ=1; DS18B20_Delay(3); Flag_exist=DS18B20_DQ; DS18B20_Delay(10); DS18B20_DQ=1; returnFlag_exist; }unsignedintGet_temp(void){ floattt; unsignedchara,b; unsignedinttemp; if(DS18B20_Init()==0) { DS18B20_Write_Byte(0xcc); DS18B20_Write_Byte(0x44); // _delay_ms(750); if(DS18B20_Init()==0) { DS18B20_Write_Byte(0xcc); DS18B20_Write_Byte(0xbe); a=DS18B20_Read_Byte(); b=DS18B20_Read_Byte(); temp=b; temp<<=8; temp=temp|a; if(temp>0xfff) { flag_temper=1; temp=(~temp)+1; } else { flag_temper=0; } tt=temp*0.0625; temp=tt*10+0.5; } } returntemp;}2.1.3、NRF24L01.h#ifndef__NRF24L01__H__#define__NRF24L01__H__#include<reg52.h>sbitNRF24L01_CSN=P1^6;sbitNRF24L01_CE=P3^5;sbitNRF24L01_MOSI=P1^7;sbitNRF24L01_SCK=P3^4;sbitNRF24L01_MISO=P3^3;sbitNRF24L01_IRQ=P3^2;#defineNRF24L01_READ_REG0x00 #defineNRF24L01_WRITE_REG0x20 #defineNRF24L01_RD_RX_PLOAD0x61 #defineNRF24L01_WR_TX_PLOAD0xA0 #defineNRF24L01_FLUSH_TX0xE1 #defineNRF24L01_FLUSH_RX0xE2 #defineNRF24L01_REUSE_TX_PL0xE3 #defineNRF24L01_NOP0xFF #defineNRF24L01_CONFIG0x00#defineNRF24L01_EN_AA0x01#defineNRF24L01_EN_RXADDR0x02#defineNRF24L01_SETUP_AW0x03#defineNRF24L01_SETUP_RETR0x04#defineNRF24L01_RF_CH0x05#defineNRF24L01_RF_SETUP0x06#defineNRF24L01_STATUS0x07#defineNRF24L01_OBSERVE_TX0x08#defineNRF24L01_CD0x09#defineNRF24L01_RX_ADDR_P00x0A#defineNRF24L01_RX_ADDR_P10x0B#defineNRF24L01_RX_ADDR_P20x0C#defineNRF24L01_RX_ADDR_P30x0D#defineNRF24L01_RX_ADDR_P40x0E#defineNRF24L01_RX_ADDR_P50x0F#defineNRF24L01_TX_ADDR0x10#defineNRF24L01_RX_PW_P00x11#defineNRF24L01_RX_PW_P10x12#defineNRF24L01_RX_PW_P20x13#defineNRF24L01_RX_PW_P30x14#defineNRF24L01_RX_PW_P40x15#defineNRF24L01_RX_PW_P50x16#defineNRF24L01_FIFO_STATUS0x17#defineNRF24L01_TX_ADR_WIDTH5 #defineNRF24L01_RX_ADR_WIDTH5 #defineNRF24L01_TX_PLOAD_WIDTH20 #defineNRF24L01_RX_PLOAD_WIDTH20 externunsignedcharNRF24L01_SPI_RW(unsignedcharbyte);externunsignedcharNRF24L01_SPI_Read(unsignedcharreg);externunsignedcharNRF24L01_SPI_RW_Reg(unsignedcharreg,unsignedcharvalue);externunsignedcharNRF24L01_SPI_Write_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars);//externunsignedcharNRF24L01_SPI_Read_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars);//externvoidSetRX_Mode();//externunsignedcharNRF24L01_RxPacket(unsignedchar*rx_buf);externvoidNRF24L01_TxPacket(unsignedchar*tx_buf);externvoidNRF24L01_Init();externunsignedcharNRF24L01_TX_Buffer[3];externunsignedcharNRF24L01_RX_Buffer[3];externunsignedcharbdataSTA;#endif2.1.4、NRF24L01.c#include"NRF24L01.h"#include<intrins.h>unsignedcharNRF24L01_TX_Buffer[3];unsignedcharNRF24L01_RX_Buffer[3];unsignedcharconstNRF24L01_TX_ADDRESS[NRF24L01_TX_ADR_WIDTH]={0x37,0x43,0x10,0x10,0xFF};unsignedcharconstNRF24L01_RX_ADDRESS[NRF24L01_RX_ADR_WIDTH]={0xCF,0xCF,0xCF,0xCF,0xCF}; unsignedcharbdataSTA;sbitSTAbits_RX_DR =STA^6;sbitSTAbits_TX_DS =STA^5;sbitSTAbits_MAX_RT =STA^4;unsignedcharNRF24L01_SPI_RW(unsignedcharbyte){ unsignedchari; for(i=0;i<8;i++) { NRF24L01_MOSI=(byte&0x80); _nop_(); byte<<=1; NRF24L01_SCK=1; _nop_(); byte|=NRF24L01_MISO; _nop_(); NRF24L01_SCK=0; _nop_(); }return(byte); }unsignedcharNRF24L01_SPI_Read(unsignedcharreg){ unsignedcharreg_val; NRF24L01_CSN=0; _nop_(); NRF24L01_SPI_RW(reg); reg_val=NRF24L01_SPI_RW(0); NRF24L01_CSN=1; _nop_(); return(reg_val); }unsignedcharNRF24L01_SPI_RW_Reg(unsignedcharreg,unsignedcharvalue){ unsignedcharstatus; NRF24L01_CSN=0; _nop_(); status=NRF24L01_SPI_RW(reg); NRF24L01_SPI_RW(value); NRF24L01_CSN=1; _nop_(); return(status);}unsignedcharNRF24L01_SPI_Write_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars){ unsignedcharstatus,i; NRF24L01_CSN=0; _nop_(); status=NRF24L01_SPI_RW(reg); for(i=0;i<uchars;i++) NRF24L01_SPI_RW(*pBuf++); NRF24L01_CSN=1; _nop_(); return(status);}voidNRF24L01_TxPacket(unsignedchar*tx_buf){ unsignedchari=0; NRF24L01_CE=0; NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P0,NRF24L01_TX_ADDRESS,NRF24L01_TX_ADR_WIDTH); NRF24L01_SPI_Write_Buf(NRF24L01_WR_TX_PLOAD,tx_buf,NRF24L01_TX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_CONFIG,0x0e); NRF24L01_CE=1; i=10; while(i--); }voidNRF24L01_Init(){unsignedinti=45000; NRF24L01_CE=0; while(i--); NRF24L01_CSN=1; NRF24L01_SCK=0; NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_TX_ADDR,NRF24L01_TX_ADDRESS,NRF24L01_TX_ADR_WIDTH); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P0,NRF24L01_RX_ADDRESS,NRF24L01_RX_ADR_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_EN_AA,0x01); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_EN_RXADDR,0x01); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RF_CH,0);NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P0,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RF_SETUP,0x07); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_SETUP_RETR,0x0f); }2.1.5、main.h#ifndef__MAIN_H__#define__MAIN_H__#include<reg52.h>sbitLED1=P1^1;#defineLED_ON0#defineLED_OFF1externvoidDelay_ms(unsignedintn);#endif2.1.6、main.c#include"main.h"#include"DS18B20.h"#include"NRF24L01.h"unsignedintTemp_Buffer=0;voidmain(){ Temp_Buffer=Get_temp(); Delay_ms(1000); NRF24L01_Init(); while(1) { Temp_Buffer=Get_temp(); NRF24L01_TX_Buffer[0]=flag_temper; NRF24L01_TX_Buffer[1]=(Temp_Buffer>>8)&0x00ff; NRF24L01_TX_Buffer[2]=Temp_Buffer&0x00ff; NRF24L01_TxPacket(NRF24L01_TX_Buffer); while(NRF24L01_IRQ==1); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_STATUS,0x7e);LED1=~LED1; Delay_ms(1000); }}voidDelay_ms(unsignedintn){ unsignedinti,j; for(i=0;i<n;i++) for(j=0;j<123;j++);}2.2、接收板2.2.1、LCD1602.h#ifndef__LCD1602_H__#define__LCD1602_H__#include<reg52.h>#defineLCD1602_PORTP0sbitLCD1602_RS=P1^3;sbitLCD1602_RW=P1^4;sbitLCD1602_EN=P1^5;externvoidLCD1602_delay_ms(unsignedintn);externvoidLCD1602_write_com(unsignedcharcom);externvoidLCD1602_write_data(unsignedchardat);externvoidLCD1602_write_word(unsignedchar*s);externvoidLCD1602_Init();#endif2.2.2、LCD1602.c#include"LCD1602.h"voidLCD1602_delay_ms(unsignedintn){ unsignedinti,j; for(i=0;i<n;i++) for(j=0;j<123;j++);}voidLCD1602_write_com(unsignedcharcom){ LCD1602_RS=0; LCD1602_delay_ms(1); LCD1602_EN=1; LCD1602_PORT=com; LCD1602_delay_ms(1); LCD1602_EN=0;}voidLCD1602_write_data(unsignedchardat){ LCD1602_RS=1; LCD1602_delay_ms(1); LCD1602_PORT=dat; LCD1602_EN=1; LCD1602_delay_ms(1); LCD1602_EN=0;}voidLCD1602_write_word(unsignedchar*s){ while(*s>0) { LCD1602_write_data(*s); s++; }}voidLCD1602_Init(){ LCD1602_EN=0; LCD1602_RW=0; LCD1602_write_com(0x38); LCD1602_write_com(0x0c); LCD1602_write_com(0x06); LCD1602_write_com(0x01); }2.2.3、NRF24L01.c#ifndef__NRF24L01__H__#define__NRF24L01__H__#include<reg52.h>sbitNRF24L01_CSN=P1^6;sbitNRF24L01_CE=P3^5;sbitNRF24L01_MOSI=P1^7;sbitNRF24L01_SCK=P3^4;sbitNRF24L01_MISO=P3^3;sbitNRF24L01_IRQ=P3^2;#defineNRF24L01_READ_REG0x00 #defineNRF24L01_WRITE_REG0x20 #defineNRF24L01_RD_RX_PLOAD0x61 #defineNRF24L01_WR_TX_PLOAD0xA0 #defineNRF24L01_FLUSH_TX0xE1 #defineNRF24L01_FLUSH_RX0xE2 #defineNRF24L01_REUSE_TX_PL0xE3 #defineNRF24L01_NOP0xFF #defineNRF24L01_CONFIG0x00#defineNRF24L01_EN_AA0x01#defineNRF24L01_EN_RXADDR0x02#defineNRF24L01_SETUP_AW0x03#defineNRF24L01_SETUP_RETR0x04#defineNRF24L01_RF_CH0x05#defineNRF24L01_RF_SETUP0x06#defineNRF24L01_STATUS0x07#defineNRF24L01_OBSERVE_TX0x08#defineNRF24L01_CD0x09#defineNRF24L01_RX_ADDR_P00x0A#defineNRF24L01_RX_ADDR_P10x0B#defineNRF24L01_RX_ADDR_P20x0C#defineNRF24L01_RX_ADDR_P30x0D#defineNRF24L01_RX_ADDR_P40x0E#defineNRF24L01_RX_ADDR_P50x0F#defineNRF24L01_TX_ADDR0x10#defineNRF24L01_RX_PW_P00x11#defineNRF24L01_RX_PW_P10x12#defineNRF24L01_RX_PW_P20x13#defineNRF24L01_RX_PW_P30x14#defineNRF24L01_RX_PW_P40x15#defineNRF24L01_RX_PW_P50x16#defineNRF24L01_FIFO_STATUS0x17#defineNRF24L01_TX_ADR_WIDTH5 #defineNRF24L01_RX_ADR_WIDTH5 #defineNRF24L01_TX_PLOAD_WIDTH20 #defineNRF24L01_RX_PLOAD_WIDTH20 externunsignedcharNRF24L01_SPI_RW(unsignedcharbyte);externunsignedcharNRF24L01_SPI_Read(unsignedcharreg);externunsignedcharNRF24L01_SPI_RW_Reg(unsignedcharreg,unsignedcharvalue);externunsignedcharNRF24L01_SPI_Write_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars);//externunsignedcharNRF24L01_SPI_Read_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars);//externvoidSetRX_Mode();//externunsignedcharNRF24L01_RxPacket(unsignedchar*rx_buf);externvoidNRF24L01_TxPacket(unsignedchar*tx_buf);externvoidNRF24L01_Init();externunsignedcharNRF24L01_TX_Buffer[3];externunsignedcharNRF24L01_RX_Buffer[3];externunsignedcharbdataSTA;#endif2.2.4、NRF24L01.c#include"NRF24L01.h"#include<intrins.h>unsignedcharNRF24L01_TX_Buffer[32];unsignedcharNRF24L01_RX_Buffer[32];unsignedcharconstNRF24L01_TX_ADDRESS[NRF24L01_TX_ADR_WIDTH]={0xCF,0xCF,0xCF,0xCF,0xCF};unsignedcharconstNRF24L01_RX_ADDRESS[NRF24L01_RX_ADR_WIDTH]={0x37,0x43,0x10,0x10,0xFF}; unsignedcharconstNRF24L01_RX1_ADDRESS[NRF24L01_RX_ADR_WIDTH]={0x35,0x43,0x10,0x10,0x03};unsignedcharconstNRF24L01_RX2_ADDRESS[1]={0x36};unsignedcharconstNRF24L01_RX3_ADDRESS[1]={0x34};unsignedcharconstNRF24L01_RX4_ADDRESS[1]={0x38};unsignedcharconstNRF24L01_RX5_ADDRESS[1]={0x39};unsignedcharbdataSTA;sbitSTAbits_RX_DR =STA^6;sbitSTAbits_TX_DS =STA^5;sbitSTAbits_MAX_RT =STA^4;unsignedcharNRF24L01_SPI_RW(unsignedcharbyte){ unsignedchari; for(i=0;i<8;i++) { NRF24L01_MOSI=(byte&0x80); _nop_(); byte<<=1; NRF24L01_SCK=1; _nop_(); byte|=NRF24L01_MISO; //capturecurrentMISObit _nop_(); NRF24L01_SCK=0; _nop_(); }return(byte); }unsignedcharNRF24L01_SPI_Read(unsignedcharreg){ unsignedcharreg_val; NRF24L01_CSN=0; _nop_(); NRF24L01_SPI_RW(reg); reg_val=NRF24L01_SPI_RW(0); NRF24L01_CSN=1; _nop_(); return(reg_val); }unsignedcharNRF24L01_SPI_RW_Reg(unsignedcharreg,unsignedcharvalue){ unsignedcharstatus; NRF24L01_CSN=0; _nop_(); status=NRF24L01_SPI_RW(reg); NRF24L01_SPI_RW(value); NRF24L01_CSN=1; _nop_(); return(status);}unsignedcharNRF24L01_SPI_Read_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars){ unsignedcharstatus,i; NRF24L01_CSN=0; _nop_(); status=NRF24L01_SPI_RW(reg); for(i=0;i<uchars;i++) pBuf[i]=NRF24L01_SPI_RW(0); NRF24L01_CSN=1; _nop_(); return(status);}unsignedcharNRF24L01_SPI_Write_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars){ unsignedcharstatus,i; NRF24L01_CSN=0; _nop_(); status=NRF24L01_SPI_RW(reg); for(i=0;i<uchars;i++) NRF24L01_SPI_RW(*pBuf++); NRF24L01_CSN=1; _nop_(); return(status);}unsignedcharNRF24L01_RxPacket(unsignedchar*rx_buf){ unsignedcharrevale=0,i=130; NRF24L01_CE=0; _nop_(); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_CONFIG,0x0f); NRF24L01_CE=1; while(i--); STA=NRF24L01_SPI_Read(NRF24L01_STATUS); if(STAbits_RX_DR) { NRF24L01_CE=0; NRF24L01_SPI_Read_Buf(NRF24L01_RD_RX_PLOAD,rx_buf,NRF24L01_RX_PLOAD_WIDTH);//readreceivepayloadfromRX_FIFObuffer revale=1; } NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_STATUS,STA); returnrevale;} voidNRF24L01_Init(){unsignedchari=100; while(i--); NRF24L01_CE=0; NRF24L01_CSN=1; NRF24L01_SCK=0; NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_TX_ADDR,NRF24L01_TX_ADDRESS,NRF24L01_TX_ADR_WIDTH); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P0,NRF24L01_RX_ADDRESS,NRF24L01_RX_ADR_WIDTH); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P1,NRF24L01_RX_ADDRESS,NRF24L01_RX_ADR_WIDTH); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P2,NRF24L01_RX_ADDRESS,1); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P3,NRF24L01_RX_ADDRESS,1); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P4,NRF24L01_RX_ADDRESS,1); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P5,NRF24L01_RX_ADDRESS,1); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_EN_AA,0x3f); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_EN_RXADDR,0x3f); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RF_CH,0); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P0,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P1,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P2,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P3,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P4,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P5,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RF_SETUP,0x07); NRF24L01_CE=1;}2.2.5、main.h#ifndef__MAIN_H__#define__MAIN_H__#include<reg52.h>sbitLED1=P1^0;sbitLED2=P1^1;#defineLED_ON0#defineLED_OFF1sbitKEY1=P3^4;sbitKEY2=P3^5;sbitKEY3=P3^6;sbitKEY4=P3^7;sbitBuzzer=P1^2;externvoidDelay_ms(unsignedintn);externvoidScan_Key();externvoidBuzzer_Di();#endif2.2.6、main.c#include"main.h"#include"LCD1602.h"#include"NRF24L01.h"intTemp_Buffer=0;unsignedcharflag_temper=0;unsignedcharKEY_NUM=0;uns

温馨提示

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

最新文档

评论

0/150

提交评论