NRF24L01多通道通信.doc_第1页
NRF24L01多通道通信.doc_第2页
NRF24L01多通道通信.doc_第3页
NRF24L01多通道通信.doc_第4页
NRF24L01多通道通信.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

无线抢答系统本系统用到4个NRF24L01模块,最多可以加到7个NRF24L01(其中一个用作主机另外的六个用作从机)。显示用的是诺基亚的5110,MCU用的是52单片机。经亲测发送和接收都很好。在此给上原理图加程序。附上成品图主机代码可下载到开发板上也可以自己做一个可以串口通信的最小系统或者去掉主机代码中的串口通信部分下载到上图做的板中(记得修改引脚)#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_Din =P11;/*按键*/sbit KEY1=P36;sbit KEY2=P37;/*发光二极管*/sbit led1=P16;sbit led2=P17;/*NRF24L01地址宏定义*/#define TX_ADR_WIDTH 5 / 5 uints TX address width#define RX_ADR_WIDTH 5 / 5 uints RX address width#define TX_PLOAD_WIDTH 20 / 20 uints TX payload#define RX_PLOAD_WIDTH 20 / 20 uints TX payloaduint const TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /本地地址uint const RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /接收地址0uint const RX_ADDRESS1RX_ADR_WIDTH=0xf1,0xb3,0xb4,0xb5,0xb6; /接收地址1uint const RX_ADDRESS2RX_ADR_WIDTH=0xcd,0xb3,0xb4,0xb5,0xb6; /接收地址2uint const RX_ADDRESS3RX_ADR_WIDTH=0xa3,0xb3,0xb4,0xb5,0xb6; /接收地址3uint const RX_ADDRESS4RX_ADR_WIDTH=0x0f,0xb3,0xb4,0xb5,0xb6; /接收地址4uint const RX_ADDRESS5RX_ADR_WIDTH=0x05,0xb3,0xb4,0xb5,0xb6; /接收地址5/*NRF24L01寄存器指令*/#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*/#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#define OBSERVE_TX 0x08 / 发送监测功能#define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / 频道1接收数据地址#define RX_ADDR_P2 0x0C / 频道2接收数据地址#define RX_ADDR_P3 0x0D / 频道3接收数据地址#define RX_ADDR_P4 0x0E / 频道4接收数据地址#define RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX_ADDR 0x10 / 发送地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*ASCII数组区*/code unsigned char font6x8926 = /数字和字母 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 , 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 , 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 , 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 , 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 , 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 , 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 , 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 , 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 , 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 , 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 , 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 , 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 , 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 , 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 , 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E , 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 , 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 , 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 , 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 , 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 , 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 , 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 , 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 , 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E , 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 , 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 , 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 , 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 , 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 , 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 , 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E , 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C , 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 , 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 , 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C , 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 , 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 , 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A , 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F , 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 , 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 , 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 , 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 , 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F , 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F , 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E , 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 , 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E , 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 , 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 , 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 , 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F , 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F , 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F , 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 , 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 , 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 , 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 , 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 , 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 , 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 , 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 , 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 , 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 , 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 , 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 , 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F , 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 , 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 , 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C , 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 , 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 , 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 , 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 , 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 , 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 , 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 , 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 , 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 , 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC , 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 , 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 , 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 , 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C , 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C , 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C , 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 , 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C , 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 , 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 ; /*标志位*/*/*函数声明区*/void LCD_write_byte(unsigned char dat, unsigned char command);/SPI写入数据函数void LCD_init(void); /LCD5110初始化函数void LCD_set_XY(unsigned char X, unsigned char Y);/设置显示指针函数void LCD_write_char(unsigned char c);/写一个字符到LCD5110void LCD_clear(void);/LCD初始化函数void inerDelay_us(unsigned char n);/延时函数void LCD_write_english_string(unsigned char X,unsigned char Y,char *s); /写字符串到LCD函数void LCD_write_english_char(unsigned char X,unsigned char Y,unsigned char ch); /写一个字符到LCD函数void Delay(unsigned int s); /场延时函数void NRF24L01_init(void); /NRF24L01初始化uint NRF24L01_SPI_RW(uint uchar); /SPI写入和读出uchar NRF24L01_SPI_Read(uchar reg); /读寄存器regvoid NRF24L01_SetRX_Mode(void); /设置接收模式uint NRF24L01_SPI_RW_Reg(uchar reg, uchar value); /向寄存器reg中存入数据uint NRF24L01_SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); /读取寄存器reg的数据,存到pBuf中uint NRF24L01_SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); /向寄存器reg中写入数据pBufunsigned char NRF24L01_RxPacket(unsigned char* rx_buf); /由MCU读取NRF24L01接收到的数据void NRF24L01_TxPacket(unsigned char * tx_buf,unsigned char xindaoji); /由NRF24L01 发送数据tx_bufvoid USART_init(void); /串口的初始化void USART_TxPacket_char(uchar f_data);/通过串口发送一个字节数据函数void USART_TxPacket_buf(uchar *f_data);/通过串口发送一个字符串的数据函数/*/*长延时*/void Delay(unsigned int s)unsigned int i,j;for(i=0; i1000; i+);for(j=0; j0;n-)_nop_();/*/* 函数名称:LCD_write_byte函数功能:模拟SPI接口时序写数据/命令LCD入口参数:data :写入的数据;command :写数据/命令选择;出口参数:无 备 注: */void LCD_write_byte(unsigned char dat, unsigned char command)unsigned char i;LCD_CE = 0; /5110片选有效,允许输入数据if (command=0) /写命令LCD_DC = 0;elseLCD_DC=1; for(i=0;i8;i+) /传送8bit数据 if(dat&0x80)LCD_Din= 1;elseLCD_Din = 0;LCD_SCLK = 0;dat = dat 1;LCD_SCLK = 1; LCD_CE = 1; /禁止5110/* 函数名称:LCD_init函数功能:5110初始化入口参数:无出口参数:无 备 注: */void LCD_init(void)LCD_RST = 0; / 产生一个让LCD复位的低电平脉冲inerDelay_us(1);LCD_RST = 1;LCD_CE = 0; / 关闭LCDinerDelay_us(1);LCD_CE = 1; / 使能LCDinerDelay_us(1);LCD_write_byte(0x21, 0);/ 使用扩展命令设置LCD模式LCD_write_byte(0xc8, 0);/ 设置液晶偏置电压LCD_write_byte(0x06, 0);/ 温度校正LCD_write_byte(0x13, 0);/ 1:48LCD_write_byte(0x20, 0);/ 使用基本命令,V=0,水平寻址LCD_clear(); / 清屏LCD_write_byte(0x0c, 0);/ 设定显示模式,正常显示LCD_CE = 0; / 关闭LCD/* 函数名称:LCD_set_XY函数功能:设置LCD坐标函数入口参数:X :083Y :05出口参数:无 备 注: */void LCD_set_XY(unsigned char X, unsigned char Y)LCD_write_byte(0x40 | Y, 0); / columnLCD_write_byte(0x80 | X, 0); / row/*函数名称:LCD_write_char函数功能:显示英文字符入口参数:c: 显示的字符出口参数:无 备 注: */void LCD_write_char(unsigned char c)unsigned char line;c -= 32; /数组的行号for (line=0; line6; line+)LCD_write_byte(font6x8cline, 1);/*- LCD_clear: LCD清屏函数 编写日期:20080918 -*/ void LCD_clear(void)unsigned int i;LCD_write_byte(0x0c, 0);LCD_write_byte(0x80, 0);for (i=0; i504; i+)LCD_write_byte(0, 1);/*- 函数名称:void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)函数功能:写字符串函数入口参数:X、Y :位图绘制的起始X、Y坐标;*s :字符串;出口参数:无 备 注:-*/void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)LCD_set_XY(X,Y);while (*s) LCD_write_char(*s);s+;/*- 函数名称:void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)函数功能:写字符串函数入口参数:X、Y :位图绘制的起始X、Y坐标;*s :字符串;出口参数:无 备 注:-*/void LCD_write_english_char(unsigned char X,unsigned char Y,unsigned char ch)LCD_set_XY(X,Y);LCD_write_char(ch);/*/*/*NRF24L01初始化/*/void NRF24L01_init(void)inerDelay_us(100);CE=0; / 芯片使能 CSN=1; / (Spi disable)SPI 失能,即禁止2401芯片的SPI功能 SCK=0; / 初始化SPI时钟NRF24L01_SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 设置本地地址 NRF24L01_SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 设置接收端地址0NRF24L01_SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); / 设置接收端地址1NRF24L01_SPI_RW_Reg(WRITE_REG + RX_ADDR_P2,RX_ADDRESS20); / 设置接收端地址2NRF24L01_SPI_RW_Reg(WRITE_REG + RX_ADDR_P3,RX_ADDRESS30); / 设置接收端地址3NRF24L01_SPI_RW_Reg(WRITE_REG + RX_ADDR_P4,RX_ADDRESS40); / 设置接收端地址4NRF24L01_SPI_RW_Reg(WRITE_REG + RX_ADDR_P5,RX_ADDRESS50); / 设置接收端地址5NRF24L01_SPI_RW_Reg(WRITE_REG + EN_AA,0x3f); / 频道0,1,2,3,4,5自动 ACK应答允许 NRF24L01_SPI_RW_Reg(WRITE_REG + EN_RXADDR,0x3f); / 允许接收地址有频道0,1,2,3,4,5,如果需要多频道可以参考Page21 NRF24L01_SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a); /设置自动重发的延时和次数,延时大小为4000+86us,次数5次NRF24L01_SPI_RW_Reg(WRITE_REG + RF_CH,0); / 设置信道工作为2.4GHZ,收发必须一致NRF24L01_SPI_RW_Reg(WRITE_REG + RX_PW_P0,RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节NRF24L01_SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节NRF24L01_SPI_RW_Reg(WRITE_REG + RX_PW_P2, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节NRF24L01_SPI_RW_Reg(WRITE_REG + RX_PW_P3, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节NRF24L01_SPI_RW_Reg(WRITE_REG + RX_PW_P4, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节NRF24L01_SPI_RW_Reg(WRITE_REG + RX_PW_P5, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节NRF24L01_SPI_RW_Reg(WRITE_REG + RF_SETUP,0x07); /设置发射速率为2MHZ,发射功率为最大值0dBNRF24L01_SPI_RW_Reg(WRITE_REG+CONFIG,0x0f); /IRQ收发完成中断响应,16为CRC,主接收/*/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/*/uint NRF24L01_SPI_RW(uint uchar) /发送uchar数据,并返回接收到的数据uint bit_ctr; /位计数器,用于确定接收或者发送的位数,这里是一个字节即8位for(bit_ctr=0;bit_ctr8;bit_ctr+) MOSI = (uchar & 0x80); / (output uchar, MSB to MOSI)输出数据,MSB to MOSI,即先送高位后送低位uchar = (uchar 1); / (shift next bit into MSB.)右移一位,准备传送下一个数据SCK = 1; / (Set SCK high.)设置SCK为高uchar |= MISO; / (capture current MISO bit )接收24L01传出的数据,他是先先送高位后送低位SCK = 0; / (.then set SCK low again)拉低SCK时钟产生下降沿,从MSOI送出数据,在下一次SCK为高时读入MISOreturn(uchar); / return read uchar/*/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序/*/uchar NRF24L01_SPI_Read(uchar reg)uchar reg_val;CSN = 0; / (CSN low, initialize SPI communication.)CSN拉低,启动SPI通信NRF24L01_SPI_RW(reg); / (Select register to read from.)设置读取的寄存器reg_val = NRF24L01_SPI_RW(0); / (.then

温馨提示

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

评论

0/150

提交评论