⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nrf24l01+̤

📁 nRF24L01无线模块6个接收通道
💻
📖 第 1 页 / 共 2 页
字号:
 151          uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
 152          {
 153   1              uchar status, i;
 154   1              CSN = 0;                    // CSN置低,开始传输数据
 155   1              status = SPI_RW(reg);       // 选择寄存器,同时返回状态字
 156   1              for(i=0; i<bytes; i++)
 157   1              SPI_RW(pBuf[i]);        // 逐个字节写入nRF24L01
 158   1              CSN = 1;                    // CSN拉高,结束数据传输
 159   1              return(status);             // 返回状态寄存器
 160   1      }
 161          /**************************************************/
 162          
 163          /**************************************************
 164          函数:RX_Mode()
 165          
 166          描述:
 167              这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包
 168          /**************************************************/
 169          void RX_Mode(void)
 170          {
 171   1              CE = 0;
 172   1              SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);              // CRC使能,16位CRC校验,上电,接收模式
 173   1              CE = 1;                                            // 拉高CE启动接收设备
 174   1              inerDelay_us(130);
 175   1      }
 176          /**************************************************/
 177          
C51 COMPILER V7.00  NRF24L01                                                               04/05/2010 10:30:48 PAGE 4   

 178          /**************************************************
 179          函数:TX_Mode()
 180          
 181          描述:
 182              这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
 183                  130us后启动发射,数据发送结束后,发送模块自动转入接收
 184                  模式等待应答信号。
 185          /**************************************************/
 186          void TX_Mode(uchar * BUF)
 187          {
 188   1              CE = 0;
 189   1              SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 写入发送地址
 190   1              SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);                  // 写数据包到TX FIFO
 191   1              CE = 1;
 192   1              inerDelay_us(10);
 193   1      }
 194          /**************************************************/
 195          
 196          /**************************************************
 197          函数:Check_ACK()
 198          
 199          描述:
 200              检查接收设备有无接收到数据包,设定没有收到应答信
 201                  号是否重发
 202          /**************************************************/
 203          uchar Check_ACK(bit clear)
 204          {
 205   1              while(IRQ);
 206   1              sta = SPI_RW(NOP);                    // 返回状态寄存器
 207   1              if(MAX_RT)
 208   1                      if(clear)                         // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
 209   1                              SPI_RW(FLUSH_TX);
 210   1              SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中断标志
 211   1              IRQ = 1;
 212   1              if(TX_DS)
 213   1                      return(0x00);
 214   1              else
 215   1                      return(0xff);
 216   1      }
 217          /**************************************************/
 218          
 219          /**************************************************
 220          函数:CheckButtons()
 221          
 222          描述:
 223              检查按键是否按下,按下则发送一字节数据
 224          /**************************************************/
 225          void CheckButtons()
 226          {
 227   1              uchar i=0;
 228   1              if(flag)                           // 接受完成
 229   1              {
 230   2                      flag = 0;                      // 清标志
 231   2                      R_S_Byte('N');
 232   2                      R_S_Byte(status);
 233   2                      for(i=0;i<32;i++)
 234   2                         R_S_Byte(RX_BUF[i]);
 235   2      
 236   2                      LED = 0xff;                    // 关闭LED
 237   2              }
 238   1      }
 239          /**************************************************/
C51 COMPILER V7.00  NRF24L01                                                               04/05/2010 10:30:48 PAGE 5   

 240          //************************************串口初始化*********************************************************
 241          void StartUART( void )
 242          {                                                       //波特率2400
 243   1           SCON = 0x50;
 244   1           TMOD = 0x20;
 245   1           TH1 = 0xF3;
 246   1           TL1 = 0xF3;
 247   1           PCON = 0x00;
 248   1           TR1 = 1;
 249   1      }
 250          //************************************通过串口将接收到数据发送给PC端**************************************
 251          void R_S_Byte(uchar R_Byte)
 252          {       
 253   1               SBUF = R_Byte;  
 254   1          while( TI == 0 );                           //查询法
 255   1               TI = 0;    
 256   1      }
 257          
 258          void exter0() interrupt 0
 259          {
 260   1              sta = SPI_Read(STATUS);   // 读状态寄存器
 261   1         if(RX_DR)                              // 判断是否接受到数据
 262   1              {
 263   2                      status=sta;
 264   2                      status&=0x0e;
 265   2                      status>>=1;
 266   2                      SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);  // 从RX FIFO读出数据
 267   2                      flag = 1;
 268   2              }
 269   1              SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除RX_DS中断标志      
 270   1      }
 271          void Init_24L01()
 272          {
 273   1              CE=0;
 274   1              SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);//写接收通道0的接收地址,与发送地址相同
 275   1              SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, TX_ADR_WIDTH); //写接收通道1的接收地址
 276   1              SPI_Write_Buf(WRITE_REG + RX_ADDR_P2, RX_ADDRESS2, 1);//写接收通道2的接收地址
 277   1              SPI_Write_Buf(WRITE_REG + RX_ADDR_P3, RX_ADDRESS3, 1);//写接收通道3的接收地址
 278   1              SPI_Write_Buf(WRITE_REG + RX_ADDR_P4, RX_ADDRESS4, 1);//写接收通道4的接收地址
 279   1              SPI_Write_Buf(WRITE_REG + RX_ADDR_P5, RX_ADDRESS5, 1);//写接收通道5的接收地址
 280   1              SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0选择和发送通道相同有效数据宽度,32字节长度
 281   1              SPI_RW_Reg(WRITE_REG + RX_PW_P1, TX_PLOAD_WIDTH);//32字节长度
 282   1              SPI_RW_Reg(WRITE_REG + RX_PW_P2, TX_PLOAD_WIDTH);//32字节长度
 283   1              SPI_RW_Reg(WRITE_REG + RX_PW_P3, TX_PLOAD_WIDTH);//32字节长度
 284   1              SPI_RW_Reg(WRITE_REG + RX_PW_P4, TX_PLOAD_WIDTH);//32字节长度
 285   1              SPI_RW_Reg(WRITE_REG + RX_PW_P5, TX_PLOAD_WIDTH);//32字节长度
 286   1              SPI_RW_Reg(WRITE_REG + EN_AA, 0x3f);       // 使能所有接收通道自动应答
 287   1              SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x3f);   // 使能所有接收通道
 288   1              SPI_RW_Reg(WRITE_REG + RF_CH, 40);                 // 选择射频通道0x40
 289   1              SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
 290   1              SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // CRC使能,16位CRC校验,上电
 291   1              SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);  // 自动重发延时等待250us+86us,自动重发10次
 292   1              CE=1;
 293   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    622    ----
   CONSTANT SIZE    =     14    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     68      14
C51 COMPILER V7.00  NRF24L01                                                               04/05/2010 10:30:48 PAGE 6   

   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -