您好,欢迎来到界感财经。
搜索
您的当前位置:首页nrf24l01无线模块NRF24L01模块收发c程序样稿

nrf24l01无线模块NRF24L01模块收发c程序样稿

来源:界感财经



//很多人全部在找nrf24l01 无线模块c 程序;我以前刚接触无线//

时用就是nrf24l01模块;搜索了很多程序有很多全部没法直接用;

甚至还怀疑模块是不是被我搞坏了;拿去让她人检测模块又是好;

为避免大家走弯路;我将我程序发出来供大家参考;

这是nrf24l01无线模块pcb图;

下面有Nrf24l01无线模块收发c程序;以下程序经本人亲自测试;

绝对能用!!

124L01 模块电源电压是否为3V-3.6V 之间;请注意以下几点:

4、先用程序进行调试,假如IO 口不一样,请更改IO 口或相关时序;

5、假如是51系列单片机,晶振请选择11.0592MHz

模块供电最好用asm1117

5v 3.3v

稳压

测试单片机是stcc52atc52通用;

收发一体;
















候对应接收led会闪闪发光;很简单~假如要实现其它更优异功
效;自己发掘吧~~

务必将硬件连接正确;不然;它不会工作~~当然做什么全部要严谨~~错一点就差大了~~
《《收发一体程序》》

#include<reg52.h>

#include <intrins.h>

typedef unsigned char uchar;



typedefunsigned char uint;

//****************************************NRF24L01

***************************************

sbit MISO

=P1^3;

sbit MOSI

=P1^4;

sbit SCK

=P1^2;

sbit CE

=P1^1;

sbit CSN

=P3^2;

sbit IRQ

=P3^3;

//************************************

***************************************************

//*****************************************************************************
sbit KEY=P2^0;
sbit led=P2^1;
**************

#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 payload

uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};

//当地地址

uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};

//接收地址

//***************************************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 #define SETUP_AW

0x03 // 收发地址宽度设置
0x02 // 可用信道设置

#define RF_CH
#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
#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

0x10 // 发送地址寄存器
0x11 // 接收频道0 接收数据长度
0x12 // 接收频道0 接收数据长度
0x13 // 接收频道0 接收数据长度
0x14 // 接收频道0 接收数据长度
0x15 // 接收频道0 接收数据长度
0x16 // 接收频道0 接收数据长度
0x17 // FIFO 栈入栈出状态寄存器设置

//**************************************************************************************
voidDelay(unsigned int s);

void inerDelay_us(unsigned char n); void init_NRF24L01(void);


void SetRX_Mode(void);

uintSPI_RW_Reg(uchar reg, uchar value);
uintSPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uintSPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
unsignedchar nRF24L01_RxPacket(unsigned char* rx_buf);
voidnRF24L01_TxPacket(unsigned char * tx_buf);

//*****************************************

*****************************************

void Delay(unsigned int s)
{




unsignedint i;
for(i=0;i<s; i++);
for(i=0;i<s; i++);
}
//******************************************************************************************
uintbdata sta; //状态标志
sbitRX_DR =sta^6;
sbitTX_DS =sta^5;
sbitMAX_RT =sta^4;
/******************************************************************************

************
/*延时函数


************/
void inerDelay_us(unsigned char n)

