单片机---NRF24L01---56----1

#include<STC15.h> //调用STC官方头文件
#include<intrins.h> //调用头文件
#define u8 unsigned char //宏定义字节0-255
#define u16 unsigned short //宏定义字0-65535
#define u32 unsigned long //宏定义长字 32位

//2.4G无线模块 接口********************************************************/
#define ADR_WIDTH 5 //5字节地址宽度
#define DATA_WIDTH 25 //32字节有效数据宽度
#define NRF24L01_Tx_Mode 0x0e //配置成发送模式的二进制码
#define NRF24L01_Rx_Mode 0x0f //配置成接收模式的二进制码
#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
#define RX_DR 0x40 /**/
#define TX_DS 0x20
#define MAX_RT 0x10
extern void NRF24L01_Init(u8 Mode); //NRF24L01初始化
extern u8 NRF24L01_Rx_Data_Ser(void); //NRF24L01读数据
extern void NRF24L01_Tx_Data_Ser(void); //NRF24L01写数据
extern void NRF24L01_Delete_Ser(); //NRF24L01擦除中断标志(写1擦除)
extern u8 idata NRF24L01_Tx_Buffer[DATA_WIDTH]; //待发送的数据,最大32字节
/
#include “ALL_NAME.h”

//********** NRF24L01寄存器操作命令 ************************************/
#define READ_REG 0x00 //读配置寄存器,低5位为寄存器地址
#define WRITE_REG 0x20 //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD 0x61 //读RX有效数据,1~32字节
#define WR_TX_PLOAD 0xA0 //写TX有效数据,1~32字节
#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL 0xE3 //重新使用上一包数据,P_24L01_CE为高,数据包被不断发送.
#define NOP 0xFF //空操作,可以用来读状态寄存器
//
NRF24L01寄存器地址 **************************************************/
#define CONFIG 0x00 //配置寄存器地址
#define EN_AA 0x01 //使能自动应答功能
#define EN_RXADDR 0x02 //接收地址允许
#define SETUP_AW 0x03 //设置地址宽度(所有数据通道)
#define SETUP_RETR 0x04 //建立自动重发
#define RF_CH 0x05 //RF通道
#define RF_SETUP 0x06 //RF寄存器
#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有效数据宽度(1~32字节)
#define RX_PW_P1 0x12 // 接收数据通道1有效数据宽度(1~32字节)
#define RX_PW_P2 0x13 // 接收数据通道2有效数据宽度(1~32字节)
#define RX_PW_P3 0x14 // 接收数据通道3有效数据宽度(1~32字节)
#define RX_PW_P4 0x15 // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5 0x16 // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS 0x17 // FIFO状态寄存器

#define ADR_WIDTH 5 //5字节地址宽度
#define DATA_WIDTH 25 //32字节有效数据宽度
#define NRF24L01_Tx_Mode 0x0e //配置成发送模式的二进制码
#define NRF24L01_Rx_Mode 0x0f //配置成接收模式的二进制码
#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
extern void NRF24L01_Init(u8 Mode); //NRF24L01初始化
extern void NRF24L01_Tx_Data_Ser(void); //NRF24L01写数据
extern void NRF24L01_Delete_Ser(); //NRF24L01擦除中断标志(写1擦除)
extern u8 idata NRF24L01_Tx_Buffer[DATA_WIDTH]; //待发送的数据,最大32字节

sbit NRF24L01_CSN =P3^7; //芯片选择 模块与单片机通信的时候,1 禁止芯片通信 0 使芯片可以通信
sbit NRF24L01_CE =P3^6; //模式选择 1控制芯片处于收发模式 0 芯片处于,即将进入待机模式
sbit NRF24L01_SCK =P3^5; //SPI 上升沿,MOSI移位拷贝进去。下降沿,单片机可以读取MISO电平
sbit NRF24L01_MOSI=P3^4; //数据输入 在SCK的上升沿,模块通过移位,读取MOSI脚的电平
sbit NRF24L01_MISO=P3^3;//数据输出 在SCK的下降沿,模块通过移位,从MISO输出电平到脚
sbit NRF24L01_IRQ =P3^2;//中断输出,发送完,接收完,重发次数超过,都会输出低电平。软件清除中断。
//NRF24L01 无线模块,使用的事SPI接口,输入数据的同时可以输出数据。

