![[信息与通信]51单片机应用之无线通讯模块NRF24L.doc_第1页](http://file.renrendoc.com/FileRoot1/2019-1/5/7a9451b8-6b38-462c-900d-0144749c0a07/7a9451b8-6b38-462c-900d-0144749c0a071.gif)
![[信息与通信]51单片机应用之无线通讯模块NRF24L.doc_第2页](http://file.renrendoc.com/FileRoot1/2019-1/5/7a9451b8-6b38-462c-900d-0144749c0a07/7a9451b8-6b38-462c-900d-0144749c0a072.gif)
![[信息与通信]51单片机应用之无线通讯模块NRF24L.doc_第3页](http://file.renrendoc.com/FileRoot1/2019-1/5/7a9451b8-6b38-462c-900d-0144749c0a07/7a9451b8-6b38-462c-900d-0144749c0a073.gif)
![[信息与通信]51单片机应用之无线通讯模块NRF24L.doc_第4页](http://file.renrendoc.com/FileRoot1/2019-1/5/7a9451b8-6b38-462c-900d-0144749c0a07/7a9451b8-6b38-462c-900d-0144749c0a074.gif)
![[信息与通信]51单片机应用之无线通讯模块NRF24L.doc_第5页](http://file.renrendoc.com/FileRoot1/2019-1/5/7a9451b8-6b38-462c-900d-0144749c0a07/7a9451b8-6b38-462c-900d-0144749c0a075.gif)
已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
30、51单片机应用之.无线通讯模块NRF24L01+(一)基础知识篇今天刚调试好,先看图吧!这张是AT89C2051控制NRF24L01+做发射调试。 看看NRF24L01细节吧! 这是LCD屏显示:AT89S52做接收测试: 正在接收时的显示:接收到数据后显示32个数据值: 无线模块NRF24L01+应用上篇结束,敬请期待NRF24L01+下篇的调试部分。31、51单片机应用之.无线通讯模块NRF24L01+(二)模块调试篇 32、51单片机应用之.无线通讯模块NRF24L01+(三)发送与接收模块的联调33、51单片机应用之.无线通讯模块NRF24L01+(四)举例应用34、补充NRF24L01+之LED调试篇 写了前面四篇关于NRF24L01通讯调试的文章,看来大家还是很喜欢,有帮助的。有很多大学生朋友问我说,我们没有两个LCD来显示调试状态,连一个也没有,能不能用几个LED来显示调试状态呢?因此我就写这篇补充调试的文章,就用P0口的8个LED来显示调试NRF24L01到成功进行数据通讯。 先把51单片机的最小系统准备好,还有8个LED的小电路板,如果你的LED就在系统板上那省了这一步。 8个LED的小板子电路很简单,但你焊接要可靠,不然电路本身都不稳定,后面对判断故障会产生很大影响。 NRF24L01+模块电路还是前面说过的那样: 相同的两个模块的板子。好!假设我们用P0口来作LED显示、用P1口来作模块接口,下面我们先写一段最简单的程序,来确认LED电路,和P0、P1口的完好!#include #include #define uint unsigned inttypedef unsigned char uchar;/*/ 延时函数/ 在晶振为12MHz时,延时count毫秒/*void Delayms(uint count) uint i; while(count-) for(i=0;i80;i+) _nop_(); _nop_(); _nop_(); _nop_(); _nop_();/*/ 主函数/*void main() P0=0x00; /P0口LED点亮 P1=0x00; /P1口LED点亮 P2=0x00; P3=0x00; Delayms(2000); /延时2秒 while(1) P0=P0;/将P0口数据取反,原来亮的就熄灭 P1=P1;/将P1口数据取反,原来亮的就熄灭 P2=P2; P3=P3; Delayms(500); /延时半秒 这是段极简单的程序,用来检测单片机电路连接的正确性,和口的工作状态是否正常,为后面调试做好准备。它的工作状态如下:同样的,把的接口再接到口,看看它是否一样的在全部闪烁。做好了这步,准备工作就算完成了。 接下来我们把+的模块插上,要注意,接口要对清楚,电源要连接正确:接下来我们写发送程序:/*/ NRF24L01+模块发射程序/ 用8个LED调试/ Txz001 2012.05.16/*#include typedef unsigned char uchar; /将无符号字节类型重定义为uchartypedef unsigned int uint; /将无符号整数类型重定义为Uint/*NRF24L01函数定义* void delayms(uint t);/毫秒延时void init_NRF24L01(void); /模块初始化函数uchar SPI_RW(uchar reg); /基本SPI读写时序uchar SPI_Read(uchar reg); /从寄存器reg读一个字节void SetRX_Mode(void); /设置接收模式uchar SPI_RW_Reg(uchar reg, uchar value); /向寄存器写一个字节uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); / 从缓冲器读出uchars字节的数据uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); /向缓冲器写进uchars字节的数据void nRF24L01_TxPacket(uchar * tx_buf); /启动一次发送uchar nRF24L01_RxPacket(uchar * rx_buf);/读取接收的数据,放入rx_buf数组/*NRF24L01模块IO端口定义* sbit CE=P10;sbit CSN =P11;sbit SCK =P12;sbit MOSI =P13;sbit MISO =P14;sbit IRQ =P15;/*NRF24L01常量* #define TX_ADR_WIDTH 5 /发送地址宽度 5字节#define RX_ADR_WIDTH 5 /接收地址宽度 5字节#define TX_PLOAD_WIDTH 32 / 发送数据宽度 32字节#define RX_PLOAD_WIDTH 32 /接收数据的宽度 32字节uchar const TX_ADDRESSTX_ADR_WIDTH= 0x01,0x02,0x03,0x04,0x05; /本地地址 uchar const RX_ADDRESSRX_ADR_WIDTH= 0x01,0x02,0x03,0x04,0x05; /接收地址 /*NRF24L01寄存器指令* #define READ_REG 0x00 / 读寄存器指令 #define WRITE_REG 0x20 / 写寄存器指令 #define RD_RX_PLOAD 0x61 / 读取接收数据指令 #define WR_TX_PLOAD 0xA0 / 写待发数据指令 #define FLUSH_TX 0xE1 /清空发送缓冲区/*SPI(nRF24L01)寄存器地址常量* #define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式 #define EN_AA 0x01 / 自动应答功能设置 #define EN_RXADDR 0x02 / 可用信道设置 #define SETUP_AW 0x03 / 收发地址宽度设置 #define SETUP_RETR 0x04 / 自动重发功能设置 #define RF_CH 0x05 / 工作频率设置 #define RF_SETUP 0x06 / 发射速率、功耗功能设置 #define STATUS 0x07 / 状态寄存器 #define OBSERVE_TX 0x08 / 发送监测功能 #define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址 #define RX_ADDR_P1 0x0B / 频道1接收数据地址 #define RX_ADDR_P2 0x0C / 频道2接收数据地址 #define RX_ADDR_P3 0x0D / 频道3接收数据地址 #define RX_ADDR_P4 0x0E / 频道4接收数据地址 #define RX_ADDR_P5 0x0F / 频道5接收数据地址 #define TX_ADDR 0x10 / 发送地址寄存器 #define RX_PW_P0 0x11 / 接收频道0接收数据长度 #define RX_PW_P1 0x12 / 接收频道0接收数据长度 #define RX_PW_P2 0x13 / 接收频道0接收数据长度 #define RX_PW_P3 0x14 / 接收频道0接收数据长度 #define RX_PW_P4 0x15 / 接收频道0接收数据长度 #define RX_PW_P5 0x16 / 接收频道0接收数据长度 #define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置 /*毫秒延时子程序*/void delayms(uint t) /约延时t毫秒 uint i; while(t-) for(i=0;i125;i+); /* /*函数:uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI写时序 /*/ uchar SPI_RW(uchar uuchar) uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / 输出8个位 MOSI = (uuchar & 0x80); /输出uuhar的最高位 uuchar = (uuchar 1); /左移一位 SCK = 1; / 将时钟线置1 uuchar |= MISO; /同时读取STATUS SCK = 0; /然后再将时钟线置0 return(uuchar); /返回读取的值 /* /*函数:uchar SPI_Read(uchar reg) /*功能:NRF24L01的SPI读取一个字节时序 /*/uchar SPI_Read(uchar reg) uchar reg_val; CSN = 0; /CSN置0,允许指令操作 SPI_RW(reg); /写一条reg指令 reg_val = SPI_RW(0); /读取reg的值到reg_val CSN = 1; /CSN置1,禁示操作 return(reg_val); /返回读取的值/* /*功能:NRF24L01写一个字节到寄存器函数 /*/ uchar SPI_RW_Reg(uchar reg, uchar value) uchar status; CSN = 0; / CSN置0,允许操作 status = SPI_RW(reg); /这指令,并读STATUS SPI_RW(value); /写数据值到reg CSN = 1; / CSN置1,禁止操作 return(status); / return nRF24L01 status uchar /* /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) /*功能: 用于写数据:reg:为寄存器地址,/* pBuf:为待写入数据地址,/* uchars:写入数据的个数 /*/ uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) uchar status,uchar_ctr; CSN = 0; /SPI使能 status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctruchars; uchar_ctr+) / SPI_RW(*pBuf+); CSN = 1; /关闭SPI return(status); / /* /*NRF24L01初始化 /*/ void init_NRF24L01(void) delayms(1); CE=0; / 射频停止工作 CSN=1; / 停止寄存器读写 SCK=0; /时种信号停止读写 IRQ=1;/中断复位 SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); / 频道0自动 ACK应答禁止 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); /禁止自动发送 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允许接收地址只有频道0, SPI_RW_Reg(WRITE_REG + RF_CH, 1); / 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /设置发射速率为2MHZ,发射功率为最大值0dB /* /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) /*功能:发送 tx_buf中数据 /*/ void nRF24L01_TxPacket(unsigned char * tx_buf) CE=0; /StandBy I模式 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 装载接收端地址 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);/ 装载数据 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / IRQ收发完成中断响应,16位CRC,主发送 CE=1; /置高CE,激发数据发送 delayms(1); /*/ 主函数/*void main() uchar TxBuf32; uchar status; /定义一个变量用来装读取到的STATUS数值 init_NRF24L01();/NRF24L01初始化 SPI_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州毕节市融资担保集团有限公司及下属子公司招聘12名工作人员政审及人员笔试历年参考题库附带答案详解
- 2025秋季国家管网集团华南公司(广东省管网公司)高校毕业生招聘笔试历年参考题库附带答案详解
- 2025广东中山市城市管理和综合执法局招聘雇员5人考前自测高频考点模拟试题及答案详解(夺冠)
- 2025福建福州市仓山区人才发展有限公司招聘2人笔试历年参考题库附带答案详解
- 2025福建漳州市芗江人力资源服务有限公司招聘若干人笔试历年参考题库附带答案详解
- 2025甘肃路桥精石建材科技有限公司厨师岗员工招聘1人笔试历年参考题库附带答案详解
- 2025浙江嘉兴幸福嘉保安服务有限公司招聘54人(二)笔试历年参考题库附带答案详解
- 2025天津领创信息咨询有限公司招聘10人笔试历年参考题库附带答案详解
- 2025中国太平洋财险南昌中支招聘小额人伤专员2人笔试历年参考题库附带答案详解
- 2025广东肇庆市怀集县卫生健康局赴高校招聘卫生专业技术人员52人模拟试卷及答案详解(新)
- 中学窗帘采购项目方案投标文件(技术文件)
- 渔政执法快艇管理办法
- 2025年中远海运集团招聘笔试备考题库(带答案详解)
- 2025至2030光纤电缆(光缆)行业发展趋势分析与未来投资战略咨询研究报告
- 高桩码头施工培训课件
- 2025年Bio-based+100+生物基材料创新应用案例
- 中通规章管理制度
- 城市地理学第二版第三章城市的产生与发展 第四章城市化原理课件
- 现代文献检索与利用3-文献检索技术
- 2025年(广东省协会 )房屋安全检测鉴定技术培训-机考历年真题考前冲刺题
- 汉服文化知识普及
评论
0/150
提交评论