void main() { unsigned char testdisplay[8]={'1','1','1','1','1','1','1','1'}; uchar i; //自己加的 // uchar datedisplay[7]; init_io(); P0=0x00;//屏蔽数码管 delay(10); //延时 // wela=0; // dula=0; // inte(); lcd_init2(); lcd12864(testdisplay); /******************自己加的**************************/ while(NRF_Check()); RX_Mode();// interface(); while(NRF24L01_RxPacket(RxBuf)!=0); while(1) { if(NRF24L01_RxPacket(RxBuf)==0) { for(i=0;i<8;i++) datedisplay[i]=RxBuf[i]; } checkbutton(); lcd12864(datedisplay); } }
/*=====================================================================================================*/ void NRF24L01_Init( u8 NRF_INIT_MODE ) { NRF_CE = 0; NRF_SetAddr(NRF_TX_ADDR, TX_ADDRESS); // 設定 TX 地址 NRF_SetAddr(NRF_RX_ADDR_P0, RX_ADDRESS); // 設定 RX 地址 NRF_WriteReg(CMD_W_REG | NRF_EN_AA, 0x01); // 致能通道0的自動應答 NRF_WriteReg(CMD_W_REG | NRF_EN_RXADDR, 0x01); // 致能 data Pipe 0 的接收地址 NRF_WriteReg(CMD_W_REG | NRF_SETUP_RETR, 0x1A); // 設定自動重發間隔時間:500us + 86us;最大自動重發次數:10次 NRF_SetChannel(NRF_CHANAL); // 設定傳輸通道(頻率) NRF_SetDataRate(NRF_RATE_2Mbps); // 設定傳輸速率 2Mbps // NRF_WriteReg(CMD_W_REG | NRF_RX_PW_P0, NRF_TX_PL_WIDTH); // 設定通道0的有效數據寬度 switch(NRF_INIT_MODE) { case NRF_MODE_FTLR: NRF_WriteReg(CMD_W_REG | NRF_CONFIG, 0x0E); // Power UP,Enable 16bit CRC,TX Mode,no mask NRF_FlushRxFIFO(); NRF_FlushTxFIFO(); break; case NRF_MODE_FRLT: NRF_FlushRxFIFO(); NRF_FlushTxFIFO(); NRF_WriteReg(CMD_W_REG | NRF_CONFIG, 0x0F); // Power UP,Enable 16bit CRC,RX Mode,no mask break; } NRF_WriteReg(CMD_RX_PL_WID, 0x73); NRF_WriteReg(CMD_W_REG | NRF_DYNPD, 0x01); NRF_WriteReg(CMD_W_REG | NRF_FEATURE, 0x07); NRF_CE = 1; while(NRF_Check()!=SUCCESS); }
int main(void) { /* 串口1初始化 */ USART1_Config(); /*SPI接口初始化*/ SPI_NRF_Init(); printf("\r\n 这是一个 NRF24L01 无线传输实验 \r\n"); printf("\r\n 这是无线传输 从机端 的反馈信息\r\n"); printf("\r\n 正在检测NRF与MCU是否正常连接。。。\r\n"); /*检测NRF模块与MCU的连接*/ status = NRF_Check(); if(status == SUCCESS) printf("\r\n NRF与MCU连接成功\r\n"); else printf("\r\n 正在检测NRF与MCU是否正常连接。。。\r\n"); while(1) { printf("\r\n 从机端 进入接收模式\r\n"); NRF_RX_Mode(); /*等待接收数据*/ status = NRF_Rx_Dat(rxbuf); /*判断接收状态*/ if(status == RX_DR) { for(i=0; i<4; i++) { printf("\r\n 从机端 接收到 主机端 发送的数据为:%d \r\n",rxbuf[i]); /*把接收的数据+1后发送给主机*/ rxbuf[i]+=1; txbuf[i] = rxbuf[i]; } } printf("\r\n 从机端 进入自应答发送模式\r\n"); NRF_TX_Mode(); /*不断重发,直至发送成功*/ do { status = NRF_Tx_Dat(txbuf); } while(status == MAX_RT); } }
/* * 函数名:NRF_Init * 描述 :SPI的 I/O配置 * 输入 :无 * 输出 :无 * 调用 :外部调用 */ void NRF_Init(void) { //配置NRF管脚复用 spi_init(NRF_SPI,MASTER); //初始化SPI,主机模式 gpio_init(PORTE,28, GPO,LOW); //初始化CE,默认进入待机模式 //gpio_init(PORTE,27, GPI,LOW); //初始化IRQ管脚为输入 gpio_init(PORTA,14, GPO,HIGH); //初始化PCSN管脚为输出,低电平选中 #if IS_USE_ISR exti_init(PORTE,27, falling_up); //初始化IRQ管脚为 :下降沿触发,内部上拉 #else gpio_init(PORTE,27, GPI,LOW); //初始化IRQ管脚为输入 #endif //配置NRF寄存器 NRF_CE_LOW(); NRF_WriteReg(NRF_WRITE_REG+SETUP_AW,ADR_WIDTH - 2); //设置地址长度为 TX_ADR_WIDTH NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL); //设置RF通道为CHANAL NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 //RX模式配置 //NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址 NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); //选择通道0的有效数据宽度 //TX模式配置 //NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址 ,主要为了使能ACK NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x0F); //设置自动重发间隔时间:250us + 86us;最大自动重发次数:15次 #if IS_AUTO_RX_MODE NRF_RX_Mode(); //默认进入接收模式 #endif NRF_CE_HIGH(); while(NRF_Check() == 0); //检测无线模块是否插入:如果卡在这里,说明没检测到无线模块 }
/** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { SPI_NRF_Init(); /* 串口1初始化 */ USART1_Config(); printf("\r\n 这是一个 NRF24L01 无线传输实验 \r\n"); printf("\r\n 这是无线传输 主机端 的反馈信息\r\n"); printf("\r\n 正在检测NRF与MCU是否正常连接。。。\r\n"); /*检测NRF模块与MCU的连接*/ status = NRF_Check(); /*判断连接状态*/ if(status == SUCCESS) printf("\r\n NRF与MCU连接成功!\r\n"); else printf("\r\n NRF与MCU连接失败,请重新检查接线。\r\n"); while(1) { printf("\r\n 主机端 进入自应答发送模式\r\n"); NRF_TX_Mode(); /*开始发送数据*/ status = NRF_Tx_Dat(txbuf); /*判断发送状态*/ switch(status) { case MAX_RT: printf("\r\n 主机端 没接收到应答信号,发送次数超过限定值,发送失败。 \r\n"); break; case ERROR: printf("\r\n 未知原因导致发送失败。 \r\n"); break; case TX_DS: printf("\r\n 主机端 接收到 从机端 的应答信号,发送成功! \r\n"); break; } printf("\r\n 主机端 进入接收模式。 \r\n"); NRF_RX_Mode(); /*等待接收数据*/ status = NRF_Rx_Dat(rxbuf); /*判断接收状态*/ switch(status) { case RX_DR: for(i=0;i<4;i++) { printf("\r\n 主机端 接收到 从机端 发送的数据为:%d \r\n",rxbuf[i]); txbuf[i] =rxbuf[i]; } break; case ERROR: printf("\r\n 主机端 接收出错。 \r\n"); break; } }// while(1) }
void main() { uchar shujv[8]; uchar stop=0; uchar cejv=1; uchar flag=0; uchar helpcejv=0; init_io(); led0=1;led1=1;ledk=1; while(NRF_Check()) { led0=0; delayms(1000); led0=1; delayms(1000); } TX_Mode(); //设置为发送模式 /*************自己加的***********************/ while(CNRF_Check()) //检查nrf是否存在 { led0=0; delayms(1000); led0=1; delayms(1000); } CTX_Mode(); /*************自己加的***********************/ stop=byte_read(0x2000); //读取上一次保留的值 while(1) { wenshi(shujv); //写入前4个数据 // yali(shujv);//写入第5个数据 // shache(shujv);//写入第六个数据 Get_weight(); if (weight_shiwu/1000<=5) shujv[4]='0'; else shujv[4]='1'; if(stop==0) shujv[5]='1'; if(stop==1) shujv[5]='0'; if(out==0) shujv[6]='1'; else shujv[6]='0'; ////////////////////////////// if(NRF24L01_TxPacket(shujv)==TX_OK) { led1=0; delayms(300); led1=1; delayms(10); ///// flag=1; } else flag=0; ////////////////////////////// if(flag==1) { if(CNRF24L01_TxPacket(shujv)==TX_OK) { led3=0; delayms(300); led3=1; delayms(10); cejv=0; helpcejv=0; } else { helpcejv++; delayms(100); if(helpcejv>2) { led2=0; delayms(300); led2=1; delayms(10); cejv=0; helpcejv=0; } } ///////////////////////////////////////////////// if(shache(cejv,stop)==1) { led0=0; delayms(300); led0=1; delayms(10); stop=1; SectorErase(0x2000); byte_write(0x2000,stop); } if(checkbutton(cejv,stop)==0) {stop=1; SectorErase(0x2000); byte_write(0x2000,stop); } } } }