NRF24L01无线模块收发程序例程

NRF24L01无线模块收发程序例程
NRF24L01无线模块收发程序例程

//下面是接收的NRF24L01的程序。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include

#include "nrf24l01.h"

#include

#define uchar unsigned char

#define uint unsigned int

sbit IRQ =P1^2;//输入

sbit MISO =P1^3; //输入

sbit MOSI =P1^1;//输出

sbit SCLK =P1^4;//输出

sbit CE =P1^5;//输出

sbit CSN =P1^0;//输出

uchar RevTempDate[5];//最后一位用来存放结束标志

uchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址

/*****************状态标志*****************************************/

uchar bdata sta; //状态标志

sbit RX_DR=sta^6;

sbit TX_DS=sta^5;

sbit MAX_RT=sta^4;

/*****************SPI时序函数******************************************/ uchar NRFSPI(uchar date)

{

uchar i;

for(i=0;i<8;i++) // 循环8次

{

if(date&0x80)

MOSI=1;

else

MOSI=0; // byte最高位输出到MOSI

date<<=1; // 低一位移位到最高位

SCLK=1;

if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据date|=0x01; // 读MISO到byte最低位

SCLK=0; // SCK置低

}

return(date); // 返回读出的一字节

}

/**********************NRF24L01初始化函数*******************************/ void NRF24L01Int()

{

NRFDelay(2);//让系统什么都不干

CE=0;

CSN=1;

SCLK=0;

IRQ=1;

}

/*****************SPI读寄存器一字节函数*********************************/ uchar NRFReadReg(uchar RegAddr)

{

uchar BackDate;

CSN=0;//启动时序

NRFSPI(RegAddr);//写寄存器地址

BackDate=NRFSPI(0x00);//写入读寄存器指令

CSN=1;

return(BackDate); //返回状态

}

/*****************SPI写寄存器一字节函数*********************************/ uchar NRFWriteReg(uchar RegAddr,uchar date)

{

uchar BackDate;

CSN=0;//启动时序

BackDate=NRFSPI(RegAddr);//写入地址

NRFSPI(date);//写入值

CSN=1;

return(BackDate);

}

/*****************SPI读取RXFIFO寄存器的值********************************/ uchar NRFReadRxDate(uchar RegAddr,uchar *RxDate,uchar DateLen)

{ //寄存器地址//读取数据存放变量//读取数据长度//用于接收

uchar BackDate,i;

CSN=0;//启动时序

BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址

for(i=0;i

{

RxDate[i]=NRFSPI(0);

}

CSN=1;

return(BackDate);

}

/*****************SPI写入TXFIFO寄存器的值**********************************/ 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);

}

/*****************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_DA TA_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);//保持10us秒以上

}

/*****************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 CheckACK()

{ //用于发射模式接收应答信号

sta=NRFReadReg(R_REGISTER+STATUS); // 返回状态寄存器

if(TX_DS)

NRFWriteReg(W_REGISTER+STATUS,0xff); // 清除TX_DS或MAX_RT中断标志

}

/*************************接收数据*********************************************/

void GetDate()