{
for(;n>0;n--)
_nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************** **********/

voidinit_NRF24L01(void)
{
inerDelay_us(100);
CE=0; //chip enable
CSN=1; // Spi disable
SCK=0; //
SPI_Write_Buf(WRITE_REG+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //写当地地址
SPI_Write_Buf(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); // 许可接收地址只有频道0,假

必需一致

SPI_RW_Reg(WRITE_REG+ RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,此次设置为32字节
SPI_RW_Reg(WRITE_REG+ RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB
}
/****************************************************************************************************

/*函数:uint SPI_RW(uint uchar) /*功效:NRF24L01SPI 写时序




/****************************************************************************************************/
uintSPI_RW(uint uchar)
{
uintbit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)// output 8-bit
{

MOSI = (uchar & 0x80);

// output 'uchar', MSB to MOSI

uchar = (uchar << 1);

// shift next bit into MSB..

SCK = 1;

// Set SCK high..

uchar |= MISO;

// capture current MISO bit

}

SCK = 0;


}
/******************************************************************************

**********************
/*函数:ucharSPI_Read(uchar reg)
/*功效:NRF24L01SPI时序
/****************************************************************************************************/
ucharSPI_Read(uchar reg)
{

uchar reg_val;




CSN = 0;
SPI_RW(reg);
reg_val = SPI_RW(0); CSN = 1;

return(reg_val);

// CSN low, initialize SPI communication... // Select register to read from..

// ..then read registervalue
// CSN high, terminate SPI communication

// return register value

}
/****************************************************************************************************/
/*功效:NRF24L01读写寄存器函数
/******************************************************************************

uint SPI_RW_Reg(uchar reg, uchar value)
**********************/

{


CSN = 0;

// CSN low, init SPI transaction

status = SPI_RW(reg);

// select register

SPI_RW(value);

// ..and write value to it..

CSN = 1;

// CSN high again

return(status);

// return nRF24L01 status uchar

}
/****************************************************************************** **********************/

/*函数:uintSPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功效:用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据个数
/****************************************************************************************************/
uintSPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uintstatus,uchar_ctr;

CSN = 0;

// Set CSN low, init SPI tranaction

status = SPI_RW(reg);

// Select register to write to and read status uchar

for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)

CSN = 1;

return(status);

// return nRF24L01 status uchar

}
/*********************************************************************************************************
/*函数:uintSPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功效:用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据个数/****************************************************************************** ***************************/

uintSPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uintstatus,uchar_ctr;

CSN= 0; //SPI使能
status= SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr<uchars; uchar_ctr++) //
SPI_RW(*pBuf++);

CSN = 1;

//

//关闭SPI

return(status);

}

**********************/
/******************************************************************************

/******************************************************************************

**********************/
voidSetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG+ CONFIG, 0x0f); //IRQ收发完成中止响应,16CRC,主接收
CE= 1;

}

inerDelay_us(130);




/******************************************************************************************************/
/*函数:unsignedchar nRF24L01_RxPacket(unsigned char* rx_buf)
/*功效:数据读取后放如rx_buf接收缓冲区中
/******************************************************************************************************/
unsignedchar nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsignedchar revale=0;

sta=SPI_Read(STATUS);

// 读取状态寄存其来判定数据接收情况

if(RX_DR)

// 判定是否接收到数据

{

CE = 0;

//SPI 使能

revale =1; //读取数据完成标志

}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT全部置高为1,经过写1来清楚中止标志
returnrevale;
}
/***********************************************************************************************************

/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) /*功效:发送 tx_buf 中数据



/**********************************************************************************************************/
voidnRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0; //StandByI模式
SPI_Write_Buf(WRITE_REG+ RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址

SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);

// 装载数据

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);

// IRQ 收发完成中止响应,16

CRC,主发送

inerDelay_us(10);
CE=1; //置高CE,激发数据发送
}
************************************************************

voidmain(void)
{
unsignedchar tf =0;
unsignedchar TxBuf[20]={0}; //
unsignedchar RxBuf[20]={0};
init_NRF24L01();
TxBuf[1]= 1 ;

nRF24L01_TxPacket(TxBuf);

// Transmit Tx buffer data


Delay(6000);



while(1)
{
if(KEY==0 )
{
led=0;
Delay(200);
led=1;

TxBuf[1]= 1 ;
tf= 1 ;
}

if (tf==1)
{



Delay(1000);
}
//***********************************************************************************************
SetRX_Mode();
nRF24L01_RxPacket(RxBuf);
if(RxBuf[1])
{

if(

RxBuf[1]==1)


{



led=0;
Delay(200);
led=1;
}
Delay(1000);
}

RxBuf[1]= 0x00;
}

}




Copyright © 2019- jgsqfw.com 版权所有

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务