NRF24l01一对一双向通信程序(已调通)

上传人:z****2 文档编号:181745393 上传时间:2023-01-16 格式:DOCX 页数:18 大小:78.86KB
收藏 版权申诉 举报 下载
NRF24l01一对一双向通信程序(已调通)_第1页
第1页 / 共18页
NRF24l01一对一双向通信程序(已调通)_第2页
第2页 / 共18页
NRF24l01一对一双向通信程序(已调通)_第3页
第3页 / 共18页
资源描述:

《NRF24l01一对一双向通信程序(已调通)》由会员分享,可在线阅读,更多相关《NRF24l01一对一双向通信程序(已调通)(18页珍藏版)》请在装配图网上搜索。

1、以卜程序参考多个网络程序后,经调试并且己经调通,口J以稍加修改即可使用 经测试可实现双向通信本程序实现功能:从52单片机串丨I读入数据后通过24L01发送/24L01 发送#include #include tvpedef unsigned chai uchar;tvpedef unsigned chai uint;=P1A4;=P1A3;=P1A2;=P1AO;=P1A1;=P1A5;SCKCECSNIRQ*2sRF24L01 端定义 * * sbit MISO sbit MOSI sbit sbit sbit sbit*按键 * */sbit KEY1=P3A6;/sbit KEY2=P3

2、A7;* 数码管位选* *led3=P2A0;led2=P2Al;ledl=P2A2;ledO=P2A3;/sbit/sbit/sbit /sbit*峰明器 * */sbit BELL=P3A4;* 数码管 09 编码 * * */ucliar seg10=0xC0,0xCE0xA4,0xB0.0x99.0x92.0x82.0xF8,0x80,0x90;码* *2sRF24L0 * *#define TX_ADR_WIDTH 5/ 5 umts TX address width#define RX_ADR_WIDTH 5/ 5 umts RX address width/ 20 uiiits

3、TX payload/ 20 uiiits TX payload#define READ_REG0x00/读寄存器指令#define TX_PLOAD_WIDTH 10#define RX_PLOAD_WEDTH 10 umt const TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x 10.Ox 10.0x01; 本地地址 umt const RX_ADDRESSRX_ADR_WIDTH= 0x34.0x43,0x 10,0x 10,0x01; 接收地址 *NRF24L()1 寄存器指令 * *define WRITE_REG0x20/写寄存器指令define RD

4、_RX_PLOAD0x61/读取接收数据指令#define WR_TX_PLOADOxAO/写待发数据指令define FLUSH.TXOxEl/冲洗发送FIFO指令define FLUSH_RX0xE2/冲洗接收FIFO指令#define REUSE_TX_PL0xE3/定义重复装载数据指令frdefine NOPOxFF/保留*define CONFIGdefine EN_AA0x00 配置收发状态,CRC校验模式以及收发状态响应方式0x01 /自动应答功能设置frdefine EN_RXADDR #define SETUP_AW define SETUP_RETR define RF_C

5、H define RF_SETUP frdefine STATUS define OBSERVE.TX frdefine CDdefine RX_ADDR_P0 define RX_ADDR_P1 define RX_ADDR_P2 define RX_ADDR_P3 define RX_ADDR_P斗 define RX_ADDR_P5 define TX_ADDR 彳define RX_PW_P0 彳define RX_PW.P1 彳define RX_PW_P2 彳define RX_PW_P3 彳define RX_PW_P4 彳define RX_PW_P5 define FIFO.

6、STATUS0x02 可用信道设置0x03 /收发地址宽度设置0x04 /自动重发功能设置0x05 /工作频率设置0x06 /发射速率、功耗功能设置0x07 /状态寄存器0x08 /发送监测功能0x09 /地址检测OxOA /频道0接收数据地址OxOB /频道1接收数据地址0x0C /频道2接收数据地址0x0D /频道3接收数据地址OxOE /频道4接收数据地址OxOF /频道5接收数据地址0x10 /发送地址寄存器0x11 接收频道0接收数据长度0x12 /接收频道0接收数据长度0x13 接收频道0接收数据长度0x14 /接收频道0接收数据长度0x15 接收频道0接收数据长度0x16 接收频

