版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于DHT11传感器和Nrf24L01模块的多点温湿度采集系一、设计背景农业大棚种植具有大范围,温湿度要求高的特点。温度,湿度严重影响农作物的生长与产量,所以,对其的测量出其重要。基于这样的考虑,设计了该套多点温湿度采集无线传输系统。二、系统构成该系统由89C52RC单片机、DHT11温湿度传感器、Nrf24L01无线传输模块构成。具有多点温湿度采集、汇总的特点(本实验采用两个点采集汇总一点完成)2、接受点三、硬件设计1、DHT11传感器简介DHT11产品概述DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。1)传感器性能说明参数条件MinTypMax单位湿度分辨率111%RH8Bit重复性±1%RH精度25°C±4%RH0-50°C土5%RH互换性可完全互换量程范围0C3090%RH25C2090%RH50C2080%RH响应时间l/e(63%)25C,1m/s空气61015S迟滞±1%RH长期稳定性典型值±1%RH/yr温度分辨率111OC888Bit重复性±1C精度±1±2C量程范围050C响应时间1/e(63%)630S(2)接口说明建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻
MCUMCU典型应用电路(3)电源引脚DHTl1的供电电压为3—5.5V。传感器上电后,要等待Is以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。(4)串行接口(单线双向)DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据•从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。图1总线空闲状态为高电平,主机把总线拉低等待图1总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。GND图2主机拉商单幕找主机至裁GND图2主机拉商单幕找主机至裁低|际严一—j80us信号罐说瞬:主机俏■号IHB'倚号总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1•格式见下面图示•如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。图5测量分辨率测量分辨率分别为8bit(温度)、8bit(湿度)。电气特性VDD=5V,T=25°C,除非特殊标注参数条件mintypmax单位供电DC355.5V供电电流测量0.52.5mA平均0.21mA待机100150uA采样周期秒1次注:采样周期间隔不得低于1秒钟。应用信息工作与贮存条件超出建议的工作范围可能导致高达3%RH的临时性漂移信号。返回正常工作条后,传感器会缓慢地向校准状态恢复。要加速恢复进程/可参阅7.3小节的“恢复处理”。在非正常工作条件下长时间使用会加速产品的老化过程。暴露在化学物质中电阻式湿度传感器的感应层会受到化学蒸汽的干扰,化学物质在感应层中的扩散可能导致测量值漂移和灵敏度下降。在一个纯净的环境中,污染物质会缓慢地释放出去。下文所述的恢复处理将加速实现这一过程。高浓度的化学污染会导致传感器感应层的彻底损坏。恢复处理置于极限工作条件下或化学蒸汽中的传感器,通过如下处理程序,可使其恢复到校准时的状态。在50-60C和<10%RH的湿度条件下保持2小时(烘干);随后在20-30C和>70%RH的湿度条件下保持5小时以上。温度影响气体的相对湿度,在很大程度上依赖于温度。因此在测量湿度时,应尽可能保证湿度传感器在同一温度下工作。如果与释放热量的电子元件共用一个印刷线路板,在安装时应尽可能将DHT11远离电子元件,并安装在热源下方,同时保持外壳的良好通风。为降低热传导,DHT11与印刷电路板其它部分的铜镀层应尽可
能最小,并在两者之间留出一道缝隙。(7.5)光线长时间暴露在太阳光下或强烈的紫外线辐射中,会使性能降低。(7.6)配线注意事项15.5mmIDATA15.5mmIDATA信号线材质量会影响通讯距离和通讯质量,推荐使用高质量屏蔽线。8)封装信息(9)DHT11引脚说明Pin名称注释1VDD供电3—5.5VDC2DATA串行数据,单总线3NC空脚,请悬空4GND接地,电源负极10)焊接信息手动焊接,在最高260r的温度条件下接触时间须少于10秒。(11)注意事项(1)避免结露情况下使用。⑵长期保存条件:温度10—40r,湿度60%以下。2、nRF24L01模块简介(1)nRF24L01芯片简介功能描述:真正的GFSK单片式收发芯片内置硬件链路层增强型ShockBurstTM功能
自动应答及自动重发功能地址及CRC检验功能无线速率:1或2MbpsSPI接口速率:0~8Mbps125个可选工作频道很短的频道切换时间,可用于跳频与nRF24XX系列完全兼容I/O可接受5V电平的输入20脚QFN4X4mm封装极低成本晶振土60ppm使用低成本电感和双面PCB板低工作电压:1.9~3.6V概述:nRF24L01是一款工作在2.4~2.5GHz世界通用ISM频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型SchockBurstTM模式控制器、功率放大器、晶体振荡器、调制器、解调器。输出功率、频道选择和协议的设置可以通过SPI接口进行设置。极低的电流消耗:当工作在发射模式下发射功率为-6dBm时电流消耗为9mA,接收模式时为12.3mA。掉电模式和待机模式下电流消耗更低。结构框图:VSS匹IRQ■—CSN•—SCK•—MISO•—MOSI・—DUMODGFSKFilterafciqaA2gT
VSS匹IRQ■—CSN•—SCK•—MISO•—MOSI・—DUMODGFSKFilterafciqaA2gT
do可>on^>on^A暑日Y匚nhancedShockBurst™ClockRecovery.DataSlicer-ADDR_DecodeCRCCode/DecodeRFOIn/Outzldm丄FrequencySynthesiserXC1—•XC2—■-Illi'―■VDD_PA=1.8VANT1・100+J175QANT2■22kf>引脚及其功能:引脚名称引脚功能描述1CE数字输入RX或TX模式选择2CSN数字输入SPI片选信号3SCK数字输入SPI时钟4MOSI数字输入从SPI数据输入脚5MISO数字输出从;SPI数据输山脚6IRQ数字输出可屏蔽中断脚7VDD电源电源狎)8VSS电源接地(0V)9XC2模拟输出晶体震荡器2脚10XC1模拟输入晶体震荡器1脚/外部吋钟输入脚11VDDPA电源输出给RF的功率放大器提供的-1.8V电源12ANTI天线天线接1丨113ANT2天线天线接口214VSS电源接地(0V)15VDD电源电源(+3V)16IREF模拟输入参考电流17VSS电源接地(0V)18VDD电源电源(+弓V)19DVDD电源输出去耦电路电源正极端20VSS电源接地(0V)I20]1917IX1621413127891()6IRQ<SNMr^lMISO\nnAM2AM[IX[>I)_PA图2、引脚封装l)\1)[)\l)l>vpnvssxc2nRF24L01QFN204x4电气特性:条件:VDD=+3V,VSS=0V,TA=—40°C至l」+85°C符号拚救(黑件)«4<典型價最大值单也提柞条杵VDD电源1.93.03.6V温度工柞温度-40+27+85£数字的入脚Vof-;高电平输出电东CTQTmA)VDD-0.3VDDVVol高电平输出电压「丘二司予皿)VSS0.3V常用射频*件工柞旗率24002525MHzfer.iL晶振频率16MHz沁频]^@1000Lbps1-160kHz△尿频移@2口血贏4-320kHzRgtskShockBiusr模式下数携忆2000KbpsFchannel频道间1000kbps1MHz^CHANNEL频道:Hisn^aoookbpE.2MHz发射撫柞Frt摄大输出功率0+4dBmPane射疑功率控制范闹16182DdBPhfcei射旗电掠±4dBPkw址披调制刖IDdB帝曲13002000kHz?KJ]第一邻近通道垸射功率2MHz-20dBm?KJ2第二邻近通道发射功率4MHz-50dBm输出功率-ISdBmF电肺11.3mA输出功率-ISdBm卜电流7.0mA.45dBm输出功率ShockBmt模式~b滔流005mA.Ivnn特机状态下电淒32uAIvnn掉电状态下电施900dA播收撫作2000kbps数据棲输率下,单通道工作电流123mA.Ivdd1000kbps薮据楕输卓下,单通道工作电流11.8mA.RXsens在0.1MRE(@2O(H)kbp&)下的灵曲度-82dBmRXsens在0.1^HRE(^l{HH)kbp&)'h'的灵甜度85dBm芸4.nRF7dT.01L极限范围:VDD.+3.6VVSS0V输入电压VI-0.3V~5.25V输出电压VOVSS~VDD总功耗PD(TA=85°C)60mW温度工作温度-40C~+85C存储器温度-40C~+125C注意:强行超过一项或多项极限值使用将导致器件永久性损坏术语表:
术證描述ACK确认信号f应答信号)ART自动莹发CE芯片辿能CLK时钟信号CRCit环兀余校脸CSN片选非ESBSbockBrust™GFSK高斯槌控频移IRQ中断诂求ISM工业一科学一医学.LNA低”放大LSB撬低有效橙LSByte損低有效字节Mbps兆釧秒MCXT微控制器MISO主机输入从机输岀MOSI主机输出从机输入MSB扱高有效也MSByte播高有效字节PCB印刷电路板PER薮据包误码率PID龜据包识别傥FLD裁波PRX接收源MX发射源PWRDWN掉电PWRJJP上电RX接收RXDR接枚数据准备就绪SPI串行可編程接口IX发送txds己发送數据忠乳术语表功能描述工作模式nRF24L01可以设置为以下几种主要模式模式PWRUPPRIMRXCEFIFO寄存器状态接收模式111发送模式101数据在TXFIFO寄存器中发送模式101*0停留在发送模式.靑至数据发送完待机模式II101TXFIFO为宇待机模式I10无数据传输掉电模式0-表6、11RF24L01土妾二作模式nRF24L01在不同模式下的引脚功能引脚名称方向发送模式接收模式待机模式掉电模式CE输入高电平>10us高电平低电乎-CSN输入SPI片选使能,低电平使能SCK输入SPI时钟MOSI输入SPI串行输入MISO〔态输出SPI串行输出IRQ输出中断,低电平使能表7,I1RF24L01引脚功能待机模式:待机模式I在保证快速启动的同时减少系统平均消耗电流。在待机模式I下,晶振正常工作。在待机模式II下部分时钟缓冲器处在工作模式。当发送端TXFIFO寄存器为空并且CE为高电平时进入待机模式II。在待机模式期间,寄存器配置字内容保持不变。掉电模式:在掉电模式下,nRF24L01各功能关闭,保持电流消耗最小。进入掉电模式后,nRF24L01停止工作,但寄存器内容保持不变。启动时间见表格13。掉电模式由寄存器中PWR_UP位来控制数据包处理方式:nRF24L01有如下几种数据包处理方式:ShockBurstTM(与nRF2401,nRF24E1,nRF2402,nRF24E2数据传输率为1Mbps时相同)增强型ShockBurstTM模式ShockBurstTM模式:ShockBurst模式下nRF24L01可以与成本较低的低速MCU相连。高速信号处理是由芯片内部的射频协议处理的,nRF24L01提供SPI接口,数据率取决于单片机本身接口速度。ShockBurst模式通过允许与单片机低速通信而无线部分高速通信,减小了通信的平均消耗电流。在ShockBurstTM接收模式下,当接收到有效的地址和数据时IRQ通知MCU,随后MCU可将接收到的数据从RXFIFO寄存器中读出。在ShockBurstTM发送模式下,nRF24L01自动生成前导码及CRC校验,参见表格12。数据发送完毕后IRQ通知MCU。减少了MCU的查询时间,也就意味着减少了MCU的工作量同时减少了软件的开发时间。nRF24L01内部有三个不同的RXFIFO寄存器(6个通道共享此寄存器)和三个不同的TXFIFO寄存器。在掉电模式下、待机模式下和数据传输的过程中MCU可以随时访问FIFO寄存器。这就允许SPI接口可以以低速进行数据传送,并且可以应用于MCU硬件上没有SPI接口的情况下。增强型的ShockBurstTM模式:增强型ShockBurstTM模式可以使得双向链接协议执行起来更为容易、有效。典型的双向链接为:发送方要求终端设备在接收到数据后有应答信号,以便于发送方检测有无数据丢失。一旦数据丢失,则通过重新发送功能将丢失的数据恢复。增强型的ShockBurstTM模式可以同时控制应答及重发功能而无需增加MCU工作量。
TX3TX4TX2TX5TX1TX6RX图4.TX3TX4TX2TX5TX1TX6RX图4.11RF24L01在星形网络中的结构图FrequencyChannelNnRF24L01在接收模式下可以接收6路不同通道的数据,见图4。每一个数据通道使用不同的地址,但是共用相同的频道。也就是说6个不同的nRF24L01设置为发送模式后可以与同一个设置为接收模式的nRF24L01进行通讯,而设置为接收模式的nRF24L01可以对这6个发射端进行识别。数据通道0是唯一的一个可以配置为40位自身地址的数据通道。1~5数据通道都为8位自身地址和32位公用地址。所有的数据通道都可以设置为增强型ShockBurst模式。nRF24L01在确认收到数据后记录地址,并以此地址为目标地址发送应答信号。在发送端,数据通道0被用做接收应答信号,因此,数据通道0的接收地址要与发送端地址相等以确保接收到正确的应答信号。见图5选择地址举例。
FrequencyChannelN覚亿FrequencyChannelN覚亿应答地址确定举例nRF24L01配置为增强型的ShockBurstTM发送模式下时,只要MCU有数据要发送,nRF24L01就会启动ShockBurstTM模式来发送数据。在发送完数据后nRF24L01转到接收模式并等待终端的应答信号。如果没有收到应答信号,nRF24L01将重发相同的数据包,直到收到应答信号或重发次数超过SETUP_RETR_ARC寄存器中设置的值为止,如果重发次数超过了设定值,则产生MAX_RT中断。只要收到确认信号,nRF24L01就认为最后一包数据已经发送成功(接收方已经收到数据),把TXFIFO中的数据清除掉并产生TX_DS中断(IRQ引脚置高)。在增强型ShockBurstTM模式下,nRF24L01有如下的特征:当工作在应答模式时,快速的空中传输及启动时间,极大的降低了电流消耗。低成本。nRF24L01集成了所有高速链路层操作,比如:重发丢失数据包和产生应答信号。无需单片机硬件上一定有SPI口与其相连。SPI接口可以利用单片机通用I/O口进行模拟由于空中传输时间很短,极大的降低了无线传输中的碰撞现象由于链路层完全集成在芯片上,非常便于软硬件的开发。增强型ShockBurstTM发送模式:1、配置寄存器位PRIM_RX为低2、当MCU有数据要发送时,接收节点地址(TX_ADDR)和有效数据(TX_PLD)通过SPI接口写入nRF24L01。发送数据的长度以字节计数从MCU写入TXFIFO。当CSN为低时数据被不断的写入。发送端发送完数据后,将通道0设置为接收模式来接收应答信号,其接收地址(RX_ADDR_PO)与接收端地址(TX_ADDR)相同。例:在图5中数据通道5的发送端(TX5)及接收端(RX)地址设置如下:TX5:TX_ADDR=0xB3B4B5B605TX5:RX_ADDR_P0=0xB3B4B5B605RX:RX_ADDR_P5=0xB3B4B5B6053、设置CE为高,启动发射。CE高电平持续时间最小为10us。4、nRF24L01ShockBurstTM模式:无线系统上电启动内部16MHz时钟无线发送数据打包(见数据包描述)高速发送数据(由MCU设定为1Mbps或2Mbps)5、如果启动了自动应答模式(自动重发计数器不等于0,ENAA_P0=1),无线芯片立即进入接收模式。如果在有效应答时间范围内收到应答信号,则认为数据成功发送到了接收端,此时状态寄存器的TX_DS位置高并把数据从TXFIFO中清除掉。如果在设定时间范围内没有接收到应答信号,则重新发送数据。如果自动重发计数器(ARC_CNT)溢出(超过了编程设定的值),则状态寄存器的MAX_RT位置高。不清除TXFIFO中的数据。当MAX_RT或TX_DS为高电平时IRQ引脚产生中断。IRQ中断通过写状态寄存器来复位(见中断章节)。如果重发次数在达到设定的最大重发次数时还没有收到应答信号的话,在MAX_RX中断清除之前不会重发数据包。数据包丢失计数器(PLOS_CNT)在每次产生MAX_RT中断后加一。也就是说:重发计数器ARC_CNT计算重发数据包次数,PLOS_CNT计算在达到最大允许重发次数时仍没有发送成功的数据包个数。6、如果CE置低,则系统进入待机模式I。如果不设置CE为低,则系统会发送TXFIFO寄存器中下一包数据。如果TXFIFO寄存器为空并且CE为高则系统进入待机模式II.发送端发送完数据后,将通道0设置为接收模式来接收应答信号,其接收地址(RX_ADDR_P0)与接收端地址(TX_ADDR)相同。例:在图5中数据通道5的发送端(TX5)及接收端(RX)地址设置如下:TX5:TX_ADDR=0xB3B4B5B605TX5:RX_ADDR_P0=0xB3B4B5B605RX:RX_ADDR_P5=0xB3B4B5B605增强型ShockBurstTM接受模式:1、ShockBurstTM接受模式是通过设置寄存器中PRIM_RX位为高来选择的。准备接收数据的通道必须被使能(EN_RXADDR寄存器),所有工作在增强型ShockBurstTM模式下的数据通道的自动应答功能是由(EN_AA寄存器)来使能的,有效数据宽度是由RX_PW_Px寄存器来设置的。地址的建立过程见增强型ShockBurstTM发送章节。2、接收模式由设置CE为高来启动。3、130us后nRF24L01开始检测空中信息。4、接收到有效的数据包后(地址匹配、CRC检验正确),数据存储在RX_FIFO中,同时RX_DR位置高,并产生中断。状态寄存器中RX_P_NO位显示数据是由哪个通道接收到的。5、如果使能自动确认信号,则发送确认信号。6、MCU设置CE脚为低,进入待机模式I(低功耗模式)。7、MCU将数据以合适的速率通过SPI口将数据读出。8、芯片准备好进入发送模式、接收模式或掉电模式两种数据双方向的通讯方式如果想要数据在双方向上通讯,PRIM_RX寄存器必须紧随芯片工作模式的变化而变化。处理器必须保证PTX和PRX端的同步性。在RX_FIFO和TX_FIFO寄存器中可能同时存有数据。自动应答(RX):自动应答功能减少了外部MCU的工作量,并且在鼠标/键盘等应用中也可以不要求硬件一定有SPI接口,因此降低成本减少电流消耗。自动重应答功能可以通过SPI口对不同的数据通道分别进行配置。在自动应答模式使能的情况下,收到有效的数据包后,系统将进入发送模式并发送确认信号。发送完确认信号后,系统进入正常工作模式(工作模式由PRIM_RX位和CE引脚决定)。自动重发功能(ART)(TX):自动重发功能是针对自动应答系统的发送方。SETUP_RETR寄存器设置:启动重发数据的时间长度。在每次发送结束后系统都会进入接收模式并在设定的时间范围内等待应答信号。接收到应答信号后,系统转入正常发送模式。如果TXFIFO中没有待发送的数据且CE脚电平为低,则系统将进入待机模式I。如果没有收到确认信号,则系统返回到发送模式并重发数据直到收到确认信号或重发次数超过设定值(达到最大的重发次数)。有新的数据发送或PRIM_RX寄存器配置改变时丢包计数器复位。数据包识别和CRC校验应用于增强型ShockBurstTM模式下:每一包数据都包括两位的PID(数据包识别)来识别接收的数据是新数据包还是重发的数据包。PID识别可以防止接收端同一数据包多次送入MCU。在发送方每从MCU取得一包新数据后PID值加一。PID和CRC校验应用在接收方识别接收的数据是重发的数据包还是新数据包。如果在链接中有一些数据丢失了,贝0PID值与上一包数据的PID值相同。如果一包数据拥有与上一包数据相同的PID值,nRF24L01将对两包数据的CRC值进行比较。如果CRC值也相同的话就认为后面一包是前一包的重发数据包而被舍弃。1:接收方:接收方对新接收数据包的PID值与上一包进行比较。如果PID值不同,则认为接收的数据包是新数据包。如果PID值与上一包相同,则新接收的数据包有可能与前一包相同。接收方必须确认CRC值是否相等,如果CRC值与前一包数据的CRC值相等,则认为是同一包数据并将其舍弃。2:发送方:每发送一包新的数据则发送方的PID值加一。和CRC校验应用在接收方识别接收的数据是重发的数据包还是新数据包。如果在链接中有一些数据丢失了,贝0PID值与上一包数据的PID值相同。如果一包数据拥有与上一包数据相同的PID值,nRF24L01将对两包数据的CRC值进行比较。如果CRC值也相同的话就认为后面一包是前一
包的重发数据包而被舍弃。EndPIDequallostPID?CRC钠glHastCRC?Start图6包的重发数据包而被舍弃。EndPIDequallostPID?CRC钠glHastCRC?Start图6、PID值生成和检测IncrementPIDN色憎packetis翊dforMCUDiscardpacket«3SacopyCRC校验的长度是通过SPI接口进行配置的。一定要注意CRC计算范围包括整个数据包:地址、PID和有效数据等。若CRC校验错误则不会接收数据包,这一点是接收数据包的附加要求,在上图没有说明。载波检测一CD:当接收端检测到射频范围内的信号时将CD置高,否则CD为低。内部的CD信号在写入寄存器之前是经过滤波的,内部CD高电平状态至少保持128us以上。在增强型ShockBurstTM模式中只有当发送模块没有成功发送数据时,推荐使用CD检测功能。如果发送端PLOS_CNT显示数据包丢失率太高时,可将其设置位接收模式检测CD值,如果CD为高(说明通道出现了拥挤现象),需要更改通信频道;如果CD为低电平状态(距离超出通信范围),可保持原有通信频道,但需作其它调整。数据通道:nRF24L01配置为接收模式时可以接收6路不同地址相同频率的数据。每个数据通道拥有自己的地址并且可以通过寄存器来进行分别配置。数据通道是通过寄存器EN_RXADDR来设置的,默认状态下只有数据通道0和数据通道1是开启状态的。每一个数据通道的地址是通过寄存器RX_ADDR_Px来配置的。通常情况下不允许不同的数据通道设置完全相同的地址。数据通道0有40位可配置地址。数据通道1~5的地址为:32位共用地址+各自的地址(最低字节)。图7所示的是数据通道1~5的地址设置方法举例。所有数据通道可以设置为多达40位,但是1~5数据通道的最低位必须不同。
|Byte4|Byte3|Byte2|Byte1|Byte0|Datapipe0(rxaddrpo)Datapipe1(RXaddrpdDatapipe2(RXaddrP2)Datapipe3(RXaddrP3)Datapipe4(RXaddrP4)Datapipe5i:rxaddrP5)0xE70xD3OxFO0x350x770xE70xD3OxFO0x350x77•CRC使能/禁止•CRC计算•接收地址宽度•频道设置•无线数据通信速率•LNA增益•射频输出功率寄存器配置:nRF24L01所有配置都在配置寄存器中,所有寄存器都是通过SPI口进行配置的。SPI接口:SPI接口是标准的SPI接口,其最大的数据传输率为10Mbps。大多数寄存器是可读的。SPI指令设置:SPI接口可能用到的指令在下面有所说明。CSN为低后SPI接口等待执行指令。每一条指令的执行都必须通过一次CSN由高到低的变化。SPI指令格式:<命令字:由高位到低位(每字节)><数据字节:低字节到高字节,每一字节高位在前>参看图8及图9指令名称指令格式操作RREGISTER000AAAAA读配置寄存器。AAAAA指出读操作的寄存器地址WREGISTER001AAAAA写配置寄存器。AAAAA指出写操作的寄存器地址只有在掉电模式和待机模式下可操作。RRXRAYLOAD01100001读RX有效数据:1-32字节。读操作全部从字节0开始。当读RX有效数据完成后,FIFO寄存器中有效数据被清除。应用于接收模式下。WRXPAYL_OAD10100000写TX有效数据:1-32字节。写操作从字节0开始。应用于发射模式下FLUSHTX11100001清除TXFIFO寄存器,应用于发射模式下。FLUSH_RX11100010清除RXFIFO寄存器,应用于接收模式下。在传输应答信号过程中不应执行此指令。也就是说,若传输应答信号过程中执行此指令的话将使得应答信号不能被完整的传输。REUSETXP11100011重新使用上一包有效数据。当CE为高过程中,数据包被不断的重新发射。在发射数据包过程中必须禁止数据包重利用功能。NOPmimi空操作。可以用来读状态寄存器。图8、11RF24L01SPI串行口指令设置R_REGISTER和W_REGISTER寄存器可能操作单字节或多字节寄存器。当访问多字节寄存器时首先要读/写的是最低字节的高位。在所有多字节寄存器被写完之前可以结束写SPI操作,在这种情况下没有写完的高字节保持原有内容不变。例如:RX_ADDR_PO寄存器的最低字节可以通过写一个字节给寄存器RX_ADDR_PO来改变。在CSN状态由高变低后可以通过MISO来读取状态寄存器的内容。中断:nRF24L01的中断引脚(IRQ)为低电平触发,当状态寄存器中TX_DS、RX_DR或MAX_RT为高时触发中断。当MCU给中断源写'1'时,中断引脚被禁止。可屏蔽中断可以被IRQ中断屏蔽。通过设置可屏蔽中断位为高,则中断响应被禁止。默认状态下所有的中断源是被禁止的。SPI时序:图8、9、10和表9、10给出了SPI操作及时序。在写寄存器之前一定要进入待机模式或掉电模式。在图8至图10中用到了下面的符号:Cn-SPI指令位Sn-状态寄存器位Dn-数据位(备注:由低字节到高字节,每个字节中高位在前)与nRF24XX兼容的寄存器配置:如何建立nRF24L01从nRF2401/nRF2402/nRF24E1/nRF24E2接收数据:使用与nRF2401/nRF2402/nRF24E1/nRF24E2相同的CRC配置设置PRIM_RX位为1相应通道禁止自动应答功能与发射模块使用相同的地址宽度与发射模块使用相同的频道在nRF24L01和nRF2401/nRF2402/nRF24E1/nRF24E2两端都选择1Mbit/s的数据传输率设置正确的数据宽度设置PWR_UP和CE为高如何建立nRF24L01发射,nRF2401/nRF2402/nRF24E1/nRF24E2接收数据:使用与nRF2401/nRF2402/nRF24E1/nRF24E2相同的CRC配置设置PRIM_RX位为0设置自动重发计数器为0禁止自动重发功能与nRF2401/nRF2402/nRF24El/nRF24E2使用相同的地址宽度与nRF2401/nRF2402/nRF24E1/nRF24E2使用相同的频道在nRF24L01和nRF2401/nRF2402/nRF24E1/nRF24E2两端都选择1Mbit/s的数据传输率设置PWR_UP为高发送与nRF2401/nRF2402/nRF24E1/nRF24E2寄存器配置数据宽度相同的数据长度。设置CE为高启动发射打包格式描述:增强型ShockBurstTM模式下的数据包形式。前导码地址(3-5字节)9位(标志位)数据(1-32字节)CRC校验(0/1/2字节)ShockBurst1^1模式-F与nRF2401/I1RF2402/nRF24El/I1RF24E2相兼容的数据包形式前导码地址(3—5字节)数据(1-32字节)CRC校验(0/1/2字节)前导码•前导码用来检测0和1。芯片在接收模式下去除前导码,在发送模式下加入前导码。地址地址内容为接收机地址地址宽度可以是3、4或5字节宽度地址可以对接收通道及发送通道分别进行配置从接收的数据包中自动去除地址。标志位PID:数据包识别。其中两位:是用来每当接收到新的数据包后加一七位保留,用作将来与其它产品相兼容当nRF24L01与11RF2401/nRF24El通讯时不起作用°数据•1-32字节宽度CRCCRC校验是可选的0—2字节宽度的CRC校验8位CRC校验的多项式是:X8+X2+X+l16位CRC校验的多项式是:X16+X12+X5+l表12、数据包描述重要的时序数据下面是nRF24L01部分工作时序数据。nRF24L01时序信息nRF24L01时序最大值最小值参数名掉电模式一待机模式1.5insTpd2册y待机模式一发送/接收模式13OusTgtby2aCE高电平保持时间lOiisTheeCSN为低电平,CE上升沿的延迟时间4usTpece2csn表13、11RF24L01工作时序nRF24L01在掉电模式下转入发射模式或接收模式前必须经过1.5ms的待机模式。注意:当关掉电源VDD后寄存器配置内容丢失,模块上电后需重新进行配置。(2)nRF24L01模块简介(一)、产品特性2.4GHz全球开放ISM频段,最大OdBm发射功率,免许可证使用支持六路通道的数据接收低工作电压:1.9〜3.6V低电压工作高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率)多频点:125频点,满足多点通信和跳频通信需要超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线)低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。低应用成本:NRF24L01集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等,NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。便于开发:由于链路层完全集成在模块上,非常便于开发。自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制自动存储未收到应答信号的数据包自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程载波检测—固定频率检测内置硬件CRC检错和点对多点通信地址控制数据包传输错误计数器及载波检测功能可用于跳频设置可同时设置六路接收通道地址,可有选择性的打开接收通道标准插针Dip2.54MM间距接口,便于嵌入式应用(二)、基本电气特性参数数值单位供电电压].9〜3.6VV最大发射功率0dBm最大数据传输率2000kbps发射模式下,电流消耗(OdBm)11.3mA接收模式下电流消耗(2000kbps)12.3mA温度范围■40〜+85°C数据传输率为1000kbps下的灵敏度-85dBm掉电模式下电流消耗900nA表2・1基本电气特性三)、引脚说明
HQ3HQ3说明:1)VCC脚接电压范围为1.9V~3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。推荐电压3.3V左右。2)除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。当然对3V左右的单片机更加适用了。3)硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以了(a:与51系列单片机P0口连接时候,需要加10K的上拉电阻,与其余口连接不需要。b:其他系列的单片机,如果是5V的,请参考该系列单片机10口输出电流大小,如果超过10mA,需要串联电阻分压,否则容易烧毁模块!如果是3.3V的,可以直接和RF24lO1模块的IO口线连接。比如AVR系列单片机如果是5V的,一般串接2K的电阻)3、单片机89C52RC
四、软件设计api.h文件(采集点1、2,接收点共用)#ifndef_API_DEF_#define_API_DEF_//DefineinterfacetonRF24L01//DefineSPIpinssbitCE=P1A0;//ChipEnablepinsignal(output)sbitCSN=P1A1;//SlaveSelectpin,(outputtoCSN,nRF24L01)sbitIRQ=P1A5;//Interruptsignal,fromnRF24L01(input)sbitMISO=P1A4;//MasterIn,SlaveOutpin(input)sbitMOSI=P1A3;//SerialClockpin,(output)sbitSCK=P1A2;//MasterOut,SlaveInpin(output)//SPI(nRF24L01)commands#defineREAD_REG0x00#defineWRITE_REG0x20#defineRD_RX_PLOAD0x61//Definereadcommandtoregister//Definewritecommandtoregister//DefineRXpayloadregisteraddress#defineWR_TX_PLOAD0xA0//DefineTXpayloadregisteraddress//Definereadcommandtoregister//Definewritecommandtoregister//DefineRXpayloadregisteraddress#defineWR_TX_PLOAD0xA0#defineFLUSH_TX#defineFLUSH_RX#defineNOP0xE1//DefineflushTXregistercommand#defineFLUSH_TX#defineFLUSH_RX#defineNOP0xE2//DefineflushRXregistercommand#defineREUSE_TX_PL0xE3//DefinereuseTXpayloadregistercommand#defineREUSE_TX_PL0xE3#defineCONFIG#defineOBSERVE_TX#defineCD#defineRX_ADDR_P0#defineRX_ADDR_P1#defineRX_ADDR_P2#defineRX_ADDR_P3#defineRX_ADDR_P4#defineCONFIG#defineOBSERVE_TX#defineCD#defineRX_ADDR_P0#defineRX_ADDR_P1#defineRX_ADDR_P2#defineRX_ADDR_P3#defineRX_ADDR_P4#defineEN_AA0x01#defineEN_RXADDR0x02#defineEN_AA0x01#defineEN_RXADDR0x02#defineSETUP_AW0x03#defineSETUP_RETR0x04#defineRF_CH0x05#defineRF_SETUP0x06#defineSTATUS0x07//'EnabledRXaddresses'registeraddress//'Setupaddresswidth'registeraddress//'SetupAuto.Retrans'registeraddress//'RFchannel'registeraddress//'RFsetup'registeraddress//'Status'registeraddress0x08//'ObserveTX'registeraddress0x09//'CarrierDetect'registeraddress0x0A//'RXaddresspipe0'registeraddress0x0B//'RXaddresspipe1'registeraddress0x0C//'RXaddresspipe2'registeraddress0x0D//'RXaddresspipe3'registeraddress0x0E//'RXaddresspipe4'registeraddress
#defineRX_ADDR_P50x0F#defineTX_ADDR0x10#defineRX_PW_P00x11#defineRX_PW_P10x12#defineRX_PW_P20x13#defineRX_PW_P30x14#defineRX_PW_P40x15#defineRX_PW_P50x16//'RXaddresspipe5'registeraddress//'TXaddress'registeraddress//'RXpayloadwidth,pipe0'registeraddress//'RXpayloadwidth,pipe1'registeraddress//'RXpayloadwidth,pipe2'registeraddress//'RXpayloadwidth,pipe3'registeraddress//'RXpayloadwidth,pipe4'registeraddress//'RXpayloadwidth,pipe5'registeraddress#defineFIFO_STATUS0x17//'FIFOStatusRegister'registeraddress#endif/*_API_DEF_*/1)采集点1发送程序:#include<reg51.h>#include<intrins.h>#include<api.h>#defineucharunsignedchar#defineuintunsignedint#defineTX_ADR_WIDTH5//5字节宽度的发送/接收地址#defineTX_PLOAD_WIDTH6//数据通道有效数据宽度ucharcodeTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//定义一个静态发送地址ucharRX_BUF[TX_PLOAD_WIDTH];ucharTX_BUF[TX_PLOAD_WIDTH];ucharflag;ucharstr_1[TX_PLOAD_WIDTH]="AZainm",outdata[TX_PLOAD_WIDTH];//第一位为地址位ucharbdatasta;intcount,h;ucharU8FLAG,k;ucharU8count,U8temp;ucharU8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;ucharU8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;ucharU8comdata;uintU16temp1,U16temp2;sbitRX_DR=staA6;sbitTX_DS=staA5;sbitMAX_RT=staA4;
sbitP2_3=P2A3;//DHT11信号函数:init_io()描述:初始化IOvoidinit_io(void)CE=0;CE=0;CSN=1;SCK=0;IRQ=1;//待机//SPI禁止//SPI时钟置低//中断复位函数:init_ser()描述:初始化串口voidinit_ser(){TMOD=0x20;TH1=253;TL1=253;TR1=1;SCON=0x50;ES=1;EA=1;TI=0;RI=0;}函数:delay_ms()//定时器T1使用工作方式2//设置初值//开始计时//工作方式1,波特率9600bps,允许接收//打开所以中断描述:延迟x毫秒voiddelay_ms(ucharx){uchari,j;i=0;
for(i=0;i<x;i++){j=250;while(--j);j=250;while(--j);函数:SPI_RW()描述:根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节ucharSPI_RW(ucharbyte){uchari;for(i=0;i<8;i++){MOSI=(byte&0x80);byte<<=1;SCK=1;同时从ucharSPI_RW(ucharbyte){uchari;for(i=0;i<8;i++){MOSI=(byte&0x80);byte<<=1;SCK=1;同时从MISO输出1位数据byte|=MISO;SCK=0;}return(byte);}//循环8次//byte最高位输出到MOSI//低一位移位到最高位//拉高SCK,nRF24L01从MOSI读入1位数据,//读MISO到byte最低位//SCK置低//返回读出的一字节函数:SPI_RW_Reg()描述:写数据value到reg寄存器ucharstatus;CSN=0;ucharstatus;CSN=0;status=SPI_RW(reg);//CSN置低,开始传输数据//选择寄存器,同时返回状态字
SPI_RW(value);CSN=1;SPI_RW(value);CSN=1;return(status);//CSN拉高,结束数据传输//返回状态寄存器*/函数:SPI_Read()描述:从reg寄存器读一字节*/ucharSPI_Read(ucharreg){//CSN置低,开始传输数据//CSN置低,开始传输数据//选择寄存器//然后从该寄存器读数据//CSN拉高,结束数据传输//返回寄存器数据*/CSN=0;SPI_RW(reg);reg_val=SPI_RW(0);CSN=1;return(reg_val);}函数:SPI_Read_Buf()描述:从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharbytes){//CSN置低,开始传输数据//CSN置低,开始传输数据//选择寄存器,同时返回状态字//逐个字节从nRF24L01读出//CSN拉高,结束数据传输//返回状态寄存器CSN=0;status=SPI_RW(reg);for(i=0;i<bytes;i++)pBuf[i]=SPI_RW(0);CSN=1;return(status);}*/函数:SPI_Write_Buf()//CSN置低,开始传输数据////CSN置低,开始传输数据//选择寄存器,同时返回状态字//逐个字节写入nRF24L01//CSN拉高,结束数据传输//返回状态寄存器*/描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharbytes){ucharstatus,i;CSN=0;status=SPI_RW(reg);for(i=0;i<bytes;i++)SPI_RW(pBuf[i]);CSN=1;return(status);}函数:RX_Mode()描述:这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包voidRX_Mode(void){CE=0;SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//接收设备接收通道0使用和发送设备相同的发送地址SPI_RW_Reg(WRITE_REG+EN_AA,0x01);自动应答SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);SPI_RW_Reg(WRITE_REG+RF_CH,40);0x40//使能接收通道0//使能接收通道0//选择射频通道择和发送通道相同有效数据宽度SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);1Mbps,发射功率OdBm,低噪声放大器增益SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);CRC校验,上电,接收模式//数据传输率//CRC使能,16位CE=1;收设备//拉高CE启动接SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);//接收通道0选}*/函数:TX_Mode()描述:这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数据发送结束后,发送模块自动转入接收模式等待应答信号。voidTX_Mode(uchar*BUF){CE=0;SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);写入发送地址SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);为了应答接收设备,接收通道0地址和发送地址相同SPI_Write_Buf(WR_TX_PLOAD,BUF,TX_PLOAD_WIDTH);写数据包到TXFIFOSPI_RW_Reg(WRITE_REG+EN_AA,0x01);SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//////SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x0a);250us+86us,自动重发10次SPI_RW_Reg(WRITE_REG+RF_CH,40);SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);功率OdBm,低噪声放大器增益SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);上电CE=1;}//使能接收通道0自动应答//使能接收通道0//自动重发延时等待////选择射频通道0x40数据传输率1Mbps,发射//CRC使能,16位CRC校验,函数:SendData(uchar*a)描述:串口发送数据SendData(uchara[TX_PLOAD_WIDTH]){inti;for(i=0;i<TX_PLOAD_WIDTH;i++){outdata[i]=a[i];}count=1;SBUF=outdata[0];函数:Check_ACK()描述:检查接收设备有无接收到数据包,设定没有收到应答信号是否重发ucharCheck_ACK(bitclear){while(IRQ);sta=SPI_RW(NOP);if(MAX_RT)//返回状态寄存器if(clear)//是否清除TXFIFO,没有清除在复位MAX_RT中断标志后重发SPI_RW(FLUSH_TX);SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除TX_DS或MAX_RT中断标志IRQ=1;if(TX_DS)return(0x00);elsereturn(0xff);}*/*///DHT11部分TOC\o"1-5"\h\z//////定义区//////voidDelay(uintj){uchari;for(;j>0;j--){for(i=0;i<27;i++);}}voidDelay_10us(void){uchari;i--;}voidCOM(void){uchari;for(i=0;i<8;i++){U8FLAG=2;while((!P2_3)&&U8FLAG++);Delay_10us();Delay_10us();Delay_10us();U8temp=0;if(P2_3)U8temp=1;U8FLAG=2;while((P2_3)&&U8FLAG++);//超时则跳出for循环if(U8FLAG==1)break;//判断数据位是0还是1//如果高电平高过预定0高电平值则数据位为1U8comdata<<=1;U8comdata|=U8temp;//0}//rof}////湿度读取子程序////以下变量均为全局变量//温度高8位==U8T_data_H//温度低8位==U8T_data_L//湿度高8位==U8RH_data_H//湿度低8位==U8RH_data_L//校验8位==U8checkdata//调用相关子程序如下//Delay();,Delay_10us();,COM();//voidRH(void){//主机拉低18msP2_3=0;Delay(180);P2_3=1;//总线由上拉电阻拉高主机延时20usDelay_10us();Delay_10us();Delay_10us();Delay_10us();//主机设为输入判断从机响应信号P2_3=1;//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!P2_3)//T!{U8FLAG=2;//判断从机是否发出80us的低电平响应信号是否结束while((!P2_3)&&U8FLAG++);U8FLAG=2;//判断从机是否发出80us的高电平,如发出则进入数据接收状态while((P2_3)&&U8FLAG++);//数据接收状态COM();U8RH_data_H_temp=U8comdata;COM();U8RH_data_L_temp=U8comdata;COM();U8T_data_H_temp=U8comdata;COM();U8T_data_L_temp=U8comdata;COM();U8checkdata_temp=U8comdata;P2_3=1;//数据校验ata_L_temp);if(U8temp==U8checkdata_temp){
U8RH_data_H=U8RH_data_H_temp;U8RH_data_L=U8RH_data_L_temp;U8T_data_H=U8T_data_H_temp;U8T_data_L=U8T_data_L_temp;U8checkdata=U8checkdata_temp;}//fi}//fi函数:main()描述:
主函数delay_ms(500);*/voidmain(void){init_io();init_ser();RX_Mode();Delay(1);while(1){////调用温湿度读取子程序RH();//*/voidmain(void){init_io();init_ser();RX_Mode();Delay(1);while(1){////调用温湿度读取子程序RH();//串口显示程序//str_1[0]=0x01;str_1[1]=U8RH_data_H;//初始化IO//初始化串口//设置为接收模式//地址位str_1[2]=U8RH_data_L;str_1[3]=U8T_data_H;str_1[4]=U8T_data_L;str_1[5]=U8checkdata;//读取模块数据周期不易小于2SDelay(20000);for(h=0;h<TX_PLOAD_WIDTH;h++){TX_BUF[h]=str_1[h];}TX_Mode(TX_BUF);Check_ACK(1);delay_ms(500);RX_Mode();//数据送到缓存//把nRF24L01设置为发送模式并发送数据//等待发送完毕,清除TXFIFO//设置为接收模式SendData(TX_BUF);}*/*/函数:RISINTR()描述:中断函数*/*/voidRSINTR()interrupt4using2{if(TI==1)//发送中断{TI=0;if(count!=TX_PLOAD_WIDTH)〃发送完TX_PLOAD_WIDTH位数据{SBUF=outdata[count];count++;}}}(2)采集点2程序;#include<reg51.h>#include<intrins.h>#include<api.h>#defineucharunsignedchar#defineuintunsignedint#defineTX_ADR_WIDTH5//5字节宽度的发送/接收地址#defineTX_PLOAD_WIDTH6//数据通道有效数据宽度ucharcodeTX_ADDRESS[TX_ADR_WIDTH]={0xC2,0xC2,0xC2,0xC2,0xC2};//定义一个静态发送地址ucharRX_BUF[TX_PLOAD_WIDTH];ucharTX_BUF[TX_PLOAD_WIDTH];ucharflag;ucharstr_1[TX_PLOAD_WIDTH]="BZainm",outdata[TX_PLOAD_WIDTH];ucharbdatasta;
intcount,h;ucharU8FLAG,k;ucharU8count,U8temp;ucharU8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;ucharheckdata_temp;ucharU8comdata;uintU16temp1,U16temp2;sbitRX_DR=staA6;sbitTX_DS=staA5;sbitMAX_RT=staA4;sbitP2_3=P2A3;//DHT11信号*/函数:init_io()描述:初始化IOvoidinit_io(void)CE=0;CSN=1;CE=0;CSN=1;SCK=0;IRQ=1;//LED=0xff;//待机//SPI禁止//SPI时钟置低//中断复位//关闭指示灯函数:init_ser()描述:voidinit_ser(){TMOD=0x20;TH1=253;TL1=253;TR1=1;SCON=0x50;ES=1;EA=1;〃定时器T1使用工作方式2//设置初值//开始计时〃工作方式1,波特率9600bps,允许接收//打开所以中断初始化串口*/
TI=0;RI=0;}函数:delay_ms()描述:延迟x毫秒voiddelay_ms(ucharx){uchari,j;i=0;for(i=0;i<x;i++){j=250;while(--j);j=250;while(--j);函数:SPI_RW()描述:根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节ucharSPI_RW(ucharbyte){uchari;for(i=0;i<8;i++){MOSI=(byte&0x80);byte<<=1;SCK=1;ucharSPI_RW(ucharbyte){uchari;for(i=0;i<8;i++){MOSI=(byte&0x80);byte<<=1;SCK=1;同时从MISO输出1位数据byte|=MISO;SCK=0;}return(byte);//循环8次//byte最高位输出到MOSI//低一位移位到最高位//拉高SCK,nRF24L01从MOSI读入1位数据,//读MISO到byte最低位//SCK置低//返回读出的一字节函数:SPI_RW_Reg()描述:写数据value到reg寄存器*/CSN=0;CSN=0;status=SPI_RW(reg);SPI_RW(value);CSN=1;return(status);}ucharSPI_RW_Reg(ucharreg,ucharvalue){ucharstatus;//CSN置低,开始传输数据//选择寄存器,同时返回状态字//然后写数据到该寄存器//CSN拉高,结束数据传输//返回状态寄存器*/函数:SPI_Read()描述:从reg寄存器读一字节*/ucharSPI_Read(ucharreg){//CSN置低,开始传输数据//CSN置低,开始传输数据//选择寄存器//然后从该寄存器读数据//CSN拉高,结束数据传输//返回寄存器数据*/CSN=0;SPI_RW(reg);reg_val=SPI_RW(0);CSN=1;return(reg_val);}函数:SPI_Read_Buf()描述:从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharbytes)ucharstatus,i;CSN=0;status=SPI_RW(reg);for(i=0;i<bytes;i++)pBuf[i]=SPI_RW(0);CSN=1;return(status);}//CSN置低,开始传输数据
//选择寄存器,同时返回状态字//逐个字节从nRF24L01读出//CSN拉高,结束数据传输//返回状态寄存器函数:SPI_Write_Buf()描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharbytes){//CSN//CSN置低,开始传输数据//选择寄存器,同时返回状态字CSN=0;status=SPI_RW(reg);//逐个字节写入//逐个字节写入nRF24L01//CSN拉高,结束数据传输//返回状态寄存器CSN=1;return(status);}函数:RX_Mode()描述:这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包voidRX_Mode(void){CE=0;//使能接收通道1SPI_Write_Buf(WRITE_REG+RX_ADDR_P1,TX_ADDRESS,TX_ADR_WIDTH);//接收设备接收通道//使能接收通道1SPI_RW_Reg(WRITE_REG+EN_AA,0x02);//使能接收通道//使能接收通道1SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x02);SPI_RW_Reg(WRITE_REG+RF_CH,40);0x40//选择射频通道SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);//接收通道0选择和发送通道相同有效数据宽度SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);1Mbps,发射功率OdBm,低噪声放大器增益SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);CRC校验,上电,接收模式CE=1;收设备//数据传输率//CRC使能,16位//拉高CE启动接*/函数:TX_Mode()描述:这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数据发送结束后,发送模块自动转入接收模式等待应答信号。voidTX_Mode(uchar*BUF){CE=0;SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);写入发送地址SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);为了应答接收设备,接收通道0地址和发送地址相同SPI_Write_Buf(WR_TX_PLOAD,BUF,TX_PLOAD_WIDTH);写数据包到TXFIFOSPI_RW_Reg(WRITE_REG+EN_AA,0x01);SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//////SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x0a);250us+86us,自动重发10次SPI_RW_Reg(WRITE_REG+RF_CH,40);SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);功率OdBm,低噪声放大器增益SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);上电CE=1;}//使能接收通道1自动应答//使能接收通道1//自动重发延时等待////选择射频通道0x40数据传输率1Mbps,发射//CRC使能,16位CRC校验,函数:SendData(uchar*a)描述:串口发送数据SendData(uchara[TX_PLOAD_WIDTH]){inti;for(i=0;i<TX_PLOAD_WIDTH;i++){outdata[i]=a[i];}count=1;SBUF=outdata[0];}函数:Check_ACK()描述:检查接收设备有无接收到数据包,设定没有收到应答信号是否重发ucharCheck_ACK(bitclear){while(IRQ);sta=SPI_RW(NOP);if(MAX_RT)//返回状态寄存器if(clear)//是否清除TXFIFO,没有清除在复位MAX_RT中断标志后重发SPI_RW(FLUSH_TX);SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除TX_DS或MAX_RT中断标志IRQ=1;if(TX_DS)return(0x00);elsereturn(0xff);}*/*///DHT11部分////////定义区//////voidDelay(uintj){uchari;for(;j>0;j--){for(i=0;i<27;i++);}}voidDelay_10us(void){uchari;i--;}voidCOM(void){uchari;for(i=0;i<8;i++){U8FLAG=2;while((!P2_3)&&U8FLAG++);Delay_10us();Delay_10us();Delay_10us();U8temp=0;if(P2_3)U8temp=1;U8FLAG=2;while((P2_3)&&U8FLAG++);//超时则跳出for循环if(U8FLAG==1)break;//判断数据位是0还是1//如果高电平高过预定0高电平值则数据位为1U8comdata<<=1;U8comdata|=U8temp;//0}//rof////湿度读取子程序////以下变量均为全局变量//温度高8位==U8T_data_H//温度低8位==U8T_data_L//湿度高8位==U8RH_data_H//湿度低8位==U8RH_data_L//校验8位==U8checkdata//调用相关子程序如下//Delay();,Delay_10us();,COM();//voidRH
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论