NRF24l01一对一双向通信程序(已调通)_第1页
NRF24l01一对一双向通信程序(已调通)_第2页
NRF24l01一对一双向通信程序(已调通)_第3页
NRF24l01一对一双向通信程序(已调通)_第4页
NRF24l01一对一双向通信程序(已调通)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、以卜程序参考多个网络程序后,经调试并且己经调通,可以稍加修改即可使用经测试可实现双向通信发送方本程序实现功能:从52单片机串丨I读入数据后通过24L01发送/24L01发送#include#includetvpedefunsignedchaiuchar;tvpedefunsignedchaiuint;*2rf24loiri5(,*sbitMISOsbitMOSIsbitsbitsbitsbitSCKCECSNIRQ=P1A4;=P1A3;=P1A2;=P1AO;=P1T;=P1A5;*按键*/sbitKEY1=P3A6;/sbitKEY2=P3A7;*数码管位选*/sbit/sbit/sbit

2、/sbitled3=P2A0;led2=P2Al;ledl=P2A2;ledO=P2A3;*峰明器*/sbitBELL=P3A4;*数码管09编码*/ucharseg10=0 xC0,0 xCE0 xA4,0 xB0.0 x99.0 x92.0 x82.0 xF8,0 x80,0 x90;码yy*p24L01*#defineTX_ADR_WIDTH5#defineRX_ADR_WIDTH5/5umtsTXaddresswidth/5umtsRXaddresswidth#defineTX_PLOAD_WIDTH10/20umtsTXpayloaddefineRX_PLOAD_WIDTH10/20

3、umtsTXpayloadumtconstTX_ADDRESSTX_ADR_WIDTH=0 x34,0 x43?0 x10.Ox10.0 x01;本地地址umtconstRX_ADDRESSRX_ADR_WIDTH=0 x34.0 x43,0 x10,0 x10,0 x01;接收地址yy*yjp24L01寄存器指令*#defineREAD_REG0 x00/读寄存器指令defineEN_RXADDRdefineSETUP_AWdefineSETUP_RETRdefineRF_CHdefineRF_SETUPdefineSTATUSdefineOBSERVE.TXdefineCDdefineRX

4、_ADDR_P0defineRX_ADDR_P1defineRX_ADDR_P2defineRX_ADDR_P3defineRX_ADDR_P4defineRX_ADDR_P5defineTX_ADDR#defineRX_PW_P0#defineRX_PW.P1#defineRX_PW_P2#defineRX_PW_P3#defineRX_PW_P4#defineRX_PW_P5defineFIFO.STATUSdefineWRITE_REG0 x20/写寄存器指令defineRD_RX_PLOAD0 x61/读取接收数据指令#defineWR_TX_PLOADOxAO/写待发数据指令#def

5、ineFLUSH_TXOxEl/冲洗发送FIFO指令#defineFLUSH_RX0 xE2/冲洗接收FIFO指令#defineREUSE_TX_PL0 xE3/定义重复装载数据指令#defineNOPOxFF/保留*defineCONFIGdefineEN_AA0 x00配置收发状态,CRC校验模式以及收发状态响应方式0 x01/自动应答功能设置0 x02可用信道设置0 x03/收发地址宽度设置0 x04/自动重发功能设置0 x05/工作频率设置0 x06/发射速率、功耗功能设置0 x07/状态寄存器0 x08/发送监测功能0 x09/地址检测OxOA/频道0接收数据地址OxOB/频道1接收

6、数据地址0 x0C/频道2接收数据地址0 x0D/频道3接收数据地址OxOE/频道4接收数据地址OxOF/频道5接收数据地址0 x10/发送地址寄存器0 x11接收频道0接收数据长度0 x12/接收频道0接收数据长度0 x13接收频道0接收数据长度0 x14/接收频道0接收数据长度0 x15接收频道0接收数据长度0 x16接收频道0接收数据长度0 x17/FIFO栈入栈岀状态寄存器设置*voidDelay(unsignedmts);voidinerDelay_us(unsignedchain);voiduiit_NRF24L01(void);umtSPI_RW(umtuchai);uchaiS

