//很多人全部在找nrf24l01 无线模块c 程序;我以前刚接触无线// |
时用就是nrf24l01模块;搜索了很多程序有很多全部没法直接用;
甚至还怀疑模块是不是被我搞坏了;拿去让她人检测模块又是好;
为避免大家走弯路;我将我程序发出来供大家参考;
这是nrf24l01无线模块pcb图;
下面有Nrf24l01无线模块收发c程序;以下程序经本人亲自测试;
绝对能用!!
1、24L01 模块电源电压是否为3V-3.6V 之间;请注意以下几点: |
5、假如是51系列单片机,晶振请选择11.0592MHz;
模块供电最好用asm1117 | 5v 转3.3v | 稳压 |
测试单片机是stcc52;atc52通用;
收发一体;
候对应接收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; | |
//************************************按 | ||
***************************************************
//***************************************************************************** | |||||||
#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 // 收发地址宽度设置 | |
#define RF_CH | ||
#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 // 发送地址寄存器 |
//**************************************************************************************
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;
/******************************************************************************
************ | |
************/ | |
{
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; return(reg_val); | // CSN low, initialize SPI communication... // Select register to read from.. // ..then read registervalue // 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++) | |
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收发完成中止响应,16位CRC,主接收
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); |
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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务