51单片机应用之无线通讯模块NRF24L01+_第1页
51单片机应用之无线通讯模块NRF24L01+_第2页
51单片机应用之无线通讯模块NRF24L01+_第3页
51单片机应用之无线通讯模块NRF24L01+_第4页
51单片机应用之无线通讯模块NRF24L01+_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、30、51单片机应用之无线通讯模块 NRF24L01+ (一)基础知识篇NRF24LOH是NqtILc公司生产的一个单芯片射频收发器件,是NRF24L01的升级版,也称W24L01P,是目前应 用比较广泛的一款无线通讯芯片.与前面的版本兼容,具体手册资料屈上非常多.它工作在N.42 5GHM频段, 数据传输率如1或NMbg,自动应答及自动重发功能,可接受阿电平的输入,工作电压1.9%是矶详细的赍料哉不多说了,芯片见下图:CECSMSCKMOSTMISO.3团I 3> QOA Q&Q 斜AHRF24L01 +FN204X4VDDVSSANT2ANTIVDDPA由于高频电路的设计在元

2、件的摆放位置、电路的走线方法都有很高的要求,因此我们直接使用现在成品模 块.这样就们就不用去考虑高频电路的设计问题了.下面是NRF24L02块的PCB图和实物图-12 3 Ar 5 6 78c NKSSQNc E SCOIRsUCCSKMIF面说说模块的各弓l脚的功能:引脚号名称接口性质描述1GND接电源地电源地2VCC接电源正(+3V)电源正。范围在1.9-3. SV3CE模块输入信号由单片机给出信号控制KRF24L01模块内部射频电路工作与否4CSN模块输入信号模块的片选信号,单片机发出信号来控制允许向模块i卖或写数据5SCK模块输入信号串行时钟信号。由单片机发出,来控制模块的读或写的运作

3、节拍.6JIOSI模块输入信号是单片机向NRF24L01模块发送数据的接口7NISO模块输出信号是NRF24L01模块向单片机送数据的接口8IRQ模块输出信号是KRF24L01产生中断信号发送给单片机的接口由上表可以看出,除了电源C+3V) f与电源地。其余接口都直接和单片机的输出口p相接.单片机上的电 源为正5瞬压的,因此也我们可以匮行从单片机上引电源降压后给NKF24L01+供电.电路图如下:今天刚调试好,先看图吧!这张是AT89C2051控制NRF24L01+做发射调试。看看NRF24L01细节吧!这是LCD屏显示:AT89S5 2做接收测试:正在接收时的显示:接收到数据后显示32个数据

4、值:无线模块NRF24L01+应用上篇结束,敬请期待NRF24L01+下篇的调试部分。31、51单片机应用之无线通讯模块 NRF24L01+ (二)模块调试篇32、51单片机应用之无线通讯模块NRF24L01+ (三)发送与接收模块的联调这篇我们将前面调试好的反送模块与这篇的接收模块进行联调,来完成无线数据传输的工作,接收机还是那个自制的AT89SS2。这个黄绿屏采用RTCD12864是KS0108控制器的无中文字犀,而那个蓝屏LCD是ST7920控制器。 但原理还是一样的。插上模块,打开KE1L对模块的I/O脚I进行定义.行£列口F面是接收程序的主函数:/*蚤餐菱*菱*菱主函数*菱

5、*蚤菱蚤餐餐餐* uoid main()uchar i; uchar Buf0(5=<0,0,0,0,0; i=0;init_NRF24L01(); 初始化NRF2NL012©,RX_Add_P");显示3,6O,uchartostr(BuF00);显示接收通道弛二止数据3,72 ,uchartostr(BuF01 );显示3,84»uchartostr(BuF02);显示3,96 ,uchartostr (Buf 03 ) ) ;/显示3,108 ,uchartostr(BuF04);显示e,18/iNRF24L01 RX tesf );5.L”BL0G:

6、http:“ );6,18 ,fhi.baidu.con/txzOT* );798/aEnail:TXZ001Qaa );/延时SPI_Read-Buf(RX_ADDR_PO, BufO, 5); 读取碾道接收地址 Delayms(10O); Lcmlnit(); LcnClear(); LcmPutstr( LcnPutstr( LcnPutstr( LcnPutstr( LcnPutstr( LcnPutstr( LcnPutstr( LcnPutstr( LcmPutstr( LcnPutstr(Delayns(65100); Delayns(6510O); LcmClear();whi

7、le(1)LcnPutstr( 0»18,fNRF24L01 RX Data” );LcmPutstr( 7.42/TXZ(W1&139.Com);SetRXJ1ode(); 进行一次接收LcnPutstr( 2,18,-RX- );/显示提示符正在接收.i=SRRead(CD);读取模块的载波检测侑息LcnPutstr( 4,38,-CD:-);显示”CD.提示符iHi) 如昊接收到载波LcnPutstr( 4,56,uchartostr(i);显示检测到的载波信息.1为接收到载波Delayms(65500); 延时Delayms(655O0);else 如果没有接收到&l

8、t;LcnPutstr( 4,56,uchartostr(i) );/显示检测到的载波信息,味接收到 Delayns(10);>LcnClear();/ 清屏主程序前面是读取0通道的接收地址数据并显示,在模块初始化函数里,己经写入了0通道地址数 据,这里我们是验证一下,读写程序的正确性。地址数据显示延时几秒钟后,程序进入循环, SetRX_Mode();语句调用接收函数进行一次数据的接收,接收完后用i=SPI_Read (CD);语句来读取模 块接收到的载波信息,这里我要说明一下,“CD”是模块里的一个寄存器(0x09),当模块在接收过程 中,如果接收到有前面初始化时RF_CH设定的频率

9、(我们前面设的是2. 4GHZ)的载波号时,就将CD置为 1,没有收到载波信号就为0。这样我们可以验证,上篇我们调试的那个发射模块是否真的进行发送操作 了。接下来就是一个判断,如果CD为1,那就显示CD为“1”,延时几秒钟,这样我可以看清显示。如果 没有收到,那也显示CD为“0”但延时极短,以便进行下一次接收。因为模块的发送和接收都是突发 性,一瞬间发送完后就停下了,如果你接收频度不快的话,那收到的几率就会很小。因此我们设置成如上图是没有收到数据的显示状态。这张图是接收到数据并显示的状态。从这两张图我们可以看出在接收机没有接收到数据时,发送叽的状态,和接收到数据时,发送机又 是什么状态。我们先

10、来说说当没有接收到数据时,发送机的情况,发送数据前,STATUS的状态为14,发 送过后还是14。没有任何改变,说明发送没有成功,上一篇单独调试时没有接收机我们调试都能让发送 机顺利发送成功,现在它也发送了,怎么就知道没有发送成功呢,原来在这里我己在初始化里将自动应 答功能打,自动发送功能也打开了。这样发送机只有收到接收机发送过来的应答信号才能在状态寄存器 里显示发送成功,只要接收机还没有应答,发送机就不会认为发送成功,因此STATUS还是显示为14。看 第二张图,当接收机成功接收到数据,并显示出来时,发送机的状态就显示为46了,说明它收到了接收 机发送过来的应答信号,这样一次完整、可靠的数据

11、传送就完成了。33、51单片机应用之无线通讯模块 NRF24L01+ (四)举例应用这篇讲无线数字传输模块NRF24L01+和RS-232率口与PC间的逋讯例子,把前面几篇的知识结合起来 应用。可以直观感觉一下实际中的使用,这个应用的结构如下图:曰-ELCD 128x64上图左辿,我用N设计一个简单的图形处理软件,可将任意一张图片转换成灰度图或二值图,然后裁成128X64的尺寸,通过串口,一次一行的将图形数据传到下位机(MCU),下位单片机收到数据校验 正确后通过NRF24L01+模块将数据无线发送给右边的接收机;右边的接收机收到数据后,将数据一行行的再还原成为图像显示出来。实现PC定距离的无

12、线显示控制我们一步步来实现它,先设计PC端的程序,实现图像的转二值图并裁剪成128X64的图像,并将图像数据转换成每行16个字节的数据,这16个字节的数据在前面加上一个字节表示行数的数据和最后加上驾.工程1 - MI cr o s g £t Vi sual B asi c l役计-【工程i - Fwi(e)JF 文件堕)编辑® 视图 工程® 格式(W 调试边)运行窟 查询 图表(X)工具(X)外接程序也)窗口也)帮助QD|醪;色,茵|芽日| %既瞄胸.兰GeneralA Rbl HQ 0L.nEJ 9 j 亡iFal:Fod挡字母序CoiLtrlrurES-,En

13、abl Trw |(名耕F orr 加,也二.溪开始|龄购闭|险工程£ - Microsaft V.£ apti. on 返回/设置对象 的标题栏中或21 ;3334、补充 NRF24L01+ 之LED调试篇写了前面四篇关于 NRF24L01通讯调试的文章,看来大家还是很喜欢,有帮助的。有很多大学生朋友问我说,我们没 有两个LCD来显示调试状态,连一个也没有,能不能用几个 LED来显示调试状态呢?因此我就写这篇补充调试的文章,就 用P0 口的8个LED来显示调试 NRF24L01到成功进行数据通讯。先把51单片机的最小系统准备好,还有 8个LED的小电路板,如果你的 LED

14、就在系统板上那省了这一步。123一77 6 5 3 2 1 O 2-22Q 22 席2Haajl«iiladi-2 3 4 5 X* 78个LED的小板子电路很简单,但你焊接要可靠,不然电路本身都不稳定,后面对判断故障会产生很大影响。D7 D6 DS D4 D3 D2 DI DO1KNRF24L01+模块电路还是前面说过的那样:接单片机电源j:单片机;:(M C U ):«I; 接单片机!/0 口 ;N4007X3LLn- 61 GNDNRF24L01+2 VCC模块3 CE4 CSK5 SCK6 MOSI7 MISO8 IRQ相同的两个模块的板子。好!假设我们用 P0口来

15、作LED显示、用P1 口来作模块接口,下面我们先写一段最简单的程序,来确认 LED电路,和P0、P1 口的完好!#include <reg52.h>#include <intrins.h> #define uint unsigned inttypedef unsigned char uchar;*/延时函数/ 在晶振为12MHz时,延时count毫秒/*void Delayms(uint count)uint i;while(count-) for(i=0;i<80;i+)_nop_();_nop_();_nop_();_nop_();_nop_();*/主函数*