{

sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器

if(RX_DR) // 判断是否接收到数据

{

CE=0;//待机

NRFReadRxDate(R_RX_PAYLOAD,RevTempDate,RX_DATA_WITDH);// 从RXFIFO读取数据接收4位即可,后一位位结束位

NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标

CSN=0;

NRFSPI(FLUSH_RX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!CSN=1;

}

//NRFWriteReg(W_REGISTER+STA TUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标

}

void NRFDelay(uint t)

{

uint x,y;

for(x=t;x>0;x--)

for(y=110;y>0;y--);

}

nRF24L01+无线收发系统设计

nRF2401无线收发系统设计 一 实验目的 培养基本实验能力和工程实践能力,通过实验锻炼基本实验技能,使同学们掌握单片机的基本工作原理和单片机系统应用设计的技能,掌握单片机的简单编程方法以及调试方法,并能应用于电子系统设计中,提高同学们对综合电子系统的设计能力,加深对无线通信系统理论知识的理解,增强工程实践能力,培养创新意识,提高分析问题和解决问题的能力。 二 实验基本要求 (1)正确使用电子仪器; (2)根据项目设计要求能够进行单片机系统硬件电路设计和软件编程; (3)学会查阅接口电路手册和相关技术资料; (4)具有初步的单片机电路硬件和软件分析、寻找和排除常见故障的能力; (5)正确地记录实验数据和写实验报告。 三 实验器材 万能板、单片机、nRF2401无线收发模块、液晶屏、晶振、按键、发光二级管、开关、电容、电阻、5V 电源适配器、导线、万用表、电烙铁、焊锡。 四 GFSK 调制解调原理 4.1 调制 频移键控方式,幅度恒定不变的载波信号频率随着调制信号的信息状态而切换,通常采用的是二进制频移键控,即载波信号频率随着数据信息码的“0”、“1”变化进行切换。根据频率变化影响发射波形的方式,FSK 信号在相邻的比特之间,呈现连续的相位或不连续的相位。一种常见的二进制FSK 信号产生方法是根据数据比特码是“0”还是“1”,在两个振荡频率分别为 c d f f +和 c d f f -的振荡器间切换,这种FSK 信号的表达式为: []()()2π() 0FSK H c d b S t v t f f t t T == +≤≤ (二进制1) []()()2π() 0FSK L c d b S t v t f f t t T == -≤≤ (二进制0) c f 和d f 分别代表载波信号频率和恒定频率偏移,而b E 和b T 分别表示单比特能量和比 特周期。这种方法产生的波形在比特码“0”,“1”切换时刻是不连续的,这种不连续的相位会造成诸如频谱扩展和传输差错等问题,信号的功率谱密度函数按照频率偏移的负二次幂衰落,在无线系统中一般不采用这种FSK 信号,而是使用信号波形对单一载波振荡器进行调制,这样FSK 信号可以表示如下: [ ]()2π()2ππ()t FSK c c S t f t t f t h m d θττ-∞??=+=+???? ? 上式中,h 是频率调制系数,定义为2/b b h f R =,b R 为比特率,尽管调制波形()m t 在“0”和“1”比特间转换时不连续,但是相位函数()t θ是与()m t 的积分成比例,所以是连 续的,大部分信号能量集中在以载波频率为中心的主瓣范围,功率谱密度函数按照频率偏移的负四次幂衰减。 为了进一步减小信号的频谱旁瓣,可以在前加入一级高斯滤波器,高斯滤波器的传递函

NRF24L01无线模块收发程序(实测成功 多图)

NRF24L01无线模块收发程序(实测成功多图) 本模块是NRF24L01无线传输模块,用于无线传输数据,距离不远,一般只是能够满足小距离的传输,目测是4-5m,价格一般是4元左右,可以方便的买到。 51最小系统学习板就可以,当时是用了两块学习板,一块用于发送,一块用于接收。 小车也是比较容易购到的,四个端口控制两个电机,两个控制一个电机,当两个端口高低电平不同时电机就会转动,即为赋值1和0是电机转动,赋值可以用单片机作用,当然这是小车启动部分,前进后退左转右转就是你赋值0和1的顺序问题了。

整体思路是用发射端的按键控制小车,即为按键按下就前进,再按其他按键实现其他功能,本次程序是在用NRF24L01发射数据在接收端用1602显示的基础上改变。 下面是程序源码(有好几个文件,分别创建) ////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////// #include #include #include'1602.h' #include'delay.h' #include 'nrf24l01.h' #define uint unsigned int #define uchar unsigned char uint Weight_Shiwu=1234; unsigned char KeyScan(void);//键盘扫描 // unsigned char KeyScan(void);//键盘扫描 //#define KeyPort P0 sbit KEY1 = P0^0; sbit KEY2 = P0^1; sbit KEY3 = P0^2; sbit KEY4 = P0^3; sbit KEY5 = P0^4; void main() { // char TxDate[4]; // LCD_Init(); //初始化液晶屏 // LCD_Clear(); //清屏

NRF24L01发送程序

#include #include typedef unsigned int uint; typedef unsigned char uchar; #define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节 #define RX_ADDR_WITDH 5//接收地址宽度设置为5个字节 #define TX_DATA_WITDH 8// #define RX_DATA_WITDH 8 #define R_REGISTER 0x00 // 读寄存器 #define W_REGISTER 0x20 // 写寄存器 #define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式 #define W_TX_PLOAD 0xA0 // 写TX FIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式 #define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,应用于发射模式 #define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,应用于接收模式 #define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射 #define NOP 0xFF // 空操作,可以用来读状态寄存器 #define CONFIG 0x00 // 配置寄存器 #define EN_AA 0x01 // “自动应答”功能寄存 #define EN_RX_ADDR 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 // 数据通道1有效数据宽度设置寄存器 #define RX_PW_P2 0x13 // 数据通道2有效数据宽度设置寄存器 #define RX_PW_P3 0x14 // 数据通道3有效数据宽度设置寄存器 #define RX_PW_P4 0x15 // 数据通道4有效数据宽度设置寄存器 #define RX_PW_P5 0x16 // 数据通道5有效数据宽度设置寄存器

NRF24L01无线模块收发程序例程

//下面是接收的NRF24L01的程序。 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include #include "nrf24l01.h" #include #define uchar unsigned char #define uint unsigned int sbit IRQ =P1^2;//输入 sbit MISO =P1^3; //输入 sbit MOSI =P1^1;//输出 sbit SCLK =P1^4;//输出 sbit CE =P1^5;//输出 sbit CSN =P1^0;//输出 uchar RevTempDate[5];//最后一位用来存放结束标志 uchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址 /*****************状态标志*****************************************/ uchar bdata sta; //状态标志 sbit RX_DR=sta^6; sbit TX_DS=sta^5; sbit MAX_RT=sta^4; /*****************SPI时序函数******************************************/ uchar NRFSPI(uchar date) { uchar i; for(i=0;i<8;i++) // 循环8次 { if(date&0x80) MOSI=1; else MOSI=0; // byte最高位输出到MOSI date<<=1; // 低一位移位到最高位 SCLK=1; if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据date|=0x01; // 读MISO到byte最低位 SCLK=0; // SCK置低 } return(date); // 返回读出的一字节 } /**********************NRF24L01初始化函数*******************************/ void NRF24L01Int() {

nRF24L01无线通信模块使用手册

nRF24L01无线通信模块使用手册 一、模块简介 该射频模块集成了NORDIC公司生产的无线射频芯片nRF24L01: 1.支持2.4GHz的全球开放ISM频段,最大发射功率为0dBm 2.2Mbps,传输速率高 3.功耗低,等待模式时电流消耗仅22uA 4.多频点(125个),满足多点通信及跳频通信需求 5.在空旷场地,有效通信距离:25m(外置天线)、10m(PCB天线) 6.工作原理简介: 发射数据时,首先将nRF24L01配置为发射模式,接着把地址TX_ADDR和数据TX_PLD按照时序由SPI 口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD 从发送堆栈中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC_CNT)达到上限,MAX_RT置高,TX_PLD不会被清除;MAX_RT或TX_DS置高时,使IRQ变低,以便通知MCU。最后发射成功时,若CE为低,则nRF24L01进入待机模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入待机模式2。 接收数据时,首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在接收堆栈中,同时中断标志位RX_DR置高,IRQ 变低,以便通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。 二、模块电气特性 参数数值单位 供电电压5V 最大发射功率0dBm 最大数据传输率2Mbps 电流消耗(发射模式,0dBm)11.3mA 电流消耗(接收模式,2Mbps)12.3mA 电流消耗(掉电模式)900nA 温度范围-40~+85℃ 三、模块引脚说明 管脚符号功能方向 1GND电源地 2IRQ中断输出O 3MISO SPI输出O 4MOSI SPI输入I 5SCK SPI时钟I 6NC空 7NC空 8CSN芯片片选信号I 9CE工作模式选择I 10+5V电源

