哈哈,窮吊死一個,自己做的一個超簡單的板還沒有電源提供,只得借助我的大開發板啦。其實這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燈的亮滅。