7、PI_Read(uchai-reg);voidSetRX_Mode(void);uiiitSPI_RW_Reg(uchaieg.uchaivalue);umtSPI_Read_Buf(ucharreg,uchar*pBuf.uchaiuchais);uiiitSPI_Wnte_Buf(ucharreg,uchar*pEiif,ucliaiuchais);unsignedchar11RF24L0l_RxPacket(unsignedchar*rx_buf);void11RF24L0l_TxPacket(unsignedchar*tx_buf);*长延时*voidDelay(unsignedmts

8、)unsignedmti;fbr(i=O;is;i+);fbr(i=O;iO;n)_nop_();*NRF24L01初女台化*/voidinit_NRF24L01(void)clupenable/Spidisable/merDelay_us(l00);CE=0;CSN=1;SCK=0;SPI_Wnte_Ei】f(WRITE_REG+TX_ADDR,TX_ADDRESS.TX_ADR_WIDTH);写本地地址SPI_Wnte_Ei】f(WRITE_REG+RX_ADDR_P0.RX.ADDRESS,RX_ADR_WIDTH);写接收端地址SPI_RW_Reg(WRITE_REG+EN_AA,0

9、x01);频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG+EN.RXADDR,0 x01);允许接收地址只有频道0,如果需要多频道可以参考Page21SPI_RW_Reg(WRITE_REG+RF_CH,0);设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG+RF_SETUP.0 x07);设置发射速率为1MHZ,发射功率为最人值OdE严*/*函数:umtSPI_RW(umtuchar)严功能:NRF24L01的SPI

10、写时序严*/umtSPI_RW(umtuchai)uiiitbit_ctr;fbr(bit_ctr=0;bit_ctr8;bit_cti+)/output8-bit/outputCellar*.MSBtoMOSI/shiftnextbitintoMSE/SetSCKlugh./capturecurrentMISObit/.tliensetSCKlowagainMOSI=(uchar&0 x80);uchar=(uchar1);SCK=1;uchar|=MISO:SCK=0;/leturnreaducharretuin(uchai);严*/*函数:uchaiSPI_Read(uchaneg)严功

11、能:NRF24L01的SPI时序严*/uchaiSPI_Read(uchai-leg)ucharreg_val;CSN=0;SPI_RW(reg);ieg_val=SPI_RW(0);CSN=1;/CSNlow,initializeSPIcommunicationSelectregistertoreadfrom./.thenreadiegisterTalueIICSNhighterniuiateSPIconununication/leturnregistervaluerenun(reg_val);严*/*功能:NRF24L01读写寄存器函数严*/umtSPI_RW_Reg(uchaiuchai

12、value)umtstatus;CSN=0;status=SPI.RW(ieg);SPI_RW(value);/CSNlow,uiitSPItransaction/selectregister/.andwritevaluetoit.CSN=1;/CSNhighagainCSN=1;/CSNhighagainCSN=1;/CSNhighagainCSN=1;/CSNhighagainretum(status);/return11RF24L01statusuchar严*/*函数:umtSPI_Read_Buf(uchaneg,uchai*pBuuchaiuchais)/*功能:用于读数据,reg:

13、为寄存器地址,pBuf:为待读出数据地址,uchais:读出数据的个数严*/umtSPI_Read_Buf(ucharreg,uchar*pBufuchaiuchars)umtstatus,uchai_ctr;CSN=0;status=SPI_RW(reg);/SetCSNlow,initSPItranaction/Selectregistertowritetoandreadstatusucharfdr(uchai_cti-O;uchar_ctiuchais;uchai_cti+)pBuflucliai.ctr=SPI_RW(0);/CSN=1;retum(status);/return11R