nrf24l01无线模块NRF24L01模块收发c程序

//许多人都在找nrf24l01无线模块的c程序;我以前刚接触无线//时用的就是nrf24l01模块;搜索了许多程序有很多都没法直接用;甚至还怀疑模块是不是被我搞坏了;拿去让别人检测模块又是好的;为避免大家走弯路;我将我的程序发出来供大家参考; 这是nrf24l01无线模块pcb图; 下面有Nrf24l01无线模块的收发c程序;以下程序经本人亲自测试;绝对能用!! 请注意以下几点: 1、24L01模块的电源电压是否为3V-3.6V之间; 2、如果您用的单片机是5V的话,请在IO口与模块接口之间串一个1K电阻; 3、检查模块的GND是否与单片机的GND相连接 4、先用程序进行调试,如果IO口不同,请更改IO口或相关时序; 5、如果是51系列单片机,晶振请选用11.0592M Hz; 模块供电最好用asm1117 5v转3.3v 稳压 测试单片机是stc89c52;at89c52 通用; 收发一体;

一大截不废话了;上程序;此程序是按键控制led;当按下s的时候对应接受的led会闪闪发光;很简单的~如果要实现其他更先进的功能;自己发掘吧~~ 务必将硬件连接正确;否则;它不会工作的~~当然做什么都要严谨~~错一点就差大了~~ 《《收发一体程序》》 #include #include typedef unsigned char uchar; typedef unsigned char uint; //****************************************NRF24L01端口定义

