[51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制
哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦。其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过按动这4个不同的按键来发送4种不同的命令,来控制接收端(小的板)点亮4个不同的灯。
>_<!首先是发送模块:
1 void main() 2 { 3 uchar Tx_Buf1[]={1}; //发送的信息1 4 uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据 5 init_NRF24L01(); 6 LED6=1; //初始灯6熄灭 7 8 while(NRF24L01_Check()) //检查不到24l01则报警 9 { 10 beep=0; 11 delay_ms(200); 12 beep=1; 13 delay_ms(200); 14 } 15 while(1) 16 { 17 RX_Mode(); //接收模式 18 while(!nRF24L01_RxPacket(Rx_Buf)) //等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式 19 { 20 if(KEY1==0) //按了按键1,则变成发送模式,发送对应数据,发送完后变成接收模式 21 { 22 delay_ms(5);//消抖动 23 if(KEY1==0) 24 { 25 while(!KEY1); 26 TX_Mode(); //发送模式 27 Tx_Buf1[0]=1; //将1发送过去 28 nRF24L01_TxPacket(Tx_Buf1); //发送命令数据 29 LED6=0; 30 delay_ms(300); 31 LED6=1; 32 delay_ms(300); //发送后LED1闪一下 33 break; //退出最近的循环,从而变回接收模式,这句关键 34 } 35 } 36 else if(KEY2==0) 37 { 38 delay_ms(5);//消抖动 39 if(KEY2==0) 40 { 41 while(!KEY2); 42 TX_Mode(); //发送模式 43 Tx_Buf1[0]=2; //将2发送过去 44 nRF24L01_TxPacket(Tx_Buf1); //发送命令数据 45 LED6=0; 46 delay_ms(300); 47 LED6=1; 48 delay_ms(300); 49 break; //退出最近的循环,从而变回接收模式,这句关键 50 } 51 } 52 else if(KEY3==0) 53 { 54 delay_ms(5);//消抖动 55 if(KEY3==0) 56 { 57 while(!KEY3); 58 TX_Mode(); //发送模式 59 Tx_Buf1[0]=3; //将3发送过去 60 nRF24L01_TxPacket(Tx_Buf1); //发送命令数据 61 LED6=0; 62 delay_ms(300); 63 LED6=1; 64 delay_ms(300); 65 break; //退出最近的循环,从而变回接收模式,这句关键 66 } 67 } 68 else if(KEY4==0) //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式 69 { 70 delay_ms(5);//消抖动 71 if(KEY4==0) 72 { 73 while(!KEY4); 74 TX_Mode(); //发送模式 75 Tx_Buf1[0]=4; //将4发送过去 76 nRF24L01_TxPacket(Tx_Buf1); //发送命令数据 77 LED6=0; 78 delay_ms(300); 79 LED6=1; 80 delay_ms(300); 81 break; //退出最近的循环,从而变回接收模式,这句关键 82 } 83 } 84 } 85 if(Rx_Buf[0]==1) //若接收到对应的数据则实现对应功能 86 { 87 Rx_Buf[0]=0; //清空数据 88 LED6=0; 89 delay_ms(300); 90 LED6=1; 91 delay_ms(300); //接收到数据 后闪烁 92 } 93 } 94 }
第8~14行检测nRF24L01是否存在,如果不存在就报警,这里把beep映射到一个蜂鸣器的引脚;接下来进入主循环,首先设置为接收模式,循环检测是否收到数据,如果收到数据就直接跳到85行执行LED6的闪烁功能,在循环检测是否收到数据期间,还可以检测是否有按键按下,并转换为发送模式将对应命令发送出去;总的来说比较简单,这里就不做详解,此外要有一个nRF24L01的51驱动文件,网上很多,自己写起来有点烦~调试可能会出现很多错误!
>_<!接收端:
1 void main() 2 { 3 uchar Tx_Buf1[]={1}; //发送的信息1 4 uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据 5 init_NRF24L01(); 6 LED6=1; //初始灯6熄灭 7 8 while(NRF24L01_Check()) //检查不到24l01则报警 9 { 10 beep=0; 11 delay_ms(200); 12 beep=1; 13 delay_ms(200); 14 } 15 while(1) 16 { 17 RX_Mode(); //接收模式 18 while(!nRF24L01_RxPacket(Rx_Buf)) //等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式 19 { 20 if(KEY8==0) //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式 21 { 22 delay_ms(5);//消抖动 23 if(KEY8==0) 24 { 25 while(!KEY8); 26 TX_Mode(); //发送模式 27 nRF24L01_TxPacket(Tx_Buf1); //发送命令数据 28 LED6=0; 29 delay_ms(300); 30 LED6=1; 31 delay_ms(300); //发送后LED6闪一下 32 break; //退出最近的循环,从而变回接收模式,这句关键 33 } 34 } 35 } 36 //1//if(Rx_Buf[0]==1) //若接收到对应的数据则实现对应功能 37 //1//{ 38 //1// Rx_Buf[0]=0; //清空数据 39 //1// LED6=0; 40 //1// delay_ms(300); 41 //1// LED6=1; 42 //1// delay_ms(300); //接收到数据 后闪烁 43 //1//} 44 switch(Rx_Buf[0]){//对数据进行分析来控制灯亮 45 case 0: 46 break; 47 case 1: 48 Rx_Buf[0]=0; //清空数据 49 LED1=0; 50 delay_ms(300); 51 LED1=1; 52 delay_ms(300); 53 break; 54 case 2: 55 Rx_Buf[0]=0; //清空数据 56 LED2=0; 57 delay_ms(300); 58 LED2=1; 59 delay_ms(300); 60 break; 61 case 3: 62 Rx_Buf[0]=0; //清空数据 63 LED3=0; 64 delay_ms(300); 65 LED3=1; 66 delay_ms(300); 67 break; 68 default: 69 Rx_Buf[0]=0; //清空数据 70 LED4=0; 71 delay_ms(300); 72 LED4=1; 73 delay_ms(300); 74 break; 75 } 76 } 77 }
这个就不解释啦,和发送的差不多,就是等待接收,接收的时候还能检测按键然后将命令发送过去,当收到数据时,就转到下面的switch对命令进行解析,来实现不同LED灯的亮灭。