基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx
《基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx》由会员分享,可在线阅读,更多相关《基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
sbitIRQ=P2^6;
//数字输入(可屏蔽中断)
/************************************按键***********************************************/
sbitKEY1=P3^3;
//按键S1
sbitKEY2=P3^2;
//按键S2
/************************************数码管位选******************************************/
sbitled1=P1^0;
//LED0
sbitled2=P1^1;
//LED1
led3=P1^2;
//LED2
led4=P1^3;
//LED3
led5=P1^4;
//LED4
/*********************************************NRF24L01***********************************/
#defineTX_ADR_WIDTH
5
//5uintsTXaddresswidth
#defineRX_ADR_WIDTH
//5uintsRXaddresswidth
#defineTX_PLOAD_WIDTH
20
//20uintsTXpayload
#defineRX_PLOAD_WIDTH
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
//配置收发状态,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
#defineRX_PW_P2
0x13
#defineRX_PW_P3
0x14
#defineRX_PW_P4
0x15
#defineRX_PW_P5
0x16
#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<
s;
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;
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寄存器读一字节
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置低,开始传输数据
CSNlow,initSPItransaction
status=SPI_RW(reg);
//选择寄存器,同时返回状态字selectregister
SPI_RW(value);
//然后写数据到该寄存器
..andwritevaluetoit..
//CSN拉高,结束数据传输
CSNhighagain
return(status);
//返回状态寄存器
returnnRF24L01statusuchar
uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)
/*功能:
用于读数据,reg:
为寄存器地址,pBuf:
为待读出数据地址,uchars:
读出数据的个数
/*描述:
从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址
uintstatus,i;
SetCSNlow,initSPItranaction
//选择寄存器,同时返回状态字Selectregistertowritetoandreadstatusuchar
uchars;
i++)
pBuf[i]=SPI_RW(0);
//逐个字节从nRF24L01读出
//返回状态寄存器
returnnRF24L01statusuchar
/*********************************************************************************************************
uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)
用于写数据:
为待写入数据地址,uchars:
写入数据的个数
把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址
/*********************************************************************************************************/
//选择寄存器,同时返回状态字
inerDelay_us(10);
i++)
SPI_RW(*pBuf++);
//逐个字节写入nRF24L01
//CSN拉高,结束数据传输
//返回状态寄存器
voidSetRX_Mode(void)
数据接收配置
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);
//CRC使能,16位CRC校验,上电,接收模式
CE=1;
//拉高CE启动接收设备
inerDelay_us(130);
/******************************************************************************************************/
unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf)
数据读取后放入rx_buf接收缓冲区中
/*************************