*************************************** sbit M ISO =P1^3; sbit M OSI =P1^4; sbit SCK =P1^2; sbit CE =P1^1; sbit CSN =P3^2; sbit IRQ =P3^3; //************************************按键*************************************************** sbit KEY=P2^0; //***************************************************************************** sbit led=P2^1; //*********************************************NRF24L01*********************** ************** #define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH 5 // 5 uints RX address width #define TX_PLOAD_WIDTH 20 // 20 uints TX payload #define RX_PLOAD_WIDTH 20 // 20 uints TX payload uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令******************************************************* #define READ_REG 0x00 // 读寄存器指令 #define WRITE_REG 0x20 // 写寄存器指令 #define RD_RX_PLOAD 0x61 // 读取接收数据指令 #define WR_TX_PLOAD 0xA0 // 写待发数据指令 #define FLUSH_TX 0xE1 // 冲洗发送FIFO指令 #define FLUSH_RX 0xE2 // 冲洗接收FIFO指令 #define REUSE_TX_PL 0xE3 // 定义重复装载数据指令 #define NOP 0xFF // 保留 //*************************************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接收数据地址

无线发射接收系统设计与实现

无线发射接收系统设计与实现 摘要: 此系统采用了无线发射和接受实现双向的全双工无线通信。通过使用C51单片机实现对系统的数据采集、信号收发进行控制。用硅光片进行对阳光是否照射的采集,DS18B20进行温度信息采集。该系统是一个独立系统,能够在一定范围内进行数据采集并且将数据通过无线传输到数据接收模块。 关键词:无线传输;单片机;数据采集 1 引言 对于环境信息采集是很普遍的,但是将采集的信息如何传输就是关键,传统的系统都是用有线的方法,不仅要铺设线路,而且不方便,可移植性差。随着无线技术的不断发展,无线在各个领域中的应用也不断增加,通过嵌入式系统,用无线的方式实现数据的采集和传输是最好的解决方法,不仅简化了实施的难度,而且成本相对较低。 本文主要是以C51单片机为控制核心,用无线接收发射装置来实现环境数据采集系统。 2 系统目的 设计并制作一个无线环境监测模拟装置,实现对周边温度和光照信息的探测。该装置由1个监测终端和不多于255个探测节点组成(实际制作2个)。监测终端和探测节点均含一套无线收发电路,要求具有无线传输数据功能,收发共用一个天线。 探测节点有编号预置功能,编码预置范围为00000001B~B。探测节点能够探测其环境温度和光照信息。温度测量范围为0℃~100℃,绝对误差小于2℃;光照信息仅要求测量光的有无。探测节点采用三节干电池串联,单电源供电。 监测终端用外接单电源供电。探测节点分布示意图如图1所示。监测终端可以分别与各探测节点直接通信,并能显示当前能够通信的探测节点编号及其探测到的环境温度和光照信息。 每个探测节点增加信息的转发功能,节点转发功能示意图如图2所示。即探测节点B的探测信息,能自动通过探测节点A转发,以增加监测终端与节点B之间的探测距离D+D1。该转发功能应自动识别完成,无需手动设置,且探测节点A、B可以互换位置。

NRF24L01无线模块C语言程序

