//===========================================================================//工程名称:NRF24L01无线通讯8051驱动程序//硬件连接:NRF24L01无线通讯模块和8051单片机//===============嘉兴学院电子创新实验室2012年==============================#includereg52.h#includeintrins.htypedefunsignedcharuchar;typedefunsignedintuint;//****************************************IO端口定义***************************************sbitMISO=P2^0;sbitMOSI=P2^1;sbitSCK=P2^2;sbitCE=P2^3;sbitCSN=P2^4;sbitIRQ=P2^2;//***********************************定义待发数据宽度和内容********************************************#defineTX_PLOAD_WIDTH1//1ucharTXpayload#defineRX_PLOAD_WIDTH1//1ucharTXpayloaducharTxBuf[1]={0xaa};ucharRxBuf[1];//*********************************************定义NRF24L01通讯地址宽度和内容*************************************#defineTX_ADR_WIDTH5//5ucharTXaddresswidth#defineRX_ADR_WIDTH5//5ucharRXaddresswidthucharconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//本地地址ucharconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//接收端地址//***************************************NRF24L01寄存器指令*******************************************************#defineREAD_REG0x00//读寄存器指令#defineWRITE_REG0x20//写寄存器指令#defineRD_RX_PLOAD0x61//读取接收数据指令#defineWR_TX_PLOAD0xA0//写入待发数据指令#defineFLUSH_TX0xE1//冲洗发送FIFO指令#defineFLUSH_RX0xE2//冲洗接收FIFO指令#defineREUSE_TX_PL0xE3//定义重复装载数据指令#defineNOP0xFF//保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#defineCONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式#defineEN_AA0x01//自动应答功能设置#defineEN_RXADDR0x02//可用信道设置#defineSETUP_AW0x03//收发地址宽度设置#defineSETUP_RETR0x04//自动重发功能设置#defineRF_CH0x05//工作频率设置#defineRF_SETUP0x06//发射速率、功耗功能设置#defineSTATUS0x07//状态寄存器#defineOBSERVE_TX0x08//发送监测功能#defineCD0x09//地址检测#defineRX_ADDR_P00x0A//频道0接收数据地址#defineRX_ADDR_P10x0B//频道1接收数据地址#defineRX_ADDR_P20x0C//频道2接收数据地址#defineRX_ADDR_P30x0D//频道3接收数据地址#defineRX_ADDR_P40x0E//频道4接收数据地址#defineRX_ADDR_P50x0F//频道5接收数据地址#defineTX_ADDR0x10//本地地址寄存器#defineRX_PW_P00x11//接收频道0接收数据长度#defineRX_PW_P10x12//接收频道0接收数据长度#defineRX_PW_P20x13//接收频道0接收数据长度#defineRX_PW_P30x14//接收频道0接收数据长度#defineRX_PW_P40x15//接收频道0接收数据长度#defineRX_PW_P50x16//接收频道0接收数据长度#defineFIFO_STATUS0x17//FIFO栈入栈出状态寄存器设置//**************************************************************************************voidDelay(uints);//长延时voidinerDelay_us(ucharn);//延时voidinit_NRF24L01(void);//初始化ucharSPI_RW(ucharuchar_data);//SPI读写数据ucharSPI_Read(ucharreg);//SPI读寄存器voidSPI_RW_Reg(ucharreg,ucharvalue);//SPI写寄存器voidSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);//SPI读多字节数据voidSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);//SPI写多字节数据voidSetRX_Mode(void);//数据接收设置voidSetTX_Mode(void);//数据发送设置voidnRF24L01_RxPacket(uchar*rx_buf);//接收数据函数voidnRF24L01_TxPacket(uchar*tx_buf);//发送数据函数//******************************************************************************************ucharbdatasta;//状态标志sbitRX_DR=sta^6;sbitTX_DS=sta^5;sbitMAX_RT=sta^4;//*长延时**********************************************************************************voidDelay(uints){uinti,j;for(i=0;is;i++)for(j=0;j110;j++);}//******************************************************************************************//*延时函数//******************************************************************************************voidinerDelay_us(ucharn){for(;n0;n--)_nop_();}//****************************************************************************************//*NRF24L01初始化//***************************************************************************************voidinit_NRF24L01(void){inerDelay_us(100);CE=0;//StandByI模式CSN=1;//SpidisableSCK=0;//SpiclocklineinitlowSPI_RW_Reg(WRITE_REG+CONFIG,0x5e);//IRQ发送完成中断响应,主发送SPI_RW_Reg(WRITE_REG+EN_AA,0x00);//允许频道0自动应答SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//允许接收地址只有频道0//SPI_RW_Reg(WRITE_REG+SETUP_AW,0x01);//设置接收地址长度,本次设置为3字节//SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x00);//设置禁止自动重发SPI_RW_Reg(WRITE_REG+RF_CH,0x02);//设置信道工作频率,收发必须一致SPI_RW_Reg(WRITE_REG+RF_SETUP,0x0f);//设置发射速率为2MHZ,发射功率为最大值0dBSPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写接收端地址SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//写本地地址SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//设置接收数据长度,本次设置为1字节inerDelay_us(150);}//****************************************************************************************************//*函数:uintSPI_RW(uintuchar_data)//*功能:NRF24L01的SPI读写数据//****************************************************************************************************ucharSPI_RW(ucharuchar_data){ucharbit_ctr;for(bit_ctr=0;bit_ctr8;bit_ctr++)//output8-bit{MOSI=(uchar_data&0x80);//output'uchar_data',MSBtoMOSIuchar_data=(uchar_data1);//shiftnextbitintoMSB..SCK=1;//SetSCKhigh..uchar_data|=MISO;//capturecurrentMISObitSCK=0;//..thensetSCKlowagain}return(uchar_data);//returnreaduchar_data}//****************************************************************************************************//*函数:ucharSPI_Read(ucharreg)//*功能:NRF24L01的SPI读寄存器andclear//****************************************************************************************************ucharSPI_Read(uch