16、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);延时半秒这是段极简单的程序,用来检测单片机电路连接的正确性,和I O口的工作状态是否正常,为后面调试NRF 2 4 L 0 1做好准备。它的工作状态如下: 同样的,把LED的接口再接到P 1 口,看看它是否一样的在全部闪烁。做好了这步,准备工作就算完成了。接下来我

17、们把NRF 2 4 L 0 1+的模块插上,要注意,接口要对清楚,电源要连接正确:接下来我们写发送程序:*/ NRF24L01+模块发射程序/ 用8个LED调试/ Txz001 2012.05.16/*#include <reg52.h>typedef unsigned char uchar; /将无符号字节类型重定义为uchartypedef unsigned int uint;将无符号整数类型重定义为Uint/*Nrf24L01函数定义 *void delayms(uint t);/ 毫秒延时 void init_NRF24L01(void);uchar SPI_RW(ucha

18、r reg);uchar SPI_Read(uchar reg); void SetRX_Mode(void);/模块初始化函数/基本SPI读写时序从寄存器reg读一个字节/设置接收模式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

19、字节的数据 void nRF24L01_TxPacket(uchar * tx_buf); /启动一次发送uchar nRF24L01_RxPacket(uchar * rx_buf);/ 读取接收的数据,放入/*NRF24L01 模块 IO 端口定义*rx buf数组sbit CE=P1A0;sbit CSN =P1A1;sbit SCK =P1A2;sbit MOSI =P1A3;sbit MISO =P1A4;sbit IRQ =P1A5;*Nrf24loi常量 *#define TX_ADR_WIDTH5发送地址宽度5字节#define RX_ADR_WIDTH5/接收地址宽度 5字节

20、#define TX_PLOAD_WIDTH32/发送数据宽度 32字节#define RX_PLOAD_WIDTH32接收数据的宽度32字节uchar const TX_ADDRESSTX_ADR_WIDTH= 0x01,0x02,0x03,0x04,0x05; /本地地址uchar const RX_ADDRESSRX_ADR_WIDTH= 0x01,0x02,0x03,0x04,0x05; /接收地址*Nrf24L0i寄存器指令 *#define READ_REG0x00/读寄存器指令#define WRITE_REG0x20 /写寄存器指令#define RD_RX_PLOAD0x61

21、/读取接收数据指令#define WR_TX_PLOAD0xA0 /写待发数据指令#define FLUSH_TX0xE1清空发送缓冲区/*SpI(nRF24L0i)布器地址常量*#define CONFIG0x00 配置收发状态,CRC松验模式以及收发状态响应方式#define EN_AA0x01 /自动应答功能设置#define EN_RXADDR0x02 /可用信道设置#define SETUP_AW0x03 收发地址宽度设置#define SETUP_RETR0x04 /自动重发功能设置#define RF_CH0x05 /工作频率设置#define RF_SETUP0x06 /发射速

22、率、功耗功能设置#define STATUS0x07 /状态寄存器#define OBSERVE_TX0x08 /发送监测功能#define CD0x09 /地址检测#define RX_ADDR_P00x0A /频道0接收数据地址#define RX_ADDR_P10x0B /频道1接收数据地址#define RX_ADDR_P20x0C /频道2接收数据地址#define RX_ADDR_P30x0D /频道3接收数据地址#define RX_ADDR_P40x0E /频道4接收数据地址#define RX_ADDR_P50x0F /频道5接收数据地址#define TX_ADDR0x10

23、 /发送地址寄存器#define RX_PW_P00x11 /接收频道0接收数据长度#define RX_PW_P10x12 /接收频道0接收数据长度#define RX_PW_P20x13 /接收频道0接收数据长度#define RX_PW_P30x14 /接收频道0接收数据长度#define RX_PW_P40x15 /接收频道0接收数据长度#define RX_PW_P50x16 /接收频道0接收数据长度#define FIFO_STATUS0x17 / FIFO栈入栈出状态寄存器设置/*毫秒延时子程序*/void delayms(uint t)/约延时 t 毫秒(uint i;whil

24、e(t-)(for(i=0;i<125;i+); */* 函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/*/uchar SPI_RW(uchar uuchar)(uchar bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr+) / 输出 8个位 (MOSI = (uuchar & 0x80);uuchar = (uuchar << 1);SCK = 1;uuchar |= MISO;SCK = 0;return(uuchar);/*/* 函数:uchar SPI_Read(uchar

25、reg)/*功能:NRF24L01的SPI读取一个字节时序/输出uuhar的最高位/左移一位/将时钟线置1'同时读取STATUS/然后再将时钟线置0'/返回读取的值/*/uchar SPI_Read(uchar reg)(uchar reg_val;CSN = 0;SPI_RW(reg);reg_val = SPI_RW(0);CSN = 1;return(reg_val);/*/*功能:NRF24L01写一个字节到寄存器函数/CSN置'0',允许指令操作/写一条reg指令/读取reg的值到reg_val/CSN置'1',禁示操作/返回读取的值/

26、*/uchar SPI_RW_Reg(uchar reg, uchar value)(uchar status;CSN = 0;status = SPI_RW(reg);SPI_RW(value);CSN = 1;/ CSN置'0',允许操作这指令,并读STATUS写数据值到reg/ CSN置'1',禁止操作return(status);/ return nRF24L01 status uchar/*/* 函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能:用于写数据:reg:为寄存器地

27、址,/*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_ctr<uchars; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1;关闭 SPIreturn(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, 0x0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论