14、F24L01statusuchar严*/*函数:umtSPI_Write_Buf(uchaneg,uclw*pBuf,uchaiuchais)严功能:用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchais:写入数据的个数严*/umtSPI_Wnte_Buf(ucharreg,uchar*pEiif,ucliaiuchais)umtstatus,uchai_ctr;CSN=0;/SPI使能status=SPI_RW(ieg);fbr(uchai_cti-O;uchai_ctiuchars;uchar_ctr+)/SPI_RW(*pBufW);CSN=1;关闭SPIreturn(sta

15、tus);/严*/*函数:voidSetRX_Mode(void)/*功能:数据接收配置严*/voidSetRX_Mode(void)CE=0;/IRQ收发完成中断响应,16SPI_RW_Reg(WRITE_REG+CONFIG.OxOf);位CRC,主接收CE=1;inerDelay_us(l30);严*,/*函数:unsignedchar11RF24L0l_RxPacket(unsignedchar*rx_buf)严功能:数据读取后放入rx_buf接收缓冲区中严*,unsignedchar11RF24L0l_RxPacket(unsignedchar*rx_buf)unsignedchar

16、revale=0;sta=SPI_Read(STATUS);/读取状态寄存其来判断数据接收状况if(RX_DR)/判断是否接收到数据CE=0;SPI使能SPI_Read_Euf(RD_RX_PLOADjx_biifTX_PLOAD_WIDTH);/readreceivepayloadfromRX_FIFObufferrevale=1;读取数据完成标志SPI_RW_Reg(WRITE_REG+STATUS、sta);/接收到数据后RX_DR,TX_DS.MAX_PT都置高为1,通过写1来清楚中断标志returnrevale;严*/*函数:void11RF24L0l_TxPacket(unsign

17、edchar*tx_buf)严功能:发送tx_buf中数据严*/void11RF24L0l_TxPacket(unsignedchar*tx_buf)CE=0;/StandByI模式SPI_Wnte_Eiif(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);/装载接收端地址/装载数SPI_Wnte_Euf(WR_TX_PLOAIZtx.buf,TX_PLOAD_WIDTH);据IRQ收发完成中断响应,16SPI_RW_Reg(VRITE_REG+CONFIGOxOe);位CRC,主发送CE=1;置高CE,激发数据发送inerDelay_us(10);

18、*unsignedchartf=0;unsignedcharTxBuf10=0;/unsignedcharRxBuf10=0;*voidmain(void)/%单片机串11初始化SCON=Ox50;/SCON:模式1,8-bitUART,使能接收:REN=1TMOD=0 x20;THl=0 xfd;波特率9600初值TLl=Oxfd;TR1=1;EA=1打开总中断es=m/打开串11中断%/uiiCNRF24L01();上面保留三句移到了全局变量wlule(l)11RF24L01_TxPacket(TxBuf);/TransmitTxbufferdataDelav(lOOO);/SPI_RW_

19、Reg(WRITE_REG+STArUS、Oxfi);/清零状态寄存器?*SetRX_Mode();nRF24L01_RxPacket(RxBuf);SBUF=RxBuflO;/存放到本单片机串II输出?Delay(600);/?defineTXADRWIDTH5/5umtsTXaddresswidthdefineTXADRWIDTH5/5umtsTXaddresswidthvoidUART_SER()mteniipt4/uclwTemp;/定义临时变量if(RI)RI=0;标志位清零读入缓冲区的值TxBuflO=SBUF;/把输入的save到TxBuf里/Delay(1000);/?】f(T

20、I)如呆是发送标志位,清零TI=0;defineTXADRWIDTH5/5umtsTXaddresswidthdefineTXADRWIDTH5/5umtsTXaddresswidth以卜程序参考多个网络程序后,经调试并且己经调通,口J以稍加修改即可使用本程序实现功能:24L01接收到数据后通过52单片机串II输出到电脑端查看,同时又把数据回传(发送)实现双向通信#include#includetvpedefunsignedchaiuchar;*tvpedefunsignedchaiuint;祁*NRF24L01端I定义sbitMISO=P1A4;sbitMOSI=P1A3;sbitSCK=P

