2.4G无线模块(NRF24L01)学习(2)——单片机互相控制LED灯

2019-04-15 15:14发布

先展示我的硬件部分图片: 要求完成的功能: 1.两个模块和两个单片机相连,分别称为单片机A,单片机B 2.功能:单片机A上的两个按键控制单片机B上的P2口等四个灯的亮灭;单片机B上的两个按键控制单片机A上的P2口等四个灯的亮灭 代码如何实现呢,只要你对我之前的文章《2.4G无线模块(NRF24L01)学习(1)——串口实现两个模块之间信息交互》学习完之后再来实现这个功能那就太简单了,简直就不值得下手的感觉,但我认为虽然简单,但为了学好这个NRF24L01模块还是值得的,只有这样才能逐步达到灵活使用模块。 代码如下: 【提示】这里的2401.h代码依然没有改动,因此这里就不涉及2401.h代码,直接使用。下面主要看两个主函数文件的代码如何实现的? 单片机A代码: #include"2401.h" #define uint unsigned int #define uchar unsigned char sbit KEY1=P3^5; //发送按键 sbit KEY2=P3^4; //发送按键 sbit beep=P1^7; //喇叭 sbit LED6=P1^6; //发送数据时显示灯+接收到数据后的功能实现灯 /*------------------------------------------------ 延时函数 ------------------------------------------------*/ void delay_ms(uint z) //延时函数 { uint y; while(z--) for(y=110;y>0;y--); } /*------------------------------------------------ main函数 ------------------------------------------------*/ void main() { uchar Tx_Buf1[]={1}; //发送的信息1 uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据 LED6=1; //初始灯6熄灭 init_NRF24L01(); //初始化24L01 while(NRF24L01_Check()) //检查不到24l01则报警 { beep=0; delay_ms(200); beep=1; delay_ms(200); } while(1) { RX_Mode(); //接收模式 while(!nRF24L01_RxPacket(Rx_Buf)) //等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式 { if(KEY1==0) //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式 { delay_ms(5);//消抖动 if(KEY1==0) { while(!KEY1); Tx_Buf1[0]=1; TX_Mode(); //发送模式 nRF24L01_TxPacket(Tx_Buf1); //发送命令数据 LED6=0; delay_ms(300); LED6=1; delay_ms(300); //发送后LED6闪一下 break; //退出最近的循环,从而变回接收模式,这句关键 } } if(KEY2==0) //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式 { delay_ms(5);//消抖动 if(KEY2==0) { while(!KEY2); Tx_Buf1[0]=2; TX_Mode(); //发送模式 nRF24L01_TxPacket(Tx_Buf1); //发送命令数据 LED6=0; delay_ms(300); LED6=1; delay_ms(300); //发送后LED6闪一下 break; //退出最近的循环,从而变回接收模式,这句关键 } } } switch(Rx_Buf[0]){//对数据进行分析来控制灯亮 case 1: Rx_Buf[0]=0; //清空数据 P2=0X0F; LED6=0; delay_ms(300); LED6=1; delay_ms(300); break; case 2: Rx_Buf[0]=0; //清空数据 P2=0XF0; LED6=0; delay_ms(300); LED6=1; delay_ms(300); break; default: break; } } }   单片机B的代码: #include"2401.h" #define uint unsigned int #define uchar unsigned char sbit KEY1=P3^5; //发送按键 sbit KEY2=P3^4; //发送按键 sbit beep=P1^7; //喇叭 sbit LED6=P1^6; //发送数据时显示灯 void delay_ms(uint z) //延时函数 { uint y; while(z--) for(y=110;y>0;y--); } void main() { uchar Tx_Buf1[]={1}; //发送的信息1 uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据 init_NRF24L01(); LED6=1; //初始灯6熄灭 while(NRF24L01_Check()) //检查不到24l01则报警 { beep=0; delay_ms(200); beep=1; delay_ms(200); } while(1) { RX_Mode(); //接收模式 while(!nRF24L01_RxPacket(Rx_Buf)) //等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式 { if(KEY1==0) //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式 { delay_ms(5);//消抖动 if(KEY1==0) { while(!KEY1); Tx_Buf1[0]=1; TX_Mode(); //发送模式 nRF24L01_TxPacket(Tx_Buf1); //发送命令数据 LED6=0; delay_ms(300); LED6=1; delay_ms(300); //发送后LED6闪一下 break; //退出最近的循环,从而变回接收模式,这句关键 } } if(KEY2==0) //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式 { delay_ms(5);//消抖动 if(KEY2==0) { while(!KEY2); Tx_Buf1[0]=2; TX_Mode(); //发送模式 nRF24L01_TxPacket(Tx_Buf1); //发送命令数据 LED6=0; delay_ms(300); LED6=1; delay_ms(300); //发送后LED6闪一下 break; //退出最近的循环,从而变回接收模式,这句关键 } } } switch(Rx_Buf[0]){//对数据进行分析来控制灯亮 case 1: Rx_Buf[0]=0; //清空数据 P2=0X0F; LED6=0; delay_ms(300); LED6=1; delay_ms(300); break; case 2: Rx_Buf[0]=0; //清空数据 P2=0XF0; LED6=0; delay_ms(300); LED6=1; delay_ms(300); break; default: break; } } } 你会发现这两个代码基本一致,因为这两个代码中都有发送和接受的过程,而且实现是一样的效果。 效果展示: