基于NRF24L01的C51单片机收发C语言程序详解.docx
- 文档编号:4122518
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:15
- 大小:347.33KB
基于NRF24L01的C51单片机收发C语言程序详解.docx
《基于NRF24L01的C51单片机收发C语言程序详解.docx》由会员分享,可在线阅读,更多相关《基于NRF24L01的C51单片机收发C语言程序详解.docx(15页珍藏版)》请在冰豆网上搜索。
基于NRF24L01的C51单片机收发C语言程序详解
#include
#include
/***************************************************************************************/
/* NRF24L01的管脚定义,以及在本程序中的应用,VCC接3.3V电源,可以通过5V用电压转换芯片
/*得到,NC管脚可以接可以不接,暂时没用途。
本程序应用于51或者52单片机,是两个模块进行通讯
/*成功的简单指示,现象是:
模块1的KEY1对应模块1的LED1和模块2的LED3,模块1的KEY2对应模
/*块1的LED2和模块2的LED4,发过来也对应。
/***************************************************************************************/
typedefunsignedcharuchar;
typedefunsignedcharuint;
/************************************NRF24L01端口定义***********************************/
sbit NC =P2^0; //没用,不接也可
sbit MISO=P2^5; //数字输出(从SPI数据输出脚)
sbit MOSI=P2^4; //数字输入(从SPI数据输入脚)
sbitSCK =P1^7; //数字输入(SPI时钟)
sbitCE =P2^1; //数字输入(RX或TX模式选择)
sbitCSN=P2^2; //数字输入(SPI片选信号)
sbitIRQ=P2^6; //数字输入(可屏蔽中断)
/************************************按键***********************************************/
sbitKEY1=P3^3;//按键S1
sbitKEY2=P3^2;//按键S2
/************************************数码管位选******************************************/
sbitled1=P1^0;//LED0
sbitled2=P1^1;//LED1
sbit led3=P1^2;//LED2
sbit led4=P1^3;//LED3
sbit led5=P1^4;//LED4
/*********************************************NRF24L01***********************************/
#defineTX_ADR_WIDTH 5 //5uintsTXaddresswidth
#defineRX_ADR_WIDTH 5 //5uintsRXaddresswidth
#defineTX_PLOAD_WIDTH 20 //20uintsTXpayload
#defineRX_PLOAD_WIDTH 20 //20uintsTXpayload
uintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//本地地址
uintconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//接收地址
/***************************************NRF24L01寄存器指令*******************************/
#defineREAD_REG 0x00 //读寄存器指令
#defineWRITE_REG 0x20 //写寄存器指令
#defineRD_RX_PLOAD 0x61 //读取接收数据指令
#defineWR_TX_PLOAD 0xA0 //写待发数据指令
#defineFLUSH_TX 0xE1 //冲洗发送FIFO指令
#defineFLUSH_RX 0xE2 //冲洗接收FIFO指令
#defineREUSE_TX_PL 0xE3 //定义重复装载数据指令
#defineNOP 0xFF //保留
/*************************************SPI(nRF24L01)寄存器地址***********************/
#defineCONFIG 0x00 //配置收发状态,CRC校验模式以及收发状态响应方式
#defineEN_AA 0x01 //自动应答功能设置
#defineEN_RXADDR 0x02 //可用信道设置
#defineSETUP_AW 0x03 //收发地址宽度设置
#defineSETUP_RETR 0x04 //自动重发功能设置
#defineRF_CH 0x05 //工作频率设置
#defineRF_SETUP 0x06 //发射速率、功耗功能设置
#defineSTATUS 0x07 //状态寄存器
#defineOBSERVE_TX 0x08 //发送监测功能
#defineCD 0x09 //地址检测
#defineRX_ADDR_P0 0x0A //频道0接收数据地址
#defineRX_ADDR_P1 0x0B //频道1接收数据地址
#defineRX_ADDR_P2 0x0C //频道2接收数据地址
#defineRX_ADDR_P3 0x0D //频道3接收数据地址
#defineRX_ADDR_P4 0x0E //频道4接收数据地址
#defineRX_ADDR_P5 0x0F //频道5接收数据地址
#defineTX_ADDR 0x10 //发送地址寄存器
#defineRX_PW_P0 0x11 //接收频道0接收数据长度
#defineRX_PW_P1 0x12 //接收频道0接收数据长度
#defineRX_PW_P2 0x13 //接收频道0接收数据长度
#defineRX_PW_P3 0x14 //接收频道0接收数据长度
#defineRX_PW_P4 0x15 //接收频道0接收数据长度
#defineRX_PW_P5 0x16 //接收频道0接收数据长度
#defineFIFO_STATUS 0x17 //FIFO栈入栈出状态寄存器设置
/*************************************函数声明****************************************/
voidDelay(unsignedints); //大延时
voidinerDelay_us(unsignedcharn); //小延时
voidinit_NRF24L01(void); //NRF24L01初始化
uintSPI_RW(uintdat); //根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节
ucharSPI_Read(ucharreg); //从reg寄存器读一字节
voidSetRX_Mode(void); //数据接收配置
uintSPI_RW_Reg(ucharreg,ucharvalue); //写数据value到reg寄存器
uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars); //从reg寄存器读出bytes个字节,通常用来
//读取接收通道数据或接收/发送地址
uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);//把pBuf缓存中的数据写入到nRF24L01,通常用来写入发
//射通道数据或接收/发送地址
unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf); //数据读取后放入rx_buf接收缓冲区中
voidnRF24L01_TxPacket(unsignedchar*tx_buf); //发送tx_buf中数据
/*****************************************长延时*****************************************/
voidDelay(unsignedints)
{
unsignedinti;
for(i=0;i
for(i=0;i
}
/******************************************************************************************/
uint bdatasta; //状态标志
sbitRX_DR=sta^6; //RX_DR为sta的第六位
sbitTX_DS=sta^5; //TX_DS为sta的第五位
sbitMAX_RT=sta^4; //MAX_RT为sta的第四位
/******************************************************************************************/
/*延时函数
/******************************************************************************************/
voidinerDelay_us(unsignedcharn)//延时,us级
{
for(;n>0;n--)
_nop_();
}
/****************************************************************************************/
/*NRF24L01初始化
/***************************************************************************************/
voidinit_NRF24L01(void)
{
inerDelay_us(100);
CE=0; //芯片使能
CSN=1; //禁止SPI
SCK=0; //SPI时钟置低
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,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG+RF_CH,0); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07); //设置发射速率为1MHZ,发射功率为最大值0dB
}
/****************************************************************************************************/
/*函数:
uintSPI_RW(uintuchar)
/*功能:
NRF24L01的SPI写时序-----根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节
/****************************************************************************************************/
uintSPI_RW(uintdat)
{
uinti;
for(i=0;i<8;i++)//循环8次
{
MOSI=(dat&0x80); //dat的最高位输出到MOSI MSBtoMOSI
dat=(dat<<1); //从右向左进一位 shiftnextbitintoMSB..
SCK=1; //拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 SetSCKhigh..
dat|=MISO; //读MISO到dat最低位 capturecurrentMISObit
SCK=0; //SCK置低 ..thensetSCKlowagain
}
return(dat); //返回读出的一字节 returnreaddat
}
/****************************************************************************************************
/*函数:
ucharSPI_Read(ucharreg)
/*功能:
NRF24L01的SPI时序-----------从reg寄存器读一字节
/****************************************************************************************************/
ucharSPI_Read(ucharreg)
{
ucharreg_val;
CSN=0; //CSN置低,开始传输数据 CSNlow,initializeSPIcommunication...
SPI_RW(reg); //选择寄存器 Selectregistertoreadfrom..
reg_val=SPI_RW(0);//然后从该寄存器读数据 ..thenreadregistervalue
CSN=1; //CSN拉高,结束数据传输 CSNhigh,terminateSPIcommunication
return(reg_val); //返回寄存器数据 returnregistervalue
}
/****************************************************************************************************/
/*功能:
NRF24L01读写寄存器函数
/*描述:
写数据value到reg寄存器
/****************************************************************************************************/
uintSPI_RW_Reg(ucharreg,ucharvalue)
{
ucharstatus;
CSN=0; //CSN置低,开始传输数据 CSNlow,initSPItransaction
status=SPI_RW(reg); //选择寄存器,同时返回状态字selectregister
SPI_RW(value); //然后写数据到该寄存器 ..andwritevaluetoit..
CSN=1; //CSN拉高,结束数据传输 CSNhighagain
return(status); //返回状态寄存器 returnnRF24L01statusuchar
}
/****************************************************************************************************/
/*函数:
uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)
/*功能:
用于读数据,reg:
为寄存器地址,pBuf:
为待读出数据地址,uchars:
读出数据的个数
/*描述:
从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址
/****************************************************************************************************/
uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)
{
uintstatus,i;
CSN=0; //CSN置低,开始传输数据 SetCSNlow,initSPItranaction
status=SPI_RW(reg); //选择寄存器,同时返回状态字Selectregistertowritetoandreadstatusuchar
for(i=0;i pBuf[i]=SPI_RW(0);//逐个字节从nRF24L01读出 CSN=1; //CSN拉高,结束数据传输 return(status); //返回状态寄存器 returnnRF24L01statusuchar } /********************************************************************************************************* /*函数: uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars) /*功能: 用于写数据: 为寄存器地址,pBuf: 为待写入数据地址,uchars: 写入数据的个数 /*描述: 把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址 /*********************************************************************************************************/ uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars) { uintstatus,i; CSN=0; //CSN置低,开始传输数据 status=SPI_RW(reg); //选择寄存器,同时返回状态字 inerDelay_us(10); for(i=0;i SPI_RW(*pBuf++);//逐个字节写入nRF24L01 CSN=1; //CSN拉高,结束数据传输 return(status); //返回状态寄存器 } /****************************************************************************************************/ /*函数: voidSetRX_Mode(void) /*功能: 数据接收配置 /****************************************************************************************************/ voidSetRX_Mode(void) { CE=0; SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);//CRC使能,16位CRC校验,上电,接收模式 CE=1; //拉高CE启动接收设备 inerDelay_us(130); } /******************************************************************************************************/ /*函数: unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf) /*功能: 数据读取后放入rx_buf接收缓冲区中 /*************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 NRF24L01 C51 单片机 收发 语言 程序 详解