NRF24L01接收程序(单片机是STC89C52)

发布者:SereneMeadow最新更新时间:2015-09-08 来源: eefocus关键字:NRF24L01  接收程序  单片机  STC89C52 手机看文章 扫描二维码
随时随地手机看文章
#include

#include
typedef  unsigned int uint;
typedef  unsigned char uchar;

#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节
#define RX_ADDR_WITDH 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有效数据宽度设置寄存器
#define FIFO_STATUS 0x17  // FIFO状态寄存器
//*********************************************************************************
uchar  sta;    // 状态变量
#define RX_DR  (sta & 0x40)  // 接收成功中断标志
#define TX_DS  (sta & 0x20)  // 发射成功中断标志
#define MAX_RT (sta & 0x10)  // 重发溢出中断标志
 
sbit CE=P1^5;
sbit IRQ=P1^0;
sbit CSN=P1^4;
sbit MOSI=P1^2;
sbit MISO=P1^1;
sbit SCK=P1^3;
sbit LED=P0^0;

uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar RX_Buffer[RX_DATA_WITDH];

void _delay_us(uint x)
{
 uint i,j;
 for (j=0;j   for (i=0;i<12;i++);
}

void _delay_ms(uint x)
{
 uint i,j;
 for (j=0;j   for (i=0;i<120;i++);
}
void nRF24L01_Init(void)
{
 _delay_us(2000);
 CE=0;
 CSN=1;
 SCK=0;
 IRQ=1;
}

uchar SPI_RW(uchar byte)
{
 uchar i;
 for(i=0;i<8;i++)
 {
  if(byte&0x80)
   MOSI=1;
  else
   MOSI=0;
  byte<<=1;
  SCK=1;
  if(MISO)
   byte|=0x01;
  SCK=0;
 }
 return byte;
}

uchar SPI_W_Reg(uchar reg,uchar value)
{
 uchar status;
 CSN=0;
 status=SPI_RW(reg);
 SPI_RW(value);
 CSN=1;
 return status;
}

uchar SPI_R_byte(uchar reg)
{
 uchar status;
 CSN=0;
 SPI_RW(reg);
 status=SPI_RW(0);
 CSN=1;
 return status;
}

uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
 uchar reg_value,i;
 CSN=0;
 reg_value=SPI_RW(reg);
 for(i=0;i  {
  Dat_Buffer[i]=SPI_RW(0);
 }
 CSN=1;
 return reg_value;
}

uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
 uchar reg_value,i;
 CSN=0;
 reg_value=SPI_RW(reg);
 for(i=0;i  {
  SPI_RW(TX_Dat_Buffer[i]);
 }
 CSN=1;
 return reg_value; 
}

void nRF24L01_Set_RX_Mode(void)
{
 CE=0;//待机
 SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);
 SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);
 SPI_W_Reg(W_REGISTER+EN_AA,0x01);//auot ack
 SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);
 SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);
 SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
 SPI_W_Reg(W_REGISTER+RF_CH,0);
 SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//0db,lna
 SPI_W_Reg(W_REGISTER+CONFIG,0x0f);
 
 CE=1;
 _delay_ms(5);
}

uchar nRF24L01_RX_Data(void)
{
 sta=SPI_R_byte(R_REGISTER+STATUS);
 if(RX_DR)
 {
  CE=0;
  SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
  SPI_W_Reg(W_REGISTER+STATUS,0xff);
  CSN=0;
  SPI_RW(FLUSH_RX);
  CSN=1;
  return 1;
 }
 else
  return 0;
 
}


void main(void)
{
 uchar i;
 P0=0xff;
 P1=0xff;
 P2=0xff;
 P3=0xff;
 _delay_us(1000);
 nRF24L01_Init();
 while(1)
 {
  nRF24L01_Set_RX_Mode();
  _delay_ms(100);
  if(nRF24L01_RX_Data())
  {
   LED=0;//如果有数据收到灯亮
  }
  else//否则灯熄
   LED=1;
 }
}

关键字:NRF24L01  接收程序  单片机  STC89C52 引用地址:NRF24L01接收程序(单片机是STC89C52)

上一篇:单片机教程及学习之LCD1602显示DS18B20温度实验
下一篇:NRF24L01发送程序(单片机是STC89C52)

推荐阅读最新更新时间:2024-03-16 14:30

