基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx

上传人:b****3 文档编号:17038533 上传时间:2022-11-28 格式:DOCX 页数:15 大小:347.33KB
下载 相关 举报
基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx_第1页
第1页 / 共15页
基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx_第2页
第2页 / 共15页
基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx_第3页
第3页 / 共15页
基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx_第4页
第4页 / 共15页
基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx

《基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx》由会员分享,可在线阅读,更多相关《基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx(15页珍藏版)》请在冰豆网上搜索。

基于NRF24L01的C51单片机收发C语言程序详解Word下载.docx

sbitIRQ=P2^6;

//数字输入(可屏蔽中断)

/************************************按键***********************************************/

sbitKEY1=P3^3;

//按键S1

sbitKEY2=P3^2;

//按键S2

/************************************数码管位选******************************************/

sbitled1=P1^0;

//LED0

sbitled2=P1^1;

//LED1

led3=P1^2;

//LED2 

led4=P1^3;

//LED3

led5=P1^4;

//LED4

/*********************************************NRF24L01***********************************/

#defineTX_ADR_WIDTH 

//5uintsTXaddresswidth

#defineRX_ADR_WIDTH 

//5uintsRXaddresswidth

#defineTX_PLOAD_WIDTH 

20 

//20uintsTXpayload

#defineRX_PLOAD_WIDTH 

uintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};

//本地地址

uintconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};

//接收地址

/***************************************NRF24L01寄存器指令*******************************/

#defineREAD_REG 

0x00 

//读寄存器指令

#defineWRITE_REG 

0x20 

//写寄存器指令

#defineRD_RX_PLOAD 

0x61 

//读取接收数据指令

#defineWR_TX_PLOAD 

0xA0 

//写待发数据指令

#defineFLUSH_TX 

0xE1 

//冲洗发送FIFO指令

#defineFLUSH_RX 

0xE2 

//冲洗接收FIFO指令

#defineREUSE_TX_PL 

0xE3 

//定义重复装载数据指令

#defineNOP 

0xFF 

//保留

/*************************************SPI(nRF24L01)寄存器地址***********************/

#defineCONFIG 

//配置收发状态,CRC校验模式以及收发状态响应方式

#defineEN_AA 

0x01 

//自动应答功能设置

#defineEN_RXADDR 

0x02 

//可用信道设置

#defineSETUP_AW 

0x03 

//收发地址宽度设置

#defineSETUP_RETR 

0x04 

//自动重发功能设置

#defineRF_CH 

0x05 

//工作频率设置

#defineRF_SETUP 

0x06 

//发射速率、功耗功能设置

#defineSTATUS 

0x07 

//状态寄存器

#defineOBSERVE_TX 

0x08 

//发送监测功能

#defineCD 

0x09 

//地址检测 

#defineRX_ADDR_P0 

0x0A 

//频道0接收数据地址

#defineRX_ADDR_P1 

0x0B 

//频道1接收数据地址

#defineRX_ADDR_P2 

0x0C 

//频道2接收数据地址

#defineRX_ADDR_P3 

0x0D 

//频道3接收数据地址

#defineRX_ADDR_P4 

0x0E 

//频道4接收数据地址

#defineRX_ADDR_P5 

0x0F 

//频道5接收数据地址

#defineTX_ADDR 

0x10 

//发送地址寄存器

#defineRX_PW_P0 

0x11 

//接收频道0接收数据长度

#defineRX_PW_P1 

0x12 

#defineRX_PW_P2 

0x13 

#defineRX_PW_P3 

0x14 

#defineRX_PW_P4 

0x15 

#defineRX_PW_P5 

0x16 

#defineFIFO_STATUS 

0x17 

//FIFO栈入栈出状态寄存器设置

/*************************************函数声明****************************************/

voidDelay(unsignedints);

 

//大延时

voidinerDelay_us(unsignedcharn);

//小延时

voidinit_NRF24L01(void);

//NRF24L01初始化

uintSPI_RW(uintdat);

//根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节

ucharSPI_Read(ucharreg);

//从reg寄存器读一字节

voidSetRX_Mode(void);

//数据接收配置

uintSPI_RW_Reg(ucharreg,ucharvalue);

 

