NRF24L01使用之四个按键控制四个led灯汇总.docx

上传人:b****3 文档编号:4737921 上传时间:2023-05-07 格式:DOCX 页数:20 大小:19.05KB
下载 相关 举报
NRF24L01使用之四个按键控制四个led灯汇总.docx_第1页
第1页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第2页
第2页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第3页
第3页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第4页
第4页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第5页
第5页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第6页
第6页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第7页
第7页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第8页
第8页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第9页
第9页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第10页
第10页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第11页
第11页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第12页
第12页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第13页
第13页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第14页
第14页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第15页
第15页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第16页
第16页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第17页
第17页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第18页
第18页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第19页
第19页 / 共20页
NRF24L01使用之四个按键控制四个led灯汇总.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

NRF24L01使用之四个按键控制四个led灯汇总.docx

《NRF24L01使用之四个按键控制四个led灯汇总.docx》由会员分享,可在线阅读,更多相关《NRF24L01使用之四个按键控制四个led灯汇总.docx(20页珍藏版)》请在冰点文库上搜索。

NRF24L01使用之四个按键控制四个led灯汇总.docx

NRF24L01使用之四个按键控制四个led灯汇总

发射:

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

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

#defineRX_ADDR_WITDH5

#defineTX_DATA_WITDH8

#defineRX_DATA_WITDH8

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

//nRF24L01指令格式:

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

#defineR_REGISTER0x00//读寄存器

#defineW_REGISTER0x20//写寄存器

#defineR_RX_PLOAD0x61//读RXFIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式

#defineW_TX_PLOAD0xA0//写TXFIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式

#defineFLUSH_TX0xE1//清除TXFIFO寄存器,应用于发射模式

#defineFLUSH_RX0xE2//清除RXFIFO寄存器,应用于接收模式

#defineREUSE_TX_PL0xE3//重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射

#defineNOP0xFF//空操作,可以用来读状态寄存器

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

//nRF24L01寄存器地址

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

#defineCONFIG0x00//配置寄存器

#defineEN_AA0x01//“自动应答”功能寄存

#defineEN_RX_ADDR0x02//接收通道使能寄存器

#defineSETUP_AW0x03//地址宽度设置寄存器

#defineSETUP_RETR0x04//自动重发设置寄存器

#defineRF_CH0x05//射频通道频率设置寄存器

#defineRF_SETUP0x06//射频设置寄存器

#defineSTATUS0x07//状态寄存器

#defineOBSERVE_TX0x08//发送检测寄存器

#defineCD0x09//载波检测寄存器

#defineRX_ADDR_P00x0A//数据通道0接收地址寄存器

#defineRX_ADDR_P10x0B//数据通道1接收地址寄存器

#defineRX_ADDR_P20x0C//数据通道2接收地址寄存器

#defineRX_ADDR_P30x0D//数据通道3接收地址寄存器

#defineRX_ADDR_P40x0E//数据通道4接收地址寄存器

#defineRX_ADDR_P50x0F//数据通道5接收地址寄存器

#defineTX_ADDR0x10//发送地址寄存器

#defineRX_PW_P00x11//数据通道0有效数据宽度设置寄存器

#defineRX_PW_P10x12//数据通道1有效数据宽度设置寄存器

#defineRX_PW_P20x13//数据通道2有效数据宽度设置寄存器

#defineRX_PW_P30x14//数据通道3有效数据宽度设置寄存器

#defineRX_PW_P40x15//数据通道4有效数据宽度设置寄存器

#defineRX_PW_P50x16//数据通道5有效数据宽度设置寄存器

#defineFIFO_STATUS0x17//FIFO状态寄存器

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

ucharsta;//状态变量

#defineRX_DR(sta&0x40)//接收成功中断标志

#defineTX_DS(sta&0x20)//发射成功中断标志

#defineMAX_RT(sta&0x10)//重发溢出中断标志

sbitCE=P2^0;

sbitIRQ=P2^5;

sbitCSN=P2^1;

sbitMOSI=P2^3;

sbitMISO=P2^4;

sbitSCK=P2^2;

sbitkey1=P3^2;

sbitkey2=P3^3;

sbitkey3=P3^4;

sbitkey4=P3^5;

sbitLED=P0^0;

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

 

void_delay_us(uintx)