u8 code TX_ADDRESS[ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; //发送地址
u8 idata NRF24L01_Tx_Buffer[DATA_WIDTH]; //即将准备发送的数据
//***************************************************************************
// SPI读写程序,时钟上升沿往MOSI写一位,然后左移,
// 时钟下降沿从MISO读一位,总共8次,读、写一字节
//***************************************************************************
u8 NRF24L01_SPI_Drive(u8 Dat) //一个字节的发送并读取
{
u8 i;
for(i=0;i<8;i++) //每字节操作8次
{
NRF24L01_MOSI=Dat&0x80; //发送最高位 MOSI发送到无线模块
Dat<<=1;
NRF24L01_SCK=1; //时钟上升沿
Dat|=NRF24L01_MISO; //读出的位赋值给字节最低位,八位数据与2位数据相或最低位相加0或1,MISO读取给单 片机
NRF24L01_SCK=0; //时钟下降沿
}
return (Dat); //读出的值返回
}
//***************************************************************************
// 先写寄存器地址并且同时返回状态值,然后把要发送的数据写入
//***************************************************************************
u8 NRF24L01_Write_Read_Reg_Drive(u8 reg,u8 Value)
{
u8 idata Result;
NRF24L01_CSN=0; //芯片的SPI功能选通
Result=NRF24L01_SPI_Drive(reg); //写寄存器地址的同时返回状态值
NRF24L01_SPI_Drive(Value); //紧接着写入寄存器的命令码
NRF24L01_CSN=1; //芯片关闭SPI功能
return Result; //读出的值返回
}/*
//***************************************************************************
// 从缓冲器读出数据包,pBuf是数组首地址,len是写的字节数量
//
**************************************************************************
u8 NRF24L01_Read_Buffer_Drive(u8 reg,u8 pBuf,u8 len)
{
u8 idata Result,k;
NRF24L01_CSN=0; //芯片的SPI功能选通
Result=NRF24L01_SPI_Drive(reg); //写寄存器地址的同时返回状态值
for(k=0;k<len;k++)
{
pBuf[k]=NRF24L01_SPI_Drive(0xff);//读出数据
}
NRF24L01_CSN=1; //芯片关闭SPI功能
return Result; //返回读到的状态值
}//
/
//***************************************************************************
// 把数据包写入缓冲器,pBuf是数组首地址,len是写的字节数量
//
**************************************************************************
u8 NRF24L01_Write_Buffer_Drive(u8 reg,u8 pBuf,u8 len)
{
u8 idata Result,k;
NRF24L01_CSN=0; //芯片的SPI功能选通
Result=NRF24L01_SPI_Drive(reg); //写寄存器地址的同时返回状态值
for(k=0;k<len;k++)
{
NRF24L01_SPI_Drive(pBuf++);//写入数据
}
NRF24L01_CSN=1; //芯片关闭SPI功能
return Result; //返回读到的状态值
}//
/
//
**************************************************************************
// 无线模块各种参数配置
//***************************************************************************
void NRF24L01_Init(u8 Mode)
{
NRF24L01_CE=0;
NRF24L01_CSN=1;
NRF24L01_SCK=0;
NRF24L01_Write_Buffer_Drive(0x20+TX_ADDR,TX_ADDRESS,ADR_WIDTH); //发送地址和收方地址一致
NRF24L01_Write_Buffer_Drive(0x20+RX_ADDR_P0,TX_ADDRESS,ADR_WIDTH); //通道0自动应答,地址、发送地址和收方一致
NRF24L01_Write_Read_Reg_Drive(0x20+RX_PW_P0,DATA_WIDTH); //接收数据通道0有效数据宽度
NRF24L01_Write_Read_Reg_Drive(0x20+EN_AA,0x01); //使能通道0的自动应答
NRF24L01_Write_Read_Reg_Drive(0x20+EN_RXADDR,0x01); //使能通道0的接收地址
NRF24L01_Write_Read_Reg_Drive(0x20+RF_CH,40); //设置RF通道为125
NRF24L01_Write_Read_Reg_Drive(0x20+RF_SETUP,0x0f); //0db增益 2Mbps
NRF24L01_Write_Read_Reg_Drive(0x20+CONFIG,Mode); //重发间隔:500us+86us;最大自动重发10次
}/*
//***************************************************************************
// 24L01的接收数据函数 数据保存到 NRF24L01_Rx_Buffer
//***************************************************************************
u8 NRF24L01_Rx_Data_Ser(void)
{
u8 idata Result;
NRF24L01_CE=0;
NRF24L01_IRQ=1;
Result=NRF24L01_Read_Buffer_Drive(RD_RX_PLOAD,NRF24L01_Rx_Buffer,DATA_WIDTH);//读取数据
NRF24L01_CE=1;
return Result;
}//*/

//****************************************************************************
// 无线模块数据发送 *************************************
//****************************************************************************
void NRF24L01_Tx_Data_Ser()
{
u8 status;
NRF24L01_CE=0; //CE拉低,使能24L01配置
NRF24L01_Write_Buffer_Drive(WR_TX_PLOAD,NRF24L01_Tx_Buffer,DATA_WIDTH); //写数据到TX FIFO,32个字节
NRF24L01_CE=1; //CE置高,使能发送
status=NRF24L01_Write_Read_Reg_Drive(STATUS,0); //读取状态寄存器的值
if((status&TX_DS)||(status&MAX_RT)) //发送中断或者达到最大重发次数中断
{
NRF24L01_Write_Read_Reg_Drive(0x20+STATUS,status);//清除TX_DS或MAX_RT中断标志
NRF24L01_Write_Read_Reg_Drive(FLUSH_TX,0xff); //清除TX FIFO寄存器
}
}//*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STC51单片机是一种常用的8位单片机,而nRF24L01是一款常用的无线通信模块。下面是对STC51单片机nRF24L01进行无线通信测试的步骤: 1.连接硬件:首先,将STC51单片机nRF24L01模块通过SPI接口连接起来。确保连接正确且稳定。 2.编写代码:使用STC51单片机的开发工具,编写适当的代码,以初始化nRF24L01模块并进行通信设置。代码应包括设置nRF24L01的传输频率、数据速率、功率等参数,以及接收和发送数据的相关函数。 3.设置发送端:在代码中,将STC51单片机作为发送端。设置发送的数据数据的发送方式。可以选择以固定的时间间隔发送数据,或通过外部输入信号触发发送。 4.设置接收端:同样在代码中设置STC51单片机作为接收端。设置接收模式,并实现接收数据的函数。确保接收到的数据能够准确地解析和处理。 5.编译和烧录:将编写的代码进行编译,并通过编程器将生成的HEX文件烧录到STC51单片机中。 6.测试:将发送端和接收端分别与电源连接,确保它们之间的通信正常。可以通过串口调试助手等工具来观察发送和接收的数据。 7.改进和优化:如果通信中遇到问题,可以根据实际情况进行调试和优化。例如,通过调整数据传输速率、增加冗余校验等方式来提高通信质量。 总之,进行STC51单片机nRF24L01无线通信测试需要连接硬件、编写代码、设置发送和接收端,并进行测试和优化。通过这些步骤,可以实现基于STC51单片机nRF24L01的无线通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_49327613

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值