无线模块NRF24L01基于C51单片机_双向通讯C语言程序(中文详解)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includereg52.h#includeintrins.h/***************************************************************************************//*NRF24L01的管脚定义,以及在本程序中的应用,VCC接3.3V电源,可以通过5V用电压转换芯片/*得到,NC管脚可以接可以不接,暂时没用途。本程序应用于51或者52单片机,是两个模块进行通讯/*成功的简单指示,现象是:模块1的KEY1对应模块1的LED1和模块2的LED3,模块1的KEY2对应模/*块1的LED2和模块2的LED4,发过来也对应。/***************************************************************************************/typedefunsignedcharuchar;typedefunsignedcharuint;/************************************NRF24L01端口定义***********************************/sbitNC=P2^0;//没用,不接也可sbitMISO=P2^5;//数字输出(从SPI数据输出脚)sbitMOSI=P2^4;//数字输入(从SPI数据输入脚)sbitSCK=P1^7;//数字输入(SPI时钟)sbitCE=P2^1;//数字输入(RX或TX模式选择)sbitCSN=P2^2;//数字输入(SPI片选信号)sbitIRQ=P2^6;//数字输入(可屏蔽中断)/************************************按键***********************************************/sbitKEY1=P3^3;//按键S1sbitKEY2=P3^2;//按键S2/************************************数码管位选******************************************/sbitled1=P1^0;//LED0sbitled2=P1^1;//LED1sbitled3=P1^2;//LED2sbitled4=P1^3;//LED3sbitled5=P1^4;//LED4/*********************************************NRF24L01***********************************/#defineTX_ADR_WIDTH5//5uintsTXaddresswidth发送地址宽度#defineRX_ADR_WIDTH5//5uintsRXaddresswidth接收地址宽度#defineTX_PLOAD_WIDTH20//20uintsTXpayload有效载荷装载货物#defineRX_PLOAD_WIDTH20//20uintsTXpayloaduintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//本地地址uintconstRX_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(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;is;i++);for(i=0;is;i++);}/******************************************************************************************/uintbdatasta;//状态标志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(;n0;n--)_nop_();}/****************************************************************************************//*NRF24L01初始化/***************************************************************************************/voidinit_NRF24L01(void){inerDelay_us(100);CE=0;//芯片使能CSN=1;//禁止SPISCK=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,如果需要多频道可以参考Page21SPI_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;i8;i++)//循环8次{MOSI=(dat&0x80);//dat的最高位输出到MOSIMSBtoMOSIdat=(dat1);//从右向左进一位shiftnextbitintoMSB..SC

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功