{

uinti,j;

for(j=0;j

for(i=0;i<12;i++);

}

void_delay_ms(uintx)

{

uinti,j;

for(j=0;j

for(i=0;i<120;i++);

}

/*nRF24L01初始化*/

voidnRF24L01_Init(void)

{

CE=0;//待机模式Ⅰ

CSN=1;

SCK=0;

IRQ=1;

}

/*SPI时序函数*/

ucharSPI_RW(ucharbyte)

{

uchari;

for(i=0;i<8;i++)//一字节8位循环8次写入

{

if(byte&0x80)//如果数据最高位是1//当访问多字节寄存器时首先要读/写的是最低字节的高位?

MOSI=1;//向NRF24L01写1

else//否则写0

MOSI=0;

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

SCK=1;//SCK拉高,写入一位数据,同时读取一位数据

if(MISO)

byte|=0x01;

SCK=0;//SCK拉低

}

returnbyte;//返回读取一字节

}

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

/*reg:

寄存器地址*/

/*value:

一字节(值)*/

ucharSPI_W_Reg(ucharreg,ucharvalue)

{

ucharstatus;//返回状态

CSN=0;//SPI片选

status=SPI_RW(reg);//写入寄存器地址,同时读取状态

SPI_RW(value);//写入一字节

CSN=1;//

returnstatus;//返回状态

}

/*SPI*/

ucharSPI_R_byte(ucharreg)

{

ucharreg_value;

CSN=0;//SPI片选

SPI_RW(reg);//写入地址

reg_value=SPI_RW(0);//读取寄存器的值

CSN=1;

returnreg_value;//返回读取的值

}

/*SPI读取RXFIFO寄存器数据*/

/*reg:

寄存器地址*/

/**Dat_Buffer:

用来存读取的数据*/

/*DLen:

数据长度*/

ucharSPI_R_DBuffer(ucharreg,uchar*Dat_Buffer,ucharDlen)

{

ucharstatus,i;

CSN=0;//SPI片选

status=SPI_RW(reg);//写入寄存器地址,同时状态

for(i=0;i

{

Dat_Buffer[i]=SPI_RW(0);//存储数据

}

CSN=1;

returnstatus;

}

/*SPI向TXFIFO寄存器写入数据*/

/*reg:

写入寄存器地址*/

/*TX_Dat_Buffer:

存放需要发送的数据*/

/*Dlen:

数据长度*/

ucharSPI_W_DBuffer(ucharreg,uchar*TX_Dat_Buffer,ucharDlen)

{

ucharstatus,i;

CSN=0;//SPI片选,启动时序

status=SPI_RW(reg);

for(i=0;i

{

SPI_RW(TX_Dat_Buffer[i]);//发送数据

}

CSN=1;

returnstatus;

}

/*设置发送模式*/

voidnRF24L01_Set_TX_Mode(uchar*TX_Data)

{

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);/*为了接收设备应答信号,接收通道0地址与发送地址相同*/

SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);/*写有效数据地址+有效数据+有效数据宽度*/

SPI_W_Reg(W_REGISTER+EN_AA,0x01);/*接收通道0自动应答*/

SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);/*使能接收通道0*/

SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);/*自动重发延时250US+86US,重发10次*/

SPI_W_Reg(W_REGISTER+RF_CH,0);/*(2400+40)MHZ选择射频通道0X40*/

SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);/*1Mbps速率,发射功率:

0DBM,低噪声放大器增益*/

SPI_W_Reg(W_REGISTER+CONFIG,0x0e);/*发送模式,上电,16位CRC校验,CRC使能*/

CE=1;//启动发射

_delay_ms(5);/*CE高电平持续时间最少10US以上*/

}

 

/*检测应答信号*/

ucharCheck_Ack(void)

{

sta=SPI_R_byte(R_REGISTER+STATUS);/*读取寄存状态*/

if(TX_DS||MAX_RT)/*如果TX_DS或MAX_RT为1,则清除中断和清除TX_FIFO寄存器的值*/

{

SPI_W_Reg(W_REGISTER+STATUS,0xff);

CSN=0;

SPI_RW(FLUSH_TX);

CSN=1;

return0;

}

else

return1;

}

voidmain(void)

{

uchartf=0;

ucharTX_Buffer[8]={0};

P0=0xff;

nRF24L01_Init();

_delay_us(1000);

while

(1)

{

if(key1==0)

_delay_ms(10);

if(key1==0)

{

tf=1;

TX_Buffer[1]=1;

while(Check_Ack())

LED=0;

}

if(key2==0)

_delay_ms(10);

if(key2==0)

{

tf=1;

TX_Buffer[2]=1;

while(Check_Ack())

LED=0;

}

if(key3==0)

_delay_ms(10);

if(key3==0)

{

tf=1;

TX_Buffer[3]=1;

while(Check_Ack())

LED=0;

}

if(key4==0)

_delay_ms(10);

if(key4==0)

{

tf=1;

TX_Buffer[4]=1;

while(Check_Ack())

LED=0;

}

if(tf=1)

{

nRF24L01_Set_TX_Mode(TX_Buffer);

TX_Buffer[1]=0;

TX_Buffer[2]=0;

TX_Buffer[3]=0;

TX_Buffer[4]=0;

tf=0;

_delay_ms(100);

}

}

}

接收:

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

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

#defineRX_ADDR_WITDH5

#defineTX_DATA_WITDH8

#defineRX_DATA_WITDH8

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

//nRF24L01指令格式:

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