//写数据value到reg寄存器

uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);

//从reg寄存器读出bytes个字节,通常用来

//读取接收通道数据或接收/发送地址

uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);

//把pBuf缓存中的数据写入到nRF24L01,通常用来写入发

 

//射通道数据或接收/发送地址

unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);

//数据读取后放入rx_buf接收缓冲区中

voidnRF24L01_TxPacket(unsignedchar*tx_buf);

 

//发送tx_buf中数据

/*****************************************长延时*****************************************/

voidDelay(unsignedints)

{

unsignedinti;

for(i=0;

i<

s;

i++);

}

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

uint 

bdatasta;

//状态标志

sbitRX_DR=sta^6;

//RX_DR为sta的第六位

sbitTX_DS=sta^5;

//TX_DS为sta的第五位

sbitMAX_RT=sta^4;

//MAX_RT为sta的第四位

/*延时函数

voidinerDelay_us(unsignedcharn)//延时,us级

for(;

n>

0;

n--)

_nop_();

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

/*NRF24L01初始化

voidinit_NRF24L01(void)

inerDelay_us(100);

CE=0;

//芯片使能

CSN=1;

//禁止SPI 

SCK=0;

//SPI时钟置低

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

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

/*函数:

uintSPI_RW(uintuchar)

/*功能:

NRF24L01的SPI写时序-----根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节

uintSPI_RW(uintdat)

uinti;

i<

8;

i++)//循环8次

{

MOSI=(dat&

0x80);

//dat的最高位输出到MOSI 

MSBtoMOSI

dat=(dat<

<

1);

//从右向左进一位 

shiftnextbitintoMSB..

SCK=1;

//拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 

SetSCKhigh..

dat|=MISO;

//读MISO到dat最低位 

capturecurrentMISObit

SCK=0;

//SCK置低 

..thensetSCKlowagain

}

return(dat);

//返回读出的一字节 

returnreaddat

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

ucharSPI_Read(ucharreg)

NRF24L01的SPI时序-----------从reg寄存器读一字节

ucharreg_val;

CSN=0;

//CSN置低,开始传输数据 

CSNlow,initializeSPIcommunication...

SPI_RW(reg);

//选择寄存器 

Selectregistertoreadfrom..

reg_val=SPI_RW(0);

//然后从该寄存器读数据 

..thenreadregistervalue

CSN=1;

//CSN拉高,结束数据传输 

CSNhigh,terminateSPIcommunication

return(reg_val);

//返回寄存器数据 

returnregistervalue

NRF24L01读写寄存器函数

/*描述:

写数据value到reg寄存器

uintSPI_RW_Reg(ucharreg,ucharvalue)

ucharstatus;

//CSN置低,开始传输数据 

CSNlow,initSPItransaction

status=SPI_RW(reg);

//选择寄存器,同时返回状态字selectregister

SPI_RW(value);

//然后写数据到该寄存器 

..andwritevaluetoit..

//CSN拉高,结束数据传输 

CSNhighagain

return(status);

//返回状态寄存器 

returnnRF24L01statusuchar

uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)

/*功能:

用于读数据,reg:

为寄存器地址,pBuf:

为待读出数据地址,uchars:

读出数据的个数

/*描述:

从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址

uintstatus,i;

SetCSNlow,initSPItranaction

//选择寄存器,同时返回状态字Selectregistertowritetoandreadstatusuchar

uchars;

i++)

pBuf[i]=SPI_RW(0);

//逐个字节从nRF24L01读出 

//返回状态寄存器 

returnnRF24L01statusuchar

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

uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)

用于写数据:

为待写入数据地址,uchars:

写入数据的个数

把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址

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

//选择寄存器,同时返回状态字

inerDelay_us(10);

i++) 

SPI_RW(*pBuf++);

//逐个字节写入nRF24L01

//CSN拉高,结束数据传输

//返回状态寄存器 

voidSetRX_Mode(void)

数据接收配置 

SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);

//CRC使能,16位CRC校验,上电,接收模式 

CE=1;

//拉高CE启动接收设备

inerDelay_us(130);

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

unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf)

数据读取后放入rx_buf接收缓冲区中

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文学研究

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1