NRF24L01使用之四个按键控制四个led灯汇总Word文档格式.docx
- 文档编号:6874600
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:20
- 大小:19.05KB
NRF24L01使用之四个按键控制四个led灯汇总Word文档格式.docx
《NRF24L01使用之四个按键控制四个led灯汇总Word文档格式.docx》由会员分享,可在线阅读,更多相关《NRF24L01使用之四个按键控制四个led灯汇总Word文档格式.docx(20页珍藏版)》请在冰点文库上搜索。
#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<
x;
j++)
for(i=0;
i<
12;
i++);
}
void_delay_ms(uintx)
120;
/*nRF24L01初始化*/
voidnRF24L01_Init(void)
CE=0;
//待机模式Ⅰ
CSN=1;
SCK=0;
IRQ=1;
/*SPI时序函数*/
ucharSPI_RW(ucharbyte)
uchari;
for(i=0;
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);
//写入一字节
//
returnstatus;
/*SPI*/
ucharSPI_R_byte(ucharreg)
ucharreg_value;
SPI_RW(reg);
//写入地址
reg_value=SPI_RW(0);
//读取寄存器的值
returnreg_value;
//返回读取的值
/*SPI读取RXFIFO寄存器数据*/
/**Dat_Buffer:
用来存读取的数据*/
/*DLen:
数据长度*/
ucharSPI_R_DBuffer(ucharreg,uchar*Dat_Buffer,ucharDlen)
ucharstatus,i;
//写入寄存器地址,同时状态
Dlen;
i++)
Dat_Buffer[i]=SPI_RW(0);
//存储数据
/*SPI向TXFIFO寄存器写入数据*/
写入寄存器地址*/
/*TX_Dat_Buffer:
存放需要发送的数据*/
/*Dlen:
数据长度*/
ucharSPI_W_DBuffer(ucharreg,uchar*TX_Dat_Buffer,ucharDlen)
//SPI片选,启动时序
SPI_RW(TX_Dat_Buffer[i]);
//发送数据
/*设置发送模式*/
voidnRF24L01_Set_TX_Mode(uchar*TX_Data)
//待机(写寄存器之前一定要进入待机模式或掉电模式)
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);
{
tf=1;
TX_Buffer[1]=1;
while(Check_Ack())
LED=0;
}
if(key2==0)
TX_Buffer[2]=1;
if(key3==0)
TX_Buffer[3]=1;
if(key4==0)
TX_Buffer[4]=1;
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);
}
}
接收:
#defineEN_AA0x01//“自动应答”功能寄存器
sbitled1=P0^0;
sbitled2=P0^1;
sbitled3=P0^2;
sbitled4=P0^3;
ucharcodeTX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
_delay_us(2000);
0x80)
else
status=SPI_RW(0);
ucharreg_value,i;
reg_value=SPI_RW(reg);
voidnRF24L01_Set_RX_Mode(void)
//待机
//auotack
SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
//0db,lna
SPI_W_Reg(W_REGISTER+CONFIG,0x0f);
//LNA_RX=1;
//LNA_TX=0;
ucharnRF24L01_RX_Data(unsignedchar*RX_Buffer)
uchari=0;
if(RX_DR)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NRF24L01 使用 四个 按键 控制 led 汇总