#defineR_REGISTER0x00//读寄存器

#defineW_REGISTER0x20//写寄存器

#defineR_RX_PLOAD0x61//读RXFIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式

#defineW_TX_PLOAD0xA0//写TXFIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式

#defineFLUSH_TX0xE1//清除TXFIFO寄存器,应用于发射模式

#defineFLUSH_RX0xE2//清除RXFIFO寄存器,应用于接收模式

#defineREUSE_TX_PL0xE3//重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射

#defineNOP0xFF//空操作,可以用来读状态寄存器

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

//nRF24L01寄存器地址

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

#defineCONFIG0x00//配置寄存器

#defineEN_AA0x01//“自动应答”功能寄存器

#defineEN_RX_ADDR0x02//接收通道使能寄存器

#defineSETUP_AW0x03//地址宽度设置寄存器

#defineSETUP_RETR0x04//自动重发设置寄存器

#defineRF_CH0x05//射频通道频率设置寄存器

#defineRF_SETUP0x06//射频设置寄存器

#defineSTATUS0x07//状态寄存器

#defineOBSERVE_TX0x08//发送检测寄存器

#defineCD0x09//载波检测寄存器

#defineRX_ADDR_P00x0A//数据通道0接收地址寄存器

#defineRX_ADDR_P10x0B//数据通道1接收地址寄存器

#defineRX_ADDR_P20x0C//数据通道2接收地址寄存器

#defineRX_ADDR_P30x0D//数据通道3接收地址寄存器

#defineRX_ADDR_P40x0E//数据通道4接收地址寄存器

#defineRX_ADDR_P50x0F//数据通道5接收地址寄存器

#defineTX_ADDR0x10//发送地址寄存器

#defineRX_PW_P00x11//数据通道0有效数据宽度设置寄存器

#defineRX_PW_P10x12//数据通道1有效数据宽度设置寄存器

#defineRX_PW_P20x13//数据通道2有效数据宽度设置寄存器

#defineRX_PW_P30x14//数据通道3有效数据宽度设置寄存器

#defineRX_PW_P40x15//数据通道4有效数据宽度设置寄存器

#defineRX_PW_P50x16//数据通道5有效数据宽度设置寄存器

#defineFIFO_STATUS0x17//FIFO状态寄存器

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

ucharsta;//状态变量

#defineRX_DR(sta&0x40)//接收成功中断标志

#defineTX_DS(sta&0x20)//发射成功中断标志

#defineMAX_RT(sta&0x10)//重发溢出中断标志

sbitCE=P2^0;

sbitIRQ=P2^5;

sbitCSN=P2^1;

sbitMOSI=P2^3;

sbitMISO=P2^4;

sbitSCK=P2^2;

sbitled1=P0^0;

sbitled2=P0^1;

sbitled3=P0^2;

sbitled4=P0^3;

 

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

ucharcodeTX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void_delay_us(uintx)

{

uinti,j;

for(j=0;j

for(i=0;i<12;i++);

}

void_delay_ms(uintx)

{

uinti,j;

for(j=0;j

for(i=0;i<120;i++);

}

voidnRF24L01_Init(void)

{

_delay_us(2000);

CE=0;

CSN=1;

SCK=0;

IRQ=1;

}

ucharSPI_RW(ucharbyte)

{

uchari;

for(i=0;i<8;i++)

{

if(byte&0x80)

MOSI=1;

else

MOSI=0;

byte<<=1;

SCK=1;

if(MISO)

byte|=0x01;

SCK=0;

}

returnbyte;

}

ucharSPI_W_Reg(ucharreg,ucharvalue)

{

ucharstatus;

CSN=0;

status=SPI_RW(reg);

SPI_RW(value);

CSN=1;

returnstatus;

}

ucharSPI_R_byte(ucharreg)

{

ucharstatus;

CSN=0;

SPI_RW(reg);

status=SPI_RW(0);

CSN=1;

returnstatus;

}

ucharSPI_R_DBuffer(ucharreg,uchar*Dat_Buffer,ucharDlen)

{

ucharreg_value,i;

CSN=0;

reg_value=SPI_RW(reg);

for(i=0;i

{

Dat_Buffer[i]=SPI_RW(0);

}

CSN=1;

returnreg_value;

}

ucharSPI_W_DBuffer(ucharreg,uchar*TX_Dat_Buffer,ucharDlen)

{

ucharreg_value,i;

CSN=0;

reg_value=SPI_RW(reg);

for(i=0;i

{

SPI_RW(TX_Dat_Buffer[i]);

}

CSN=1;

returnreg_value;

}

voidnRF24L01_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);//auotack

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;

//LNA_RX=1;

//LNA_TX=0;

_delay_ms(5);

}

ucharnRF24L01_RX_Data(unsignedchar*RX_Buffer)

{

uchari=0;

sta=SPI_R_byte(R_REGISTER+STATUS);

if(RX_DR)

{

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

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2