NRF24L01使用之四个按键控制四个led灯汇总.docx
- 文档编号:4737921
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:20
- 大小:19.05KB
NRF24L01使用之四个按键控制四个led灯汇总.docx
《NRF24L01使用之四个按键控制四个led灯汇总.docx》由会员分享,可在线阅读,更多相关《NRF24L01使用之四个按键控制四个led灯汇总.docx(20页珍藏版)》请在冰点文库上搜索。
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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NRF24L01 使用 四个 按键 控制 led 汇总