NRF24L01无线模块C语言程序 24MHz晶振 #include #include #include #include #include #include #define U8 unsigned char #define U16 unsigned int #define TX_ADDR_WITDH 5 //发送地址宽度设置为5个字节 #define RX_ADDR_WITDH 5 //接收地址宽度设置为5个字节 #define TX_DATA_WITDH 1//发送数据宽度1个字节 #define RX_DATA_WITDH 1//接收数据宽度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 REUSE_TX_PL 0xe3//重新使用上一包有效数据 #define NOP 0xff//空操作 #define CONFIG 0x00//配置寄存器 #define EN_AA 0x01//使能自动应答 #define EN_RXADDR 0x02//接收通道使能0-5个通道 #define SETUP_AW 0x03//设置数据通道地址宽度3-5 #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接收地址

NRF24L01无线发射简易教程

NRF24L01 简易教程

先来看接口电路,使用的IO 口不是唯一的哦,可随意定义接口,当然是在使用IO 口模拟SPI 且IRQ 中断引脚不使用的使用查询方法判断接收状态的情况下了。作为初探我们就是用简单的IO 模拟SPI 的方法了,中断使用查询的方式。那么该教程讲解的接口与单片机的连接如下: 首先您需要了解NRF24L01,请参阅“NRF24L01 芯片中文资料”或者“NRF24L01 芯片英文资料”。 我们的教程是以一个简单的小项目为大家展示NRF24L01 的使用方法与乐趣。我们所写的教程均是以这种方式的呢,让您在学习的时候明白它能做什么,使您学起来不至于枯燥无味。 作为简易的教程,我们只需要知道它是怎么使用的就够了,我们本教程的目的是用NRF24L01 发送数据和接收数据,且接收方会对比发送的数据与接收的数据,若完全相同则控制LED 闪烁一次,并且把接收到的数据通过串口发送到PC 端,通过串口工具查看接收到的数据。 具体的要求如下: 1、具备发送和接收的能力。 2、发送32 个字节的数据,接收方接收到正确数据之后给予提示,通过LED 闪烁灯形 式。 3、把接收到的数据传送到PC 进行查看。 4、发送端每隔大约1.5 秒发送一次数据,永久循环。以上是程序的要求,若您想自行 设计出硬件接口,您也是可以添加一条呢:使用DIY 方 式设计NRF24L01 的接口板,且包含含单片机平台,使用PCB 方式或者万用板方式均可。如果您想让自己学的很扎实,那么推荐您自行做出接口板子呢。当然若您的能力不足,那么我们不推荐自行做板呢,因为这样会增加您学习的难度,反而起到了反效果呢。 我们使用的方式是画PCB 的方式呢,若您自己做了接口板子,那么您可以对比下一呢,O(∩_∩)O! 我们知道NRF24L01 的供电电压是1.9V~3.6V 不能超过这个范围,低了不工作,高了可能烧毁NRF24L01 芯片。我们常用的STC89C52 的单片机的供电电压是5V,我们不能直接给24L01 这个模块供电,我们需要使用AMS1117-3.3V 稳压芯片把5V 转成3.3V 的电压为24L01 模块供电。 为此我们的设计原理图如下:包含单片机最小系统、供电系统、下载程序接口、5V 转3.3V 电路、NRF24L01 模块接口。并且全部引出单片机的IO 口,另外还加了5 个电源输出接口,为扩展使用。还包括了电源指示LED 以及一个IO 口独立控制的LED,这个独立控制的LED用于NRF24L01 接收成功闪烁指示。为了保证系统的稳定性,在设计中添加了两个滤波电容。

NRF24L01功能使用文档

NRF24L01使用文档 基于c8051f330单片机

目录 芯片简介 (3) 1 NRF24L01功能框图 (4) 2 NRF24L01状态机 (5) 3 Tx与Rx的配置过程 (7) 3.1 Tx 模式初始化过程 (7) 3.2 Rx模式初始化过程 (8) 4控制程序详解 (9) 4.1 函数介绍 (9) 4.1.1 uchar SPI_RW(uchar byte) (9) 4.1.2 uchar SPI_RW_Reg (uchar reg, uchar value) (10) 4.1.3 uchar SPI_Read (uchar reg); (10) 4.1.4 uchar SPI_Read_Buf (uchar reg, uchar *pBuf, uchar bytes); (11) 4.1.5 uchar SPI_Write_Buf (uchar reg, uchar *pBuf, uchar bytes); (11) 4.1.6 void RX_Mode(void) (12) 4.1.7 void TX_Mode(void) (13) 4.2 NRF24L01相关命令的宏定义 (13) 4.3 NRF24L01相关寄存器地址的宏定义 (14) 5 实际通信过程示波器图 (16) 1)发射节点CE与IRQ信号 (17) 2)SCK与IRQ信号(发送成功) (18) 3)SCK与IRQ信号(发送不成功) (19)