7、道0接收数据长度0x17 /FIFO栈入栈岀状态寄存器设置*void Delay(unsigned mt s);void inerDelay_us(unsigned char n);void init_NRF24L01 (void);umt SPI_RW(umt uchar);uchai SPI_Read(uchai- leg);void SetRX_Mode(void);umt SPI_RW_Reg(uchai leg. uchai value);umt SPI_Read_Buf(uchar reg, uchar *pBuf. uchai uchars); umt SPI_Wiite_Buf

8、(uchar reg, uchar *pBuf, ucliar uchai s); unsigned char 11RF24L0l_RxPacket(unsigned char* rx_buf); void 11RF24L0 l_TxPacket(unsigned char * tx_buf):*长延 H 寸 * void Delay(unsigned mt s)unsigned mt i; fbr(i=O; is; i+); fbr(i=O; i0;n)_nop_();*NRF74I 01void init_NRF24L01 (void) iiierDelay_us(l 00);CE=0;/

9、 cliip enableCSN=1;/ Spi disableSCK=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(VRITE_REG + EN_AA, 0x01);/频道0自动 ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);/允许接收地址只有频道0,如杲需要多频道可以参考Page21SP

10、I_RW_Reg(WRITE_REG + RF_CH, 0);/ 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(VRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);设置接收数据长度,本次设置为32字节SPI_RW_Reg(VRITE_REG + RF_SETUP. 0x07);设置发射速率为1MHZ,发射功率为最犬值OdE*/* 函数:umt SPI_RW(umtuchar)严功能:NRF24L01的SPI写时序*/umt SPI_RW(umt uchar) uiiit bit_ctr;foi(bit_ctr=0;bit_ctr8;bit_cU+) /

11、output 8-bitMOSI = (uchar& 0x80); uchar = (uchar 1);SCK= 1;uchar |= MISO:SCK = 0;letuin(uchar);/ output Cellar; MSB to MOSI/ shift next bit into MSE/ Set SCKlugh./ capture current MISO bit/ .tlien set SCK low again/ leturn read uchar严*/* 函数:uchaiSPI_Read(uchaneg) 严功能:NRF24L01的SPI时序严*/ uchai SPI_Read

12、(uchai- reg) uchar res val;CSN = 0;SPI_RW(reg); reg_val = SPI_RW(0);CSN= 1;H CSN low, mitialize SPI conununication. Select register to read from./ .then read registen-alueII CSN high ternuiiate SPI communication/ leturn register valueretuin(reg_val);严*/*功能:NRF24L01读写寄存器函数严*/umt SPI_RW_Reg(uchaT reg.

13、 uchar value) uiiit status;CSN = 0;status = SPI.RW(reg);SPI_RW(value);/ CSN low、iiiit SPI transaction / select register/ .and write value to it.return(status);/ return 11RF24L01 status uchar严*/* 函数:umtSPI_Read_Buf(uchaneg, uchai *pBuf, uchamchais)/*功能:用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchais:读出数据的 个数严*

14、/umt SPI_Read_Buf(uchar reg, uchar *pBuf. uchar uchais) uiiit status,uchar_ctr;CSN = 0;status = SPI.RW(reg);/ Set CSN low, init SPI tianaction/ Select register to write to and read status ucharfdr(uchai_cti-O;uchai_ctiuchais;uchai_cti+)pBuflucliai-.ctr = SPI_RW(0); /CSN= 1;return(status);/ return 11

15、RF24L01 status uchar严*/* 函数:umtSPLWrite.Bufuchaneg, uchai- *pBuf. uchaiuchais)严功能:用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchais:写入数据的个数严*/umt SPI_Write_Buf(uchar reg, uchar *pBuf, ucliar uchais) uiiit status,uchar_ctr;CSN = 0;/SPI 使能status = SPI.RW(reg);fbr(uchai_cti-O; uchai_ctiuchars; uchai_ctr+) / SPI_RW(*pB

16、ufb+);CSN= 1;关闭 SPIretum(status); /严*/* 函数:void SetRX_Mode(void) 严功能:数据接收配置*/void SetRX_Mode(void)CE=0;/ IRQ收发完成中断响应,16SPI_RW_R珂VRTTE_REG + CONFIG. OxOf); 位CRC ,主接收CE= 1;inerDelay_us(l 30);严* *,严函数:unsigned char 11RF24L0l_RxPacket(unsigned char* rx_buf) 严功能:数据读取后放入rx_buf接收缓冲区中严* *,unsigned char 11RF