21、1A2;sbitCE=P1AO;sbitCSN=P1T;sbitIRQ=P1A5;#defineRX_ADR_WIDTH5/5umtsRXaddresswidth#defineRX_ADR_WIDTH5/5umtsRXaddresswidth/20umtsTXpayload/20umtsTXpayloaddefineEN_RXADDRdefineSETUP_AWdefineSETUP_RETRdefineRF_CHdefineRF_SETUPdefineSTATUSdefineOBSERVE.TXdefineCDdefineRX_ADDR_P0defineRX_ADDR_P1defineRX_

22、ADDR_P2defineRX_ADDR_P3defineRX_ADDR_P斗defineRX_ADDR_P5defineTX_ADDR#defineRX_PW_P0#defineRX_PW.P1#defineRX_PW_P2#defineRX_PW_P3#defineRX_PW_P4#defineRX_PW_P5defineFIFO.STATUS#defineTX_PLOAD_WIDTH10#defineRX_PLOAD_WIDTH10umtconstTX_ADDRESSTX_ADR_WIDTH=0 x34,0 x43,0 x10.Ox10.0 x01;本地地址umtconstRX_ADDR

23、ESSRX_ADR_WIDTH=0 x34.0 x43.0 x10,0 x10,0 x01;接收地址/*NRF24L01寄存器指令*defineREAD_REG0 x00/读寄存器指令#defineWRITE_REG0 x20/写寄存器指令defineRD_RX_PLOAD0 x61/读取接收数据指令#defineWR_TX_PLOADOxAO/写待发数据指令#defineFLUSH_TXOxEl/冲洗发送FIFO指令#defineFLUSH_RX0 xE2/冲洗接收FIFO指令#defineREUSE_TX_PL0 xE3/定义重复装载数据指令#defineNOPOxFF/保留*define

24、CONHGdefineEN_AA0 x00配置收发状态,CRC校验模式以及收发状态响应方式0 x01/自动应答功能设置0 x02可用信道设置0 x03/收发地址宽度设置0 x04/自动重发功能设置0 x05/工作频率设置0 x06/发射速率、功耗功能设置0 x07/状态寄存器0 x08/发送监测功能0 x09/地址检测0 x0A/频道0接收数据地址0 x0B/频道1接收数据地址0 x0C/频道2接收数据地址0 x0D/频道3接收数据地址0 x0E/频道4接收数据地址OxOF/频道5接收数据地址0 x10/发送地址寄存器0 x11接收频道0接收数据长度0 x12/接收频道0接收数据长度0 x13

25、/接收频道0接收数据长度0 x14/接收频道0接收数据长度0 x15接收频道0接收数据长度0 x16接收频道0接收数据长度0 x17/FIFO栈入栈出状态寄存器设置*voidDelay(unsignedmts);voidinerDelay_us(unsignedchain);voidinit_NRF24L01(void);umtSPI_RW(umtuchai);ucharSPI_R亡ad(ucharreg);voidSetRX_Mode(void);uiiitSPI_RW_Reg(uchaiuchaivalue);umtSPI_Read_Buf(ucharreg,uchar*pBuf.ucha

26、iuchais);umtSPI_Wnte_Buf(ucharreg,uchar*pBuf,ucliaruchais);unsignedchar11RF24L0l_RxPacket(unsignedchar*rx_buf);void11RF24L0l_TxPacket(unsignedchar*tx_buf);*长延时*voidDelay(unsignedmts)unsignedmti;for(i=0;is;i+);for(i=0;i0;n)_nop_();*NRF24L01初始化*/voidinit_NRF24L01(void)uierDelay_us(l00);CE=0;/cliipenab

