基于NRF24L01无线模块的STC89C52单片机发射

发布者:暗里著迷最新更新时间:2015-07-06 来源: 51hei关键字:NRF24L01  无线模块  STC89C52 手机看文章 扫描二维码
随时随地手机看文章
在网上看到很多朋友都在苦苦寻找NRF24L01无线模块相关程序,在此为了满足大家贴出来,方便大家学习,此程序注释详细。功能简单说一下:NRF24L01无线模块就要完成TxDate数组数据的发送,很简单的一个程序,只要你硬件没有问题,一般都可以正常工作的!
        

#include 

#define unchar unsigned char

#define unint  unsigned int

/*******************************************************/

#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节

#define RX_ADDR_WITDH 5//接收地址宽度设置为5个字节

#define TX_DATA_WITDH 4//发送数据宽度1个字节

#define RX_DATA_WITDH 4//接收数据宽度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接收地址

#define  TX_ADDR         0x10//发送地址

#define  RX_PW_P0        0x11//P0通道数据宽度设置

#define  RX_PW_P1        0x12//P1通道数据宽度设置

#define  RX_PW_P2        0x13//P2通道数据宽度设置

#define  RX_PW_P3        0x14//P3通道数据宽度设置

#define  RX_PW_P4        0x15//P4通道数据宽度设置

#define  RX_PW_P5        0x16//P5通道数据宽度设置

#define  FIFO_STATUS     0x17//FIFO状态寄存器

/*******************相关函数声明**************************/

unchar NRFACK();

unchar NRFSPI(unchar date);

unchar NRFReadReg(unchar RegAddr);

unchar NRFWriteReg(unchar RegAddr,unchar date);

unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen);

unchar NRFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen);

unchar NRFRevDate(unchar *RevDate);

void NRFSetTxMode(unchar *TxDate);

void NRF24L01Int();

void NRFSetRXMode();

unchar CheckACK();

unchar sta;

/******************SPI口定义*******************************/

sbit CE=P2^0;  //RX/TX模式选择端

sbit IRQ=P2^5; //可屏蔽中断端

sbit CSN=P2^3; //SPI片选端//就是SS

sbit MOSI=P2^4;//SPI主机输出从机输入端

sbit MISO=P2^2;//SPI主机输出从机输出端

sbit SCLK=P2^1;//SPI时钟端

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

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

unchar bdata sta;   //状态标志

sbit RX_DR=sta^6;

sbit TX_DS=sta^5;

sbit MAX_RT=sta^4;

/***************************延时函数****************/

void Delay(unint t)

{

 unint x,y;

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

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

}

/*****************SPI时序函数******************************************/

unchar NRFSPI(unchar date)

{

   unchar 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()

{

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

CE=0; //待机模式1  

CSN=1;  

SCLK=0;

IRQ=1;

}[page]

/*****************SPI读寄存器一字节函数*********************************/

unchar NRFReadReg(unchar RegAddr)

{

  unchar BackDate;

  CSN=0;//启动时序

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

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

  CSN=1;

  return(BackDate); //返回状态

}

/*****************SPI写寄存器一字节函数*********************************/

unchar NRFWriteReg(unchar RegAddr,unchar date)

{

  unchar BackDate;

  CSN=0;//启动时序

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

  NRFSPI(date);//写入值

  CSN=1;

  return(BackDate);

}

/*****************SPI读取RXFIFO寄存器的值********************************/

unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen)

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

   unchar BackDate,i;

CSN=0;//启动时序

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