单片机最小系统组成及电源/复位/振荡电路解析
单片机最小系统主要由电源、复位、振荡电路以及扩展部分等部分组成。最小系统原理图如图所示。 电源模块 对于一个完整的电子设计来讲,首要问题就是为整个系统提供电源供电模块,电源模块的稳定可靠是系统平稳运行的前提和基础。51单片机虽然使用时间最早、应用范围最广,但是在实际使用过程中,一个和典型的问题就是相比其他系列的单片机,51单片机更容易受到干扰而出现程序跑飞的现象,克服这种现象出现的一个重要手段就是为单片机系统配置一个稳定可靠的电源供电模块。 电源模块电路图 此最小系统中的电源供电模块的电源可以通过计算机的USB口供给,也可使用外部稳定的5V电源供电模块供给。电源电路中接入了电源指示LED
[单片机]
<font color='red'>单片机</font>最小系统组成及电源/复位/振荡电路解析
MSP430G2553单片机——利用蜂鸣器播放一首歌
利用MSP430G2553单片机和无源蜂鸣器播放一首歌,下面给出两种方案。 方案一: 播放《两只老虎》 #include MSP430G2553.h //音乐播放 // by wys void P_Onclick(int n,int j); //7个基本音的子函数 void jby_1(int s); void jby_2(int s); void jby_3(int s); void jby_4(int s); void jby_5(int s); void jby_6(int s); void jby_7(int s); void main(void) { WDTCTL = WDTPW + WDTHOLD;
[单片机]
ISD2500与ATmega8单片机配合使用的智能语音系统设计
1 引言 语言是信息交流的最直接工具。在工业领域,在传统的人机交互中,人们往往通过数码显示、光、电结合来接收机器发出的信息,这是由当时的技术水平所决定的。随着半导体技术和计算机技术的飞速发展,语音技术也在不断取得突破,尤其是语音合成技术正在日臻完善,新型语音芯片不断涌现,美国ISD公司生产的 ISD2500系列语音芯片就是其中的优秀产品。它可以采用单芯片控制方式,也可以采用微处理器控制方式。 2 ISD2500系列语音芯片介绍 ISD2500系列语音芯片是一种高保真录放一体化的单片固态语音集成电路,采用了ISD公司的专利“直接模拟存储技术”,把模拟数据成功地存入半导体存储器中。这种突破性的EEPROM存储方法可以将模
[单片机]
ISD2500与ATmega8<font color='red'>单片机</font>配合使用的智能语音系统设计
AVR单片机的IO端口介绍
ATmega16有4个8位的双向I/O端口PA、PB、PC、PD,他们对外对应32个I/O引脚,每一位都可以独立地用于逻辑信号的输入和输出。在5V工作电压下,输出高点平时,每个引脚可输出达20mA的驱动电流;而输出低电平时,每个引脚可吸收最大为40mA的电流,可以直接驱动发光二极管(一般的发光二极管的驱动电流为10mA)和小型继电器等小功率器件。 AVR大部分的I/O端口都具备双重功能(有的还有第三功能)。其中第一功能是作为数字通用I/O接口使用,而复用的功能可分别与片内的各种不同功能的外围接口电路组合成一些可以完成特殊功能的I/O口,如定时器、计数器、串行接口、模拟比较器、捕捉器、USART、SPI等。 AVR单片机的每
[单片机]
一种三MCU系统的硬件实现
    摘要: 介绍以两片80C196KC为主处理MCU、一片89C51进行动态LED显示的三MCU系统。两80C196KC之间通过互访数据存储器进行数据交换,80C196KC与89C51的通讯使用串行口。     关键词: 单片机 多处理器 总线控制 存储器共享 MCS96系列单片机是16位单片机。运算速度高、I/O资源丰富、具有10位A/D转换器,特别适合于实时处理、实时控制的各类自动控制系统,如工业过程控制系统、伺服系统、分布式控制系统、变频调速电机控制系统等。在国内有成熟的开发系统和稳定的供货来源,相关资料也非常丰富,开发非常方便。    
[工业控制]
STC单片机AD和EEPROM的程序设计C代码
/*---------------------------------------------------------------- *File Name: stc_AD.c - *Description: A/D 转换程序 *Project: - *MCU type: STC12C5410AD - - *Company: WY - *Compiler: KEI
[单片机]
AVR单片机的复位
VR单片机的复位:看门狗复位、上电复位、掉电复位 看到大家对复位特别是AVR单片机内部的复位功能还不太清楚,现在这里简单说一下,希望在家能有个总体的认识。不对之处希望大家指出,觉的好就帮忙顶两下。 AVR单片机复位大概有:上电复位、掉电复位、看门狗超时复位、外部复位,这么四种。 上电复位:就是在一通电的时候对单片机进行复位,这和我们外接RC复位电路的作用是一样的,AVR单片机内部带有上电复位功能。 掉电复位:就是在单片机运行过程中电压突然跌落,这个时候单片机会出现很多不确定的现象,所以在这个时候需要将单片机复位,让它处于一个确定的状态。这就是BOD功能,一个非常实用的功能,AVR单片机带有这个功能。 看门狗复位:这是我们常说
[单片机]
STM32单片机FSMC的使用解析
在做项目的过程中遇到了这个问题,感觉文章写得不错,共享给对FSMC的使用怀有疑惑的同伴们! LCD有如下控制线: CS:Chip Select片选,低电平有效 RS:Register Select寄存器选择 WR:Write写信号,低电平有效 RD:Read读信号,低电平有效 RESET:重启信号,低电平有效 DB0-DB15:数据线 假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多): 如果情况如下: DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。 CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效) RS为1(表示DB0-15上传
[单片机]
STM32<font color='red'>单片机</font>FSMC的使用解析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved