完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
以下是基于51单片机,代码精简就不废话了,直接上代码。(若需要STM32等其他单片机可私信我)
/************************************************************* NRF24L01头文件 ***************************************************************/ #ifndef _NRF24L01_H_ #define _NRF24L01_H_ #include #define uchar unsigned char #define uint unsigned int #define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节 #define RX_ADDR_WITDH 5//接收地址宽度设置为5个字节 #define TX_DATA_WITDH 1//发送数据宽度 #define RX_DATA_WITDH 1//接收数据宽度 /*******************命令寄存器***************************/ #define R_REGISTER 0x00//读取配置寄存器 #define W_REGISTER 0x20//写配置寄存器 #define R_RX_PAYLOAD 0x61//读取RX有效数据 #define W_TX_PAYLOAD 0xa0//写TX有效数据 #define FLUSH_TX 0xe1//清除TXFIFO寄存器 #define FLUSH_RX 0xe2//清除RXFIFO寄存器 /******************寄存器地址****************************/ #define CONFIG 0x00//配置寄存器 #define EN_AA 0x01//使能自动应答 #define EN_RXADDR 0x02//接收通道使能0-5个通道 #define SETUP_RETR 0x04//建立自动重发 #define RF_CH 0x05//射频通道设置 #define RF_SETUP 0x06//射频寄存器 #define STATUS 0x07//状态寄存器 #define RX_ADDR_P0 0x0a//数据通道0接收地址 #define TX_ADDR 0x10//发送地址 #define RX_PW_P0 0x11//P0通道数据宽度设置 /**********************NRF24L01函数定义************************/ uchar NRFACK(); //延时函数 void NRF24L01Int(); //NRF24L01初始化函数 uchar NRFSPI(uchar date); //SPI时序 uchar NRFReadReg(uchar RegAddr); //SPI读寄存器1字节函数 uchar NRFWriteReg(uchar RegAddr,uchar date);//SPI写寄存器1字节函数 uchar NRFReadRxDate(uchar RegAddr,uchar *RxDate,uchar DateLen); //SPI读取RXFIFO数据 uchar NRFWriteTxDate(uchar RegAddr,uchar *TxDate,uchar DateLen);//SPI写入数据到TXFIFO void NRFSetTxMode(uchar *TxDate); //NRF设置为发送模式并发送数据 uchar NRFCheckACK(); //用于发送模式接收应答信号 void NRFSetRXMode(); //NRF设置为接收模式并接收数据 void NRFGetDate(); //接收数据 /**********************NRF24L01引脚定义************************/ ***it CE=P2^7; //RX/TX模式选择端 ***it IRQ=P2^4; //可屏蔽中断端 ***it CSN=P2^2; //SPI片选端//就是SS ***it MOSI=P2^3;//SPI主机输出从机输入端 ***it MISO=P2^5;//SPI主机输入从机输出端 ***it SCLK=P2^6;//SPI时钟端 /**********************NRF24L01变量定义************************/ uchar RevTempDate[2];//接收数据缓存 uchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址 /**********************NRF24L01状态标志************************/ uchar bdata sta; //状态标志 ***it RX_DR=sta^6; //接收完成标志 ***it TX_DS=sta^5; //发送完成标志 ***it MAX_RT=sta^4;//接收达到最大长度标志 /********************************************************* 函数名称:void NRFDelay(uint t) 函数作用:延时函数 参数说明: *********************************************************/ void NRFDelay(uint t) { uint x,y; for(x=t;x>0;x--) for(y=110;y>0;y--); } /********************************************************* 函数名称:void NRF24L01Int() 函数作用:NRF24L01初始化函数 参数说明: *********************************************************/ void NRF24L01Int() { NRFDelay(2);//开机延时 CE=0; //设置成接收模式 CSN=1; //关闭片选 SCLK=0; //拉低时钟信号线 IRQ=1; //关闭中断使能 } /********************************************************* 函数名称:uchar NRFSPI(uchar date) 函数作用:SPI时序 参数说明: *********************************************************/ uchar NRFSPI(uchar date) { uchar i; for(i=0;i<8;i++) //循环8次,发送8位数据,数据从高到低发送与接收 { if(date&0x80) //数据为1 MOSI=1; else MOSI=0; date<<=1; //向左移动一位 SCLK=1; //拉高时钟信号线 if(MISO) //nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 date|=0x01;//读MISO到byte最低位 SCLK=0; //置低时钟信号线 } return(date); //返回读出的一字节 } /********************************************************* 函数名称:uchar NRFReadReg(uchar RegAddr) 函数作用:SPI读寄存器1字节函数 参数说明:RegAddr寄存器地址 *********************************************************/ uchar NRFReadReg(uchar RegAddr) { uchar BackDate; //定义用于暂存接收数据 CSN=0; //启动时序 NRFSPI(RegAddr); //写寄存器地址 BackDate=NRFSPI(0x00);//写入读寄存器指令 CSN=1; //关闭时序 return(BackDate); //返回数据 } /********************************************************* 函数名称:uchar NRFWriteReg(uchar RegAddr,uchar date) 函数作用:SPI写寄存器1字节函数 参数说明:RegAddr寄存器地址,date待写入的数据 *********************************************************/ uchar NRFWriteReg(uchar RegAddr,uchar date) { uchar BackDate; //定义用于暂存接收数据 CSN=0; //启动时序 BackDate=NRFSPI(RegAddr);//写入寄存器地址 NRFSPI(date); //写入数据 CSN=1; //关闭时序 return(BackDate); //返回数据 } /********************************************************* 函数名称:uchar NRFReadRxDate(uchar RegAddr,uchar *RxDate,uchar DateLen) 函数作用:SPI读取RXFIFO数据 参数说明:RegAddr寄存器地址,*RxDate读取的数据,DateLen数据长度 *********************************************************/ uchar NRFReadRxDate(uchar RegAddr,uchar *RxDate,uchar DateLen) { uchar BackDate,i; CSN=0; //启动时序 BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址 for(i=0;i { RxDate=NRFSPI(0); } CSN=1; //关闭时序 return(BackDate); //返回状态 } /********************************************************* 函数名称:uchar NRFReadRxDate(uchar RegAddr,uchar *RxDate,uchar DateLen) 函数作用:SPI写入数据到TXFIFO 参数说明:RegAddr寄存器地址,*RxDate发送的数据,DateLen数据长度 *********************************************************/ uchar NRFWriteTxDate(uchar RegAddr,uchar *TxDate,uchar DateLen) { uchar BackDate,i; CSN=0; //启动时序 BackDate=NRFSPI(RegAddr);//写入要写入寄存器的地址 for(i=0;i NRFSPI(*TxDate++); } CSN=1; //关闭时序 return(BackDate); //返回状态 } /********************************************************* 函数名称:void NRFSetTxMode(uchar *TxDate) 函数作用:NRF设置为发送模式并发送数据 参数说明: *********************************************************/ void NRFSetTxMode(uchar *TxDate) { CE=0; NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH); //写寄存器指令+P0地址使能指令+发送地址+地址宽度 NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同 NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH); //写入数据 /******下面有关寄存器配置**************/ NRFWriteReg(W_REGISTER+EN_AA,0x01); //使能接收通道0自动应答 NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); //使能接收通道0 NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a); //自动重发延时等待250us+86us,自动重发10次 NRFWriteReg(W_REGISTER+RF_CH,0x40); //选择射频通道0x40 NRFWriteReg(W_REGISTER+RF_SETUP,0x07); //数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 NRFWriteReg(W_REGISTER+CONFIG,0x0e); //CRC使能,16位CRC校验,上电 CE=1; NRFDelay(5); //延时,确定设置模式生效 } /********************************************************* 函数名称:uchar NRFCheckACK() 函数作用:用于发送模式接收应答信号 参数说明: *********************************************************/ uchar NRFCheckACK() { sta=NRFReadReg(R_REGISTER+STATUS); //返回状态寄存器 if(TX_DS||MAX_RT) //发送完毕中断 { NRFWriteReg(W_REGISTER+STATUS,0xff);//清除TX_DS或MAX_RT中断标志 CSN=0; //启动时序 NRFSPI(FLUSH_TX); //用于清空TXFIFO CSN=1; //关闭时序 return(0); //数据发送成功,返回0 } else return(1); //数据未发送成功,返回1 } /********************************************************* 函数名称:void NRFSetRXMode() 函数作用:NRF设置为接收模式并接收数据 参数说明: *********************************************************/ void NRFSetRXMode() { CE=0; NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//接收设备接收通道0使用和发送设备相同的发送地址 NRFWriteReg(W_REGISTER+EN_AA,0x01); //使能接收通道0自动应答 NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); //使能接收通道0 NRFWriteReg(W_REGISTER+RF_CH,0x40); //选择射频通道0x40 NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH); //接收通道0选择和发送通道相同有效数据宽度 NRFWriteReg(W_REGISTER+RF_SETUP,0x07); //数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 NRFWriteReg(W_REGISTER+CONFIG,0x0f); //CRC使能,16位CRC校验,上电,接收模式 CE = 1; NRFDelay(5); //延时,确定设置模式生效 } /********************************************************* 函数名称:void NRFGetDate() 函数作用:接收数据 参数说明: *********************************************************/ void NRFGetDate() { sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器 if(RX_DR) // 判断是否接收到数据 { CE=0; //待机 NRFReadRxDate(R_RX_PAYLOAD,RevTempDate,RX_DATA_WITDH);//从RXFIFO读取数据 NRFWriteReg(W_REGISTER+STATUS,0xff);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清除中断标 CSN=0; //启动时序 NRFSPI(FLUSH_RX); //用于清空FIFO CSN=1; //关闭时序 } } #endif 主函数页 /************************************************************* 无线病房呼叫系统呼叫端 补充说明: ***************************************************************/ #include #include /**************************引脚定义****************************/ ***it key_1=P3^0;//八个呼叫按键 ***it key_2=P3^1; ***it key_3=P3^2; ***it key_4=P3^3; ***it key_5=P3^4; ***it key_6=P3^5; ***it key_7=P3^6; ***it key_8=P3^7; ***it led=P1^1;//LED工作指示灯 /******************************************************** 函数名称:void scan() 函数作用:按键检测与处理 参数说明: ********************************************************/ void scan() { if(P3!=0xff) //有呼叫按键按下 { if(key_1==0) //如果1号病房呼叫 { NRFSetTxMode("1"); //发送数据 while(NRFCheckACK());//检测是否发送完毕 } if(key_2==0) //如果2号病房呼叫 { NRFSetTxMode("2"); //发送数据 while(NRFCheckACK());//检测是否发送完毕 } if(key_3==0) //如果3号病房呼叫 { NRFSetTxMode("3"); //发送数据 while(NRFCheckACK());//检测是否发送完毕 } if(key_4==0) //如果4号病房呼叫 { NRFSetTxMode("4"); //发送数据 while(NRFCheckACK());//检测是否发送完毕 } if(key_5==0) //如果5号病房呼叫 { NRFSetTxMode("5"); //发送数据 while(NRFCheckACK());//检测是否发送完毕 } if(key_6==0) //如果6号病房呼叫 { NRFSetTxMode("6"); //发送数据 while(NRFCheckACK());//检测是否发送完毕 } if(key_7==0) //如果7号病房呼叫 { NRFSetTxMode("7"); //发送数据 while(NRFCheckACK());//检测是否发送完毕 } if(key_8==0) //如果8号病房呼叫 { NRFSetTxMode("8"); //发送数据 while(NRFCheckACK());//检测是否发送完毕 } } } /******************************************************** 函数名称:void main() 函数作用:主函数 参数说明: ********************************************************/ void main() { NRF24L01Int();//NRF24L01初始化 while(1) //死循环 { scan(); //按键检测与处理 led=~led; //LED工作指示灯 } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 02:24 , Processed in 0.761875 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号