for(i=0;i
				   
关键字:NRF24L01  无线模块  STC89C52 引用地址:基于NRF24L01无线模块的STC89C52单片机发射

上一篇:基于ds18b20温度带上限程序--LCD1602液晶显示
下一篇:51单片机驱动ADC0809片内RAM存转换结果汇编程序

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

51单片机-STC89C52系列学习第三篇之中断学习
八个中断请求源: 1、外部中断0 2、外部中断1 3、外部中断 2 4、外部中断3 5、定时器0中断 6、定时器1中断 7、定时器2中断 8、串口中断 所有的中断都具有四个中断优先级: 优先级0:0,0(最低) 优先级1:0,1 优先级2:1,0 优先级3:1,1(最高) 中断触发方式: 外部中断0、1、2、3既可低电平触发也可下降沿触发。 定时器中断0、1:溢出 串口中断:发送或接收完成 C语言编程,中断查询次序号就是中断号: void Int0_ISR(void) interrupt 0; void timer0_ISR(void) interrupt 1; void Int1_ISR(void) interrupt
[单片机]
51单片机-<font color='red'>STC89C52</font>系列学习第三篇之中断学习
stc51单片机硬件SPI驱动nrf24l01程序
stc51系类单片机大多数带SPI模块,例如STC12C5608AD,就带有SPI口,可以直接用此SPI口驱动nrf24l01,省去模拟SPI的麻烦。 spi初始化代码如下: void SPI_Init(void) { SPSTAT |= 0XC0; // 清高两位, SPCTL = 0XD0; // 设置为主模式,开SPI } spi收发数据代码如下: uchar SPI_RW(uchar tr_data) { uchar i=0; SPSTAT |= 0Xc0; // 清高两位, SPDAT=tr_data; while(((SPSTAT&0X80)!=0X80)&&(i 20)) { i++; delay_ms(1)
[单片机]
STC89C52+AT24C02实现设备开机次数记录
一、项目介绍 在一些设备的使用过程中,需要对设备的使用次数进行统计和记录。这可以用于评估设备的实际使用寿命、确定维护周期、预测故障风险等方面,对于提高设备的稳定性和可靠性具有重要意义。 当前项目采用STC89C52作为主控芯片,AT24C02作为存储芯片,实现了设备的开机次数记录功能。每次设备上电启动时,程序会从AT24C02中读取之前的记录值并加1,然后再将新的记录值写入AT24C02中,从而完成一次开机次数的记录。通过这种方式,可以实时、准确地记录设备的使用次数,并且不受断电影响,数据可靠性高 二、AT24C02介绍 AT24C02是一款由Atmel公司生产的串行EEPROM存储器芯片,可以存储2K(2048bit)
[单片机]
<font color='red'>STC89C52</font>+AT24C02实现设备开机次数记录
你知道植入在牙刷里的无线模块有多小?有多轻?
我们正在用一种新的方式使日常牙刷更方便。 随着人们物质生活越来越丰富,美食在日常社交生活中的占比越来越高,各种口腔护理问题出现的比率也日趋攀升。护理口腔的第一步就是“刷牙”,那么,牙刷怎么选呢? 毫无疑问,和普通牙刷相比,电动牙刷的使用体验绝对是升级,而且也是享受的。将电动牙刷与智能手机或其他设备通过无线连接,还可以使我们的日常刷牙更有效率。 加贺电子新品牌“CONTINECT”下的无线模块也被用于电动牙刷,通过无线模块连接牙刷和应用程序,我们就可以查看牙齿上的残留物,同时将每日刷牙结果作为日志记录在应用程序上,不仅可以了解刷牙习惯,还可以检查口腔。 将熟悉的产品转换为物联网时需要担心的事情:有限的安装表面 一般电动牙
[嵌入式]
你知道植入在牙刷里的<font color='red'>无线模块</font>有多小?有多轻?
8051单片机(STC89C52)八段数码管静态点亮
在STC89C52的左上角, 有八个八段数码管. 在控制数码管点亮的过程中, 某一时刻只能根据P24 P23 P22三个引脚的高低电平情况(3-8译码器的三个输入)点亮一个数字. 这里(P24, P23, P22) = (0, 1, 1), 则从右数第四个数字亮. 再令P0 = 0x5b;//0101 1011, 则该位置显示数字 2 . 补充说明一下P0给定数值与数码管引脚的对应情况: (0, 1, 0, 1, 1, 0, 1, 1) - (h, g, f, e, d, c, b, a). P24 P23 P22 右数第几个数码管亮 0 0 0 1 0 0 1 2 0 1 0 3 0 1 1 4 1 0 0 5
[单片机]
8051单片机(<font color='red'>STC89C52</font>)八段数码管静态点亮
基于MSP430F2012和nRF24L01的有源RFID标签的应用设计
本文介绍了有源标签的设计理念出发,针对煤矿井下一般小范围空间RFID定位的需求,根据低功耗、高效率的原则进行RFID标签的设计。系统在硬件上采用了MSP430F2012单片机和nRF24L01射频芯片的低功耗组合;软件上则结合了RFID定位的特点,介绍了有别于一般以识别为主要目的的标签的设计方法,并分析了其软件设计流程以及简单的防冲突能力。通过良好匹配的天线,本设计有效读取距离可达几十米,足以应付一般空间内定位的需求。 1.引言 射频识别(RFID)技术是采用无线射频的方式实现双向数据交换并识别身份,RFID定位正是利用了这一识别特性,利用阅读器和标签之间的通信信号强度等参数进行空间的定位。 RFID标签按供电方式分为有源和无源2
[单片机]
基于MSP430F2012和<font color='red'>nRF24L01</font>的有源RFID标签的应用设计
基于单片机STC89C52RC的汽车中网扫描灯设计
    摘 要: 生活水平的不断提高使汽车逐步走进了千家万户。追求时尚个性的心理使车主们费尽心思装扮自己的爱车。汽车LED中网扫描灯既彰显个性,又可以起到警示作用,甚至还有一个好听的名字叫游侠灯。本文介绍一款汽车中网扫描灯的设计制作方法。它主要采用了常见的STC89C52RC单片机作为主控制器,采用光电耦合器进行信号转换,用市场上采购的食人鱼LED灯条改装成八组LED扫描灯。能够产生拖尾和呼吸等效果,还可以进行底盘灯和无线遥控等功能的扩展。    0 引言   LED产业的迅猛发展给照明和装饰都带来了不小的冲击,特别是LED与汽车的结合更是当前的热门话题。汽车中的阅读灯、示宽灯、刹车灯,甚至照明大灯都渐渐出现了LED的身影。当
[汽车电子]
基于单片机<font color='red'>STC89C52</font>RC的汽车中网扫描灯设计
基于单片机STC89C52RC的汽车中网扫描灯设计
  生活水平的不断提高使汽车逐步走进了千家万户。追求时尚个性的心理使车主们费尽心思装扮自己的爱车。汽车LED中网扫描灯既彰显个性,又可以起到警示作用,甚至还有一个好听的名字叫游侠灯。本文介绍一款汽车中网扫描灯的设计制作方法。它主要采用了常见的STC89C52RC单片机作为主控制器,采用光电耦合器进行信号转换,用市场上采购的食人鱼LED灯条改装成八组LED扫描灯。能够产生拖尾和呼吸等效果,还可以进行底盘灯和无线遥控等功能的扩展。   0 引言   LED产业的迅猛发展给照明和装饰都带来了不小的冲击,特别是LED与汽车的结合更是当前的热门话题。汽车中的阅读灯、示宽灯、刹车灯,甚至照明大灯都渐渐出现了LED的身影。当然作为装饰用的仪
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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