芯片简介 NRF24L01是NORDIC公司最近生产的一款无线通信通信芯片,采用FSK调制,内部集成NORDIC自己的Enhanced Short Burst 协议。可以实现点对点或是1对6的无线通信。无线通信速度可以达到2M(bps)。NORDIC公司提供通信模块的GERBER文件,可以直接加工生产。嵌入式工程师或是单片机爱好者只需要为单片机系统预留5个GPIO,1个中断输入引脚,就可以很容易实现无线通信的功能,非常适合用来为MCU系统构建无线通信功能。

2006我的毕设315M和433M无线发射接收程序

发送::::: #include "reg51.h" #include #include "lcd1602.h" #include "delay.h" sbit ch1 = P1^0; sbit ch2 = P1^1; sbit ch3 = P1^2; sbit ch4 = P1^3; sbit key_1 = P2^0; sbit key_2 = P2^1; sbit key_3 = P2^2; sbit key_4 = P2^3; sbit key_5 = P2^4; sbit key_6 = P3^5; //有问题 sbit FASONG_send = P3^7; // 低电平发送 #define FASONG_Port P1 void FASONG(unsigned char i) { FASONG_Port = i; //发送数据的低4位一个数据有8位,分成高4位和低4位。 FASONG_send = 0; //启动发送 _nop_();_nop_();_nop_();_nop_(); //控制令起延时作用 YANSHIYIHAOMIAO(200); //延时让硬件发送数据 FASONG_send = 1; //关闭发送 } /**************************主函数********************************************/ void main() { unsigned int i = 0; // CLK_DIV = 0x03; FASONG_send = 1; //开机时关闭发送数据 YEJINGYANSHI(50); //延时500ms启动 YEJINGCHUSHIHUA( ); //LCD初始化 YANSHI10US(10); XIANSHIYICHUANZHIFU(0,0," Graduate");//显示 XIANSHIYICHUANZHIFU(0,1," Send: "); //显示 FASONG_send = 0;

NRF24L01参考程序(包含多个实例)

(相关人员如觉得本人水平低下,还请见谅) Nrf24L01的使用程序和使用方法和简单操作: 功能: 无线对发程序。两个模块a,b,实现按下一个按键,会在对方的数码管上显示3或4,在本机上显示1,2。 当一个模块,比如a模块。当两个按键按下其中一个,则会在另一个模块b上显示数字3,4(具体根据按下哪个按键)。以上功能描述,B模块按键按下,如同a模块一样的功能,不做系统性描述了。 下面给出程序中几个地方的解释: #define READ_REG 0x00 // 读寄存器指令 #define WRITE_REG 0x20 // 写寄存器指令 #define RD_RX_PLOAD 0x61 // 读取接收数据指令 #define WR_TX_PLOAD 0xA0 // 写待发数据指令 #define FLUSH_TX 0xE1 // 冲洗发送FIFO指令 #define FLUSH_RX 0xE2 // 冲洗接收FIFO指令 #define REUSE_TX_PL 0xE3 // 定义重复装载数据指令 #define NOP 0xFF // 保留 类似这种的描述,可以等同于READ_REG =0x00;这个是经过实际程序测试出来的,比如 以下程序: #include #define k 0xfe void main() { P1=k; } 则会出现此类结果:

MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI uchar = (uchar << 1); // shift next bit into MSB.. SCK = 1; // Set SCK high.. uchar |= MISO; // capture current MISO bit SCK = 0; 此处为spi的核心,是spi协议的编程,其中uchar |= MISO; 表示uchar |= MISO | uchar; MOSI = (uchar & 0x80);其中0x80是1000 0000,与上uchar,这种&,是按位与,故可以从uchar提取出一个电平给mosi。 MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI uchar = (uchar << 1); 这两句组合起来用,就实现了把uchar编程8位2进制数后的每一位都可以发送给mosi;Uchar的只待对象,就是上面的诸如#define FLUSH_TX 0xE1 这样的数,或者是相关的发送数据。 *pBuf这个并不是一个主要的问题,实际这个是涉及指针问题的,带*的跟地址有关系,但是我们其实不需要很关心编译的时候数据被具体存入哪个地址,即使是很重要的数据。 void init_NRF24L01(void) { inerDelay_us(100); CE=0; // chip enable CSN=1; // Spi disable SCK=0; // 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,如果需要多频道可以参考Page21 SPI_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 } 在整个初始化中我们看到: CE=0; // chip enable CSN=1; // Spi disable 这是设置整个的状态。如过状态设置成待机,则引脚可能变为高阻。(以上并非全部引脚)

nrf24l01(2.4G模块)

NRF24L01(2.4G模块) 一、模块简介 (1)2.4GHz全球开放ISM频段免许可证使用。 (2)最高工作速率2Mbps,高效GFSK调制,抗干扰能力强。 (3)126频道,满足多点通信和跳频通信需要。 (4)内置硬件CRC检错,和点对点通信地址控制。 (5)低功耗,1.9-3.6V工作,待机模式下22uA;掉电模式900nA。 (6)内置2.4GHz天线,体积小巧:15mm×29mm。 (7)模块可软件设置地址,只有收到本机地址时才会输出数据(提供中断提示),可直接接各种单片机使用,软件编程非常方便。 (8)内稳压电路,使用各种电源包括DC/DC开关电源均有很好的通道效果。 (9)2.54mm间距接口,DIP封闭。 (10)工作于Enhanced ShockBurst具有Automatic packet handling,Auto packet transaction handling,具有可选的内置包应答机制,极大地降低丢包率。 (11)与51单片机P0口连接的时候,需要加10K的上拉电阻,与其余口连接不需要。(12)其他系列的单片机,如果是5V的,请参考该系列单片机IO口输出电流大小,如果超过10mA,需要串联电阻分压,否则容易烧毁模块!如果是3.3V的,可以直接和RF24L01模块的IO口线连接。比如AVR系列单片机。如果是5V的一般串接2K的电阻。 二、接口电路 说明: 1)VCC脚接电压范围为:1.9V-3.6V,不能在这个敬意之外,超过3.6V将会烧毁模块。推荐电压3.3左右。 2)除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需转换。当然对3V左右的单片机更加适用了。 3)硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI,不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以。 4)如果需要其他封装接口,比如密脚插针,或者其他形式的接口,可联系我们定做。 三、引脚说明

无线发射程序

无线发射 #include #include #include #include //--------------------------------------------------------- -------------------------------- ----------------------- #define uint unsigned int #define uchar unsigned char //--------------------------------------------------------- -------------------------------- ----------------------- #define BYTE_BIT0 0x01 #define BYTE_BIT7 0x80 //--------------------------------------------------------- -------------------------------- ----------------------- bdata unsigned char DATA_BUF; #define DATA7 ((DATA_BUF&BYTE_BIT7) != 0)

#define DATA0 ((DATA_BUF&BYTE_BIT0) != 0) sbit flag =DATA_BUF^7; sbit flag1 =DATA_BUF^0; //---------------------------------------------------发送数 据缓冲区 -------------------------------- ----------------- #define TxRxBuf_Len 4 unsigned char TxRxBuf[TxRxBuf_Len]={0x29,0x30,0x31,0x32,}; code TxAddress[4]={0xcc,0xcc,0xcc,0xcc}; char tf; //----------------------------------------NRF905工作模式控 制端口 -------------------------------- ---------------------- sbit TXEN=P1^4; sbit TRX_CE=P3^2; sbit PWR=P1^3; //----------------------------------------LED显示端口 -------------------------------- ------------------- sbit LED=P3^5;

无线发射与接收复习过程

无线发射与接收