17、24L0l_RxPacket(unsigned char* rx_buf)unsigned char revale=0;sta=SPI_Read(STATUS); /读取状态寄存其来判断数据接收状况 if(RX_DR)/判断是否接收到数据CE = 0;/SPI 使能SPI_Read_Euf(RD_RX_PLOALMx_bi】f,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferrevale =1;读取数据完成标志SPI_RW_Reg(VRITE_REG+STATUS、sta); /接收到数据后 RX_DR,TX_DS.MAX_P

18、T 都置高为1,通过写1来清楚中断标志retuin revale;严* */* 函数:void 11RF24L0 l_TxPacket(unsigned char * tx_buf) 严功能:发送tx_buf中数据严*/void 11RF24L0 l_TxPacket(unsigned char * tx_buf)CE=0;/StandBv I 模式SPI_Wnte_Ei】f(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 装载接收端地址/装载数SPI_Wnte_Euf(WR_TX_PLOAIZ tx.buf, TX_PLOAD_WID

19、TH);据SPI_RW_Reg(WRITE_REG + CONFIG OxOe);/ IRQ 收发完成中断响应,16位CRC,主发送CE=1;置高CE,激发数据发送inerDelay_us(10);*unsigned char tf =0;unsigned char TxBuf10=0;/unsigned char RxBuf10=0;*void main(void)/%单片机串11初始化/SCON=Ox50;/SCON:模式 1,8-bitUART,使能接收:REN=1TMOD=0x20;THl=0xfd;/波特率9600初值TLl=Oxfd;TR1=1;EA=1打开总中断ES=1#打开串I

20、 1中断%/uuCNRF24L01();上面保留三句移到了全局变量wlule(l)nRF24L01_TxPacket(TxBuf); / Transmit Tx buffer data Delav(lOOO);SPI_RW_Reg(WRITE_REG+STATUS,Oxff); 清零状态寄存器?*SetRX_Mode();nRF24L01_RxPacket(RxBuf);SBUF=RxBuflO;/存放到本单片机串I I输出?Delay(600);/?void UART_SER() mtenupt 4/uchai- Temp;/定义临时变量if(RI)RI=0;标志位清零读入缓冲区的值TxBu

21、fO=SBUF;/把输入的 save 到 TxBuf 里/ Delay(1000);/?如杲是发送标志位,清零TI=0;以卜程序参考多个网络程序后,经调试并且己经调通,町以稍加修改即可使用 本程序实现功能:24L01接收到数据后通过52单片机串II输出到电脑端查看,同时又把数 据回传(发送)实现双向通信include include tvpedef unsigned chai uchar;tvpedef unsigned chai unit;*卄*#*NRF24LO1 端丨 I定义 sbit MISO =P1A4; sbit MOSI =P1A3; sbit SCK =P1A2;sbit CE

22、 =P1AO; sbit CSN =P1A1;sbit IRQ =P1A5;/ 20 umts TX payload/ 20 umts TX payload#define EN_RXADDR#define SETUP_AW#define SETUP_RETR#define RF_CH 彳define RF_SETUP#define STATUS#define OBSERVE.TX#define CD#define RX_ADDR_P0#define RX_ADDR_P1#define RX_ADDR_P2#define RX_ADDR_P3#define RX_ADDR_P斗#define R

23、X_ADDR_P5#define TX_ADDR#define RX_PW_P0#define RX_PW.P1#define RX_PW_P2#define RX_PW_P3#define RX_PW_P4#define RX_PW_P5#define FIFO.STATUS#define TX_PLOAD_WIDTH 10#define RX_PLOAD_WIDTH 10 umt const TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x 10.Ox 10.0x01; 本地地址 umt const RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43

24、,0x10,0x10,0x01; 接收地址 *NRF24L()1 寄存器指令 * *#define READ_REG0x00/读寄存器指令#define WRITE_REG0x20/写寄存器指令#define RD_RX_PLOAD0x61/读取接收数据指令#define WR_TX_PLOADOxAO/写待发数据指令#define FLUSH.TXOxEl/冲洗发送FIFO指令#define FLUSH_RX0xE2/冲洗接收FIFO指令#define REUSE_TX_PL0xE3/定义重复装载数据指令frdefine NOPOxFF/保留*#define CONFIG#define EN

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

26、x14 /接收频道0接收数据长度0x15 接收频道0接收数据长度0x16 接收频道0接收数据长度0x17 /FIFO栈入栈出状态寄存器设置*void Delay(unsigned mt s);void inerDelay_us(unsigned char n); void init_NRF24L01 (void);umt SPI_RW(umt uchai);uchai SPI_Read(uchai- leg);void SetRX_Mode(void);umt SPI_RW_Reg(uchai uchai value);umt SPI_Read_Buf(uchar reg, uchar *pB

27、uf. uchai uchais); umt SPI_Wnte_Buf(uchar reg, uchar *pBuf, ucliar uchai s); unsigned char 11RF24L0l_RxPacket(unsigned char* rx_buf); void 11RF24L0 l_TxPacket(unsigned char * tx_buf);void Delay(unsigned mt s)*unsigned mt i; for(i=0; is; i+); for(i=0; i0;n)_nop_();*NRF74I 01void init_NRF24L01 (void)

28、iiierDelay_us(l 00);CE=0;/ chip enableCSN=1;/ Spi disableSCK=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, 0x01);/频道0自动 ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);/允许接收地址