27、leCSN=1;/SpidisableSCK=0;/SPI_WMe_Ei】f(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);/写本地地址SPI_WMe_Ei】f(WRITE_REG+RX_ADDR_P0.RX_ADDRESS,RX_ADR_WIDTH);/写接收端地址SPI_RW_Reg(WRITE_REG+EN_AA,0 x01);/频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG+EN_RXADDR,0 x01);/允许接收地址只有频道0,如果需要多频道可以参考Page21SPI_RW_Reg(WRITE_REG+RF_CH,0);/

28、设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);/设置接收数据长度,本次设置为32字节SPI_RW_Reg(VRITE_REG+RF_SETUP.0 x07);设置发射速率为1MHZ,发射功率为最人值OdE严*/*函数:uiiitSPI_RW(umtuchar)严功能:NRF24L01的SPI写时序严*/umtSPI_RW(umtuchai)uiiitbit_ctr;fbr(bit_ctr=0;bit_ctr8;bit_cti+)/output8-bitMOSI=(uchar&0 x80);uchar=(uch

29、ai1);SCK=1;uchar|=MISO:SCK=0;retuin(uchaij;/outputlichai;MSBtoMOSI/shiftnextbitintoMSE/SetSCKlugh./capturecurrentMISObit/.tliensetSCKlowagain/leturnreaduchar严*/*函数:uchaiSPI_Read(uchaneg)严功能:NRF24L01的SPI时序严*/ucharSPI_R亡ad(ucharreg)ucharreg_val;CSN=0;SPI_RW(reg);ieg_val=SPI_RW(0);CSN=1;/CSNlow,initial

30、izeSPIconununication.Selectregistertoreadfrom./.thenreadregistenTalueCSNhigh,terminateSPIcoininunication/leturnregistervalueretuin(reg_val);严*/*功能:NRF24L01读写寄存器函数严*/uiiitSPI_RW_Reg(uchaiuchaivalue)umtstatus;CSN=0;status=SPI.RW(reg);SPI_RW(value);CSN=1;/CSNlow、uiitSPItransaction/selectregister/.andwr

31、itevaluetoit./CSNhighagainreturn(status);/return11RF24L01statusuchar严*/*函数:uiiitSPI_Read_Buf(uchaiTeg,uchar*pBuucharuchais)/*功能:用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchais:读出数据的个数严*/umtSPI_Read_Buf(ucharreg,uchar*pBufuchaiuchais)umtstatus,uchar_ctr;CSN=0;status=SPI.RW(reg);/SetCSNlow,initSPItianaction/Sel

32、ectregistertowritetoandreadstatusucharfdr(uchai_cti-O;uchai_ctiuchais;uchai_cti+)pBuflucliaictr=SPI_RW(0);/CSN=1;return(status);/return11RF24L01statusuchar严*/*函数:umtSPI_Write_Buf(uchaneg,uchar*pBuf,uchaiuchais)严功能:用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchais:写入数据的个数严*/umtSPI_Wnte_Buf(ucharreg,uchar*pBuf,ucliar

33、uchais)umtstatus,uchar_ctr;CSN=0;/SPI使能status=SPI_RW(reg);fbr(uchai_cti-O;uchai_ctiuchars;uchar_ctr+)/SPI_RW(*pBufW);CSN=1;关闭SPIretuin(status);/严*/*函数:voidSetRX_Mode(void)严功能:数据接收配置严*/voidSetRX_Mode(void)CE=0;/IRQ收发完成中断响应,16SPI_RW_Reg(WRITE_REG+CONFIG.OxOf);位CRC,主接收CE=1;inerDelay_us(l30);严*,/*函数:unsignedchar11RF24L0l_RxPacket(unsignedchar*rx_buf)严功能:数据读取后放入rx_buf接收缓冲区中严*,unsignedchar

温馨提示

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

评论

0/150

提交评论