基于BH1417芯片的FM无线发射电路设计 类别:电源技术阅读:1439 BH1417是FM无线发射芯片,它可工作于87MHz~108MHz频段,与简单的外围电路配合使用,可发射音频FM信号,它可以将计算机声卡、游戏机、CD、DVD、MP3、调音台等立体声音频信号进行立体声调制发射传输,配合普通的调频立体声接收机就可实现无线调频立体声传送。适用于生产立体声的无线音箱、无线耳机、CD、MP3、DVD、PAD、笔记本电脑等的无线音频适配器。 BH1417的原理特性 FM发射电路采用稳定频率的锁相环系统。这一部分由高频振荡器、高频放大器及锁相环频率合成器组成。调频由变容二极管组成的高频振荡器实现,高频振荡器是锁相环的VCO,立体声复合信号通过它直接进行调频。高频振荡器由第9引脚外部的LC回路与内部电路组成,振荡信号经过高频放大器从11引脚输出,同时输送到锁相环电路进行比较后,从第7引脚输出一个信号,对高频振荡器的值进行修正,确保频率稳定。一但超过锁相环设定的频率,第7引脚将输出的电平拉高;如果低于设定频率,它将输出的电平拉低;相同的时候,它的电平将不变。 1) 将预加重电路、限幅电路、低通滤波电路(LPF)一体化,使音频信号的质量比分立元件的电路(如BA1404、NJM2035等)有很大改进。 2) 采用锁相环锁频,并与调频发射电路一体化,使得发射的频率非常稳定。 3) 采用了4位拔码开关进行频率设定,可设定14个频点,使用非常方便。 BH1417的内部结构如图1所示。它由5部分组成:音频预处理电路(加重、限幅和低通滤波);基频产生电路(晶振、分频);锁相环电路(相位检测、锁频);频率设定电路(高低电平转换);调频发射电路。外围电路主要有拔码开关组成的频率控制电路、压控振荡器组成的载波产生电路、定时器以及一些耦合电容。 应用电路 音频输入端的限幅电路设计 BH1417音频输入有最大电平限制,过大的输入电平会损坏芯片。在前期的试验阶段,输入音频电平幅值具有不可预测性,为了保护芯片,需对输入音频信号进行限幅处理。限幅电路很简单,利用可变电位器即可。电路如图2所示,图中电容的作用是将音频信号耦合到芯片中,同时有隔直流功能。

nrf24l01无线模块

基于nRF24L01的无线温度采集系统设计 1引言 温度采集系统所采集的温度通常通过RS485、CAN总线通信方式传输至上位机,但这种方式维护较困难,不利于工业现场生产;而无线通信GPRS技术传输距离长,通信可靠稳定,但设计复杂、成本昂贵。这里采用工业级内置硬件链路层协议的低成本单芯片nRF24L01型无线收发器件实现系统间的无线 通信,完成无线信号的接收、显示及报警功能。 2nRF24L01简介 nRF24L01是一款工业级内置硬件链路层协议的低成本无线收发器。该器件工作于2.4GHz全球开放ISM频段,内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合增强型ShockBu rst技术,其输出功率和通信频道可通过程序配置。拥有ShockBurst和Enhanced ShockBurst两种数据传输模式。可直接与单片机I/O连接,外接元件数目少。nRF24L01功耗低,以-6dBm的功率发射时,工作电流仅9mA;接收时,工作电流仅12.3mA,多种低功率工作模式(掉电和空闲模式)更利于节能 设计。 3系统硬件设计 系统硬件设计主要由采集发送和接收显示两部分组成。图1为采集发送电路原理图,该电路主要由温度传感器DS18B20、单片机STC12LE5408和nRF24L01组成。 STC12LE5408是增强型8051单片机,速度快,集成度高,电压范围宽(2.2~3.8V),和MCS-5 1系列单片机指令系统完全兼容。其内部还有8KB Flash程序存储器,512字节RAM、2KB EEPRO M、4路PWM以及硬件看门狗(WDT)等资源.性价比高。 DSl8B20是DALLAS公司生产的单总线数字1-Wire温度传感器,可把温度信号直接转换成串行数字信号供单片机处理,采用1-Wire接口。DSl8B20的数据端DQ可通过4.7kΩ的上拉电阻接STC12LE5 408。nRF24L01的CE,CSN,SCK,MOSI,MISO,IRQ引脚则可接STC12LE5408的任意端口,但需在编程时注意,这里接至P1端口。由于nRF24L01具有接收数据功能,所以接收显示电路由单片机ST C12LE5408、nRF24L01和显示电路组成。所采集的数据也通过串口发送至PC机进行处理。

相关文档
最新文档