29、只有频道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(VRITE_REG + RF_SETUR 0x07);设置发射速率为发射功率为最犬值OdE严*严函数:umt SPI_RW(uiiituchar)/*功能:NRF24L01的SPI写时序严*/umt SPI_RW(umt uchar)uiiit bit_ctr;for(bit_ctr=

30、0;bit_ctr8;bit_cU+) / output 8-bit/ output Cellar*. MSB to MO SI/ shift next bit into MSE/Set SCKlugh./ capture current MISO bit/ .tlien set SCK low againMOSI = (uchar& 0x80);uchar = (uchar 1);SCK= 1;uchar |= MISO:SCK = 0;/ leturn read ucharreturn(uchar);严*严函数:ucharSPI_Read(uchaneg)严功能:NRF24L01的SPI时

31、序严*/uchar SPI_Read(uchai- leg)uchar reg_val;CSN = 0;SPI_RW(reg); reg_val = SPI_RW(0);CSN= 1;H CSN low, mitialize SPI conununication. Select register to read from./ .then read registen-alue CSN high, terminate SPI conununication/ leturn register valueretum(reg_val);严*/*功能:NRF24L01读写寄存器函数严*/umt SPI_RW

32、_Reg(uchaT reg, uchai value)umt status;CSN = 0;status = SPI.RW(reg); SPI_RW(value);CSN= 1;/ CSN low、iiiit SPI transaction / select register/ .and write value to it./ CSN high againretum(status);/ retuin 11RF24L01 status uchar严*/* 函数:umtSPI_Read_Buf(uchaiTeg, uchai *pBu uchanichars)/*功能:用于读数据,reg:为寄存

33、器地址,pBuf:为待读出数据地址,uchais:读出数据的 个数严*/umt SPI_Read_Buf(uchar reg, uchar *pBuf. uchai uchais) uiiit status,uchai_ctr;CSN = 0;status = SPI.RW(reg);/ Set CSN low, init SPI tianaction/ Select register to write to and read status ucharfdr(uchai_cti-O;uchai_ctiuchais;uchai_cti+)pBuflucliai-.ctr = SPI_RW(0);

