1、NRFL多通道通信无线抢答系统本系统用到4个NRF24L01模块,最多可以加到7个NRF24L01(其中一个用作主机另外的六个用作从机)。显示用的是诺基亚的5110,MCU用的是52单片机。经亲测发送和接收都很好。废话不多说,在此给上原理图加程序。附上成品图阅读NRF24L01那部分代码请结合nrf24L01中文资料中的寄存器介绍结合起来一起看,能使你理解的更透彻。在此附上NRF24L01芯片的寄存器的作用和地址图片(下图的截图是在“nrf24L01中文资料”中截的图需要更完整的“nrf24L01中文资料”请自己XX搜索下载)主机代码可下载到开发板上也可以自己做一个可以串口通信的最小系统或者去
2、掉主机代码中的串口通信部分下载到上图做的板中(记得修改引脚)#include #include typedef unsigned char uchar;typedef unsigned char uint;/*NRF24L01端口定义*/sbit MISO =P04;sbit MOSI =P03;sbit SCK =P02;sbit CE =P00;sbit CSN =P01;sbit IRQ =P05;/*LCD5110 I/O定义*/sbit LCD_RST =P14;sbit LCD_CE =P13;sbit LCD_DC =P12;sbit LCD_SCLK =P10;sbit LCD
3、_Din =P11;/*按键*/sbit KEY1=P36;sbit KEY2=P37;/*发光二极管*/sbit led1=P16;sbit led2=P17;/*NRF24L01地址宏定义*/#define TX_ADR_WIDTH 5 )右移一位,准备传送下一个数据 SCK = 1; )设置SCK为高 uchar |= MISO; then set SCK low again)拉低SCK时钟产生下降沿,从MSOI送出数据,在下一次SCK为高时读入MISO return(uchar); .)CSN拉低,启动SPI通信 NRF24L01_SPI_RW(reg); )设置读取的寄存器 reg_
4、val = NRF24L01_SPI_RW(0); then read registervalue)读出寄存器中的数据 CSN = 1; and write value to it.)向选择的寄存器中写入数据 CSN = 1; )右移一位,准备传送下一个数据 SCK = 1; )设置SCK为高 uchar |= MISO; then set SCK low again)拉低SCK时钟产生下降沿,从MSOI送出数据,在下一次SCK为高时读入MISO return(uchar); .)CSN拉低,启动SPI通信 NRF24L01_SPI_RW(reg); )设置读取的寄存器 reg_val = N
5、RF24L01_SPI_RW(0); then read registervalue)读出寄存器中的数据 CSN = 1; and write value to it.)向选择的寄存器中写入数据 CSN = 1; / (CSN high again)CSN拉高,终止SPI通信 return(status); / (return nRF24L01 status uchar)返回2401 reg寄存器的状态/*/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地
6、址,uchars:读出数据的个数/*/uint NRF24L01_SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) uint status,uchar_ctr; CSN = 0; / Set CSN low, init SPI tranaction status = NRF24L01_SPI_RW(reg); / Select register to write to and read status uchar for(uchar_ctr=0;uchar_ctruchars;uchar_ctr+) pBufuchar_ctr = NRF24L
7、01_SPI_RW(0); / CSN = 1; return(status); / return nRF24L01 status uchar/*/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据,reg:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*/uint NRF24L01_SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) uint status,uchar_ctr; CSN = 0; /SPI使能 status
8、= NRF24L01_SPI_RW(reg); for(uchar_ctr=0; uchar_ctruchars; uchar_ctr+) / NRF24L01_SPI_RW(*pBuf+);/指向下一个数据 CSN = 1; /关闭SPI return(status); /返回24L01的状态/*/*函数:void SetRX_Mode(void)/*功能:数据接收配置 /*/void NRF24L01_SetRX_Mode(void) CE=0; /片选使能 NRF24L01_SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / IRQ收发完成中断响应,16位CR
9、C ,主接收 CE = 1; /片选失能 inerDelay_us(130);/*/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/*/unsigned char NRF24L01_RxPacket(unsigned char* rx_buf) unsigned char revale=0; NRF24L01_SetRX_Mode(); Delay(1000); sta=NRF24L01_SPI_Read(STATUS); / 读取状态寄存其来判断数据接收状? if(RX_DR
10、) / 判断是否接收到数据 CE = 0; /SPI使能 NRF24L01_SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ (read receive payload from RX_FIFO buffer)从接收缓冲器中读出数据 revale =1; /读取数据完成标志 led2=0; /二极管显示接没接收到数据 NRF24L01_SPI_RW_Reg(WRITE_REG+STATUS,sta); /接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清除中断标志 CSN=0; NRF24L01_SPI_RW(FLUSH_
11、RX); /用于清空FIFO !关键!防止接收先前的数据! CSN=1; Delay(100); led2=1; return revale;/*/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送 tx_buf中数据/*/void NRF24L01_TxPacket(unsigned char * tx_buf) CE=0; /(StandBy I模式)待机 I模式 CSN=0; NRF24L01_SPI_RW(FLUSH_TX); /用于清空FIFO !关键!防止发送先前的数据! CSN=1; NRF24L01_SPI_Wri
12、te_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 装载接收端地址0 NRF24L01_SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); / 装载数据 NRF24L01_SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / IRQ收发完成中断响应,16位CRC,主发送 CE=1; /置高CE,激发数据发送 inerDelay_us(10);/*/void main() unsigned char TxBufTX_PLOAD_WIDTH=0; /定义
13、发送的数据数组 unsigned char RxBufRX_PLOAD_WIDTH=0; /定义接收数据的数组 unsigned char tf=0; /模式标志 LCD_init(); /5110的初始化 LCD_clear(); /5110的清屏函数 NRF24L01_init(); /NRF24L01的初始化 LCD_write_english_string(3*6,0,acceptor); /字符串显示 while(1) while(1) NRF24L01_RxPacket(RxBuf); Delay(1000); LCD_write_english_string(3*6,1,RxBu
14、f); if(KEY2=0) /去抖延时 Delay(30); if(KEY2=0) TxBuf0=0; /抢答模式 led1=0; Delay(120); led1=1; Delay(120); NRF24L01_TxPacket(TxBuf); while(!KEY2); if(KEY4=0) Delay(30); /去抖延时 if(KEY4=0) while(!KEY4);break; TxBuf0=0; TxBuf1=0; LCD_write_english_string(2*6,1,jury mode); LCD_write_english_string(2*6,2,grade:);
15、 LCD_write_english_char(8*6,2,0); while(1) if(KEY1=0) Delay(30); /去抖延时 if(KEY1=0) TxBuf1=TxBuf1+1; if(TxBuf1=11) TxBuf1=0; LCD_write_english_char(8*6,2,TxBuf1+0x30); LCD_write_english_char(9*6,2, ); if(TxBuf1=10) LCD_write_english_char(8*6,2,1); LCD_write_english_char(9*6,2,0); led1=0; Delay(120); l
16、ed1=1; Delay(120); while(!KEY1); if(KEY2=0) Delay(30); /去抖延时 if(KEY2=0) TxBuf0=1; /评委模式 NRF24L01_TxPacket(TxBuf); led1=0; Delay(120); led1=1; Delay(120); while(!KEY2); if(KEY3=0) Delay(30); /去抖延时 if(KEY3=0) if(TxBuf1=0) TxBuf1=10; else TxBuf1=TxBuf1-1; LCD_write_english_char(8*6,2,TxBuf1+0x30); LCD_
17、write_english_char(9*6,2, ); if(TxBuf1=10) LCD_write_english_char(8*6,2,1); LCD_write_english_char(9*6,2,0); led1=0; Delay(120); led1=1; Delay(120); while(!KEY3); if(KEY4=0) Delay(30); /去抖延时 if(KEY4=0) while(!KEY4);break; LCD_write_english_string(2*6,1, ); LCD_write_english_string(2*6,2, ); TxBuf0=0; TxBuf1=0; /*修改日:2013/9/25称号:起点 学校:桂林电子科技大学本人现在正在写上位机的串口通信软件有什么意见的可以一起交流*/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1