34、 /CSN= 1;retum(status);/ return 11RF24L01 status uchar严* */* 函数:umtSPI_Wiite_Buf(uchaneg, uchar *pBuf, uchaiuchais)严功能:用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchais:写入数据的个数严*/umt SPI_Wnte_Buf(uchar reg, uchar *pBuf, ucliar uchais) uiiit status,uchai_ctr;CSN = 0;/SPI 使能status = SPI.RW(reg);for(uchai_cti-O; uchai

35、ctiuchars; uchai_ctr+) / SPI_RW(*pBufb+);CSN= 1;关闭 SPIretuni(status); /严*/* 函数:void SetRX_Mode(void)严功能:数据接收配置严*/void SetRX_Mode(void)CE=0;/ IRQ收发完成中断响应,16SPI_RW_R珂VRTTE_REG + CONFIG. OxOf); 位CRC ,主接收CE= 1;inerDelay_us(l 30);严* *,/* 函数:unsigned char 11RF24L0l_RxPacket(unsigned char* rx_buf) 严功能:数据读取

36、后放入rx_buf接收缓冲区中严* *,unsigned char 11RF24L0l_RxPacket(unsigned char* rx_buf)unsigned char revale=0;sta=SPI_Read(STATUS); /读取状态寄存其来判断数据接收状况 if(RX_DR)/判断是否接收到数据CE = 0;SPI 使能SPI_Read_Buf(RD_RX_PLOADjx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferrevale =1;读取数据完成标志SPI_RW_Reg(VRITE_REG+ST

37、ATUS、sta);/接收到数据后 RX_DR,TX_DS.MAX_PT都置高为1,通过写1来清楚中断标志retuin revale;严* */* 函数:void 11RF24L01 _TxPacket(unsigned char * tx_buf) 严功能:发送tx_buf中数据*/void 11RF24L0 l_TxPacket(unsigned char * tx_buf)CE=0;/StandBv I 模式SPI_Wnte_Euf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 装载接收端地址/装载数SPI_Wnte_Euf(W

38、R_TX_PLOAIZ tx.buf, TX_PLOAD_WIDTH); 据 IRQ收发完成中断响应,16SPI_RW_Reg(VRITE_REG + CONFIG. OxOe); 位CRC,主发送CE=1;置高CE,激发数据发送inerDelay_us(10);*unsigned char tf =0;unsigned char TxBuf10=0;/unsigned char RxBuf10=0;*void main(void)/%单片机串11初始化/SCON=Ox50;/SCON:模式 1,8-bitUART,使能接收:REN=1TMOD=0x20;THl=0xfd;/波特率9600初值

39、TLl=0xfd;TR1=1;EA=1打开总中断ES=1#打开串I I中断uuCNRF24L01();上面保留三句移到了全局变量wlule(l)SetRX_Mode();11RF24L0 l.RxPacket(RxBuf);TxBuf(0=RxBuf0;SBUF=RxBuf0;11RF24L0l_TxPacket(TxBuf); / Transmit Tx buffer data /SPI_RW_Reg(WRITE_REG+STATUS、Oxfi);/ 清零状态寄存器?Delav(lOOO);void UART_SER() mtermpt 4if(RI)RI=0;】f(TI)/如果是发送标志位,清零TI=0;

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!