新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī) nRF24L01 無(wú)線(xiàn)模塊 測(cè)試 按鍵燈遠(yuǎn)程控制

51單片機(jī) nRF24L01 無(wú)線(xiàn)模塊 測(cè)試 按鍵燈遠(yuǎn)程控制

作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
入正題,這個(gè)實(shí)驗(yàn)的功能就是一個(gè)發(fā)送模塊(大的那個(gè)板)連接4個(gè)按鍵,通過(guò)按動(dòng)這4個(gè)不同的按鍵來(lái)發(fā)送4種不同的命令,來(lái)控制接收端(小的板)點(diǎn)亮4個(gè)不同的燈。

本文引用地址:http://2s4d.com/article/201611/318439.htm

>_

1 void main()2 {3      uchar Tx_Buf1[]={1};    //發(fā)送的信息1 4      uchar Rx_Buf[32];      //接收到的數(shù)據(jù)暫存器,最多32字節(jié)數(shù)據(jù)  5      init_NRF24L01();6      LED6=1;                //初始燈6熄滅   7 8     while(NRF24L01_Check())                    //檢查不到24l01則報(bào)警 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))     //等待接收數(shù)據(jù),返回1則接收到數(shù)據(jù),在等待接收數(shù)據(jù)期間,可以隨時(shí)變成發(fā)送模式  19         {20             if(KEY1==0)                         //按了按鍵1,則變成發(fā)送模式,發(fā)送對(duì)應(yīng)數(shù)據(jù),發(fā)送完后變成接收模式 21             {    22                 delay_ms(5);//消抖動(dòng) 23                 if(KEY1==0)24                 {25                      while(!KEY1);26                     TX_Mode();                         //發(fā)送模式 27                     Tx_Buf1[0]=1;                    //將1發(fā)送過(guò)去28                     nRF24L01_TxPacket(Tx_Buf1);        //發(fā)送命令數(shù)據(jù)29                     LED6=0;30                     delay_ms(300);31                     LED6=1;32                     delay_ms(300);                    //發(fā)送后LED1閃一下 33                     break;                            //退出最近的循環(huán),從而變回接收模式,這句關(guān)鍵34                  }    35              }36              else if(KEY2==0)                     37              {    38                 delay_ms(5);//消抖動(dòng) 39                 if(KEY2==0)40                 {41                      while(!KEY2);42                     TX_Mode();                         //發(fā)送模式 43                     Tx_Buf1[0]=2;                    //將2發(fā)送過(guò)去44                     nRF24L01_TxPacket(Tx_Buf1);        //發(fā)送命令數(shù)據(jù)45                     LED6=0;46                     delay_ms(300);47                     LED6=1;48                     delay_ms(300);                    49                     break;                            //退出最近的循環(huán),從而變回接收模式,這句關(guān)鍵50                  }    51               }52               else if(KEY3==0)                         53               {    54                 delay_ms(5);//消抖動(dòng) 55                 if(KEY3==0)56                 {57                      while(!KEY3);58                     TX_Mode();                         //發(fā)送模式 59                     Tx_Buf1[0]=3;                    //將3發(fā)送過(guò)去60                     nRF24L01_TxPacket(Tx_Buf1);        //發(fā)送命令數(shù)據(jù)61                     LED6=0;62                     delay_ms(300);63                     LED6=1;64                     delay_ms(300);                    65                     break;                            //退出最近的循環(huán),從而變回接收模式,這句關(guān)鍵66                  }    67               }68               else if(KEY4==0)                         //按了按鍵8,則變成發(fā)送模式,發(fā)送對(duì)應(yīng)數(shù)據(jù),發(fā)送完后變成接收模式 69               {    70                 delay_ms(5);//消抖動(dòng) 71                 if(KEY4==0)72                 {73                      while(!KEY4);74                     TX_Mode();                         //發(fā)送模式 75                     Tx_Buf1[0]=4;                    //將4發(fā)送過(guò)去76                     nRF24L01_TxPacket(Tx_Buf1);        //發(fā)送命令數(shù)據(jù)77                     LED6=0;78                     delay_ms(300);79                     LED6=1;80                     delay_ms(300);                    81                     break;                            //退出最近的循環(huán),從而變回接收模式,這句關(guān)鍵82                  }    83               }84          }85          if(Rx_Buf[0]==1)                               //若接收到對(duì)應(yīng)的數(shù)據(jù)則實(shí)現(xiàn)對(duì)應(yīng)功能 86          {87              Rx_Buf[0]=0;                //清空數(shù)據(jù) 88              LED6=0;89               delay_ms(300);90               LED6=1;91               delay_ms(300);                //接收到數(shù)據(jù) 后閃爍      92          }93     }94 }

第8~14行檢測(cè)nRF24L01是否存在,如果不存在就報(bào)警,這里把beep映射到一個(gè)蜂鳴器的引腳;接下來(lái)進(jìn)入主循環(huán),首先設(shè)置為接收模式,循環(huán)檢測(cè)是否收到數(shù)據(jù),如果收到數(shù)據(jù)就直接跳到85行執(zhí)行LED6的閃爍功能,在循環(huán)檢測(cè)是否收到數(shù)據(jù)期間,還可以檢測(cè)是否有按鍵按下,并轉(zhuǎn)換為發(fā)送模式將對(duì)應(yīng)命令發(fā)送出去;總的來(lái)說(shuō)比較簡(jiǎn)單,這里就不做詳解,此外要有一個(gè)nRF24L01的51驅(qū)動(dòng)文件,網(wǎng)上很多,自己寫(xiě)起來(lái)有點(diǎn)煩~調(diào)試可能會(huì)出現(xiàn)很多錯(cuò)誤!

>_

1 void main()2 {3      uchar Tx_Buf1[]={1};    //發(fā)送的信息1 4      uchar Rx_Buf[32];      //接收到的數(shù)據(jù)暫存器,最多32字節(jié)數(shù)據(jù)  5      init_NRF24L01();6      LED6=1;                //初始燈6熄滅   7 8     while(NRF24L01_Check())                    //檢查不到24l01則報(bào)警 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))     //等待接收數(shù)據(jù),返回1則接收到數(shù)據(jù),在等待接收數(shù)據(jù)期間,可以隨時(shí)變成發(fā)送模式  19         {20             if(KEY8==0)                         //按了按鍵8,則變成發(fā)送模式,發(fā)送對(duì)應(yīng)數(shù)據(jù),發(fā)送完后變成接收模式 21             {    22                 delay_ms(5);//消抖動(dòng) 23                 if(KEY8==0)24                 {25                      while(!KEY8);26                     TX_Mode();     //發(fā)送模式 27                     nRF24L01_TxPacket(Tx_Buf1);        //發(fā)送命令數(shù)據(jù)28                     LED6=0;29                     delay_ms(300);30                     LED6=1;31                     delay_ms(300);                    //發(fā)送后LED6閃一下 32                     break;                            //退出最近的循環(huán),從而變回接收模式,這句關(guān)鍵33                  }    34              }35          }36          //1//if(Rx_Buf[0]==1)                               //若接收到對(duì)應(yīng)的數(shù)據(jù)則實(shí)現(xiàn)對(duì)應(yīng)功能 37          //1//{38          //1//   Rx_Buf[0]=0;                //清空數(shù)據(jù) 39          //1//   LED6=0;40          //1//     delay_ms(300);41          //1//     LED6=1;42          //1//     delay_ms(300);                //接收到數(shù)據(jù) 后閃爍      43          //1//}44         switch(Rx_Buf[0]){//對(duì)數(shù)據(jù)進(jìn)行分析來(lái)控制燈亮45         case 0:46             break;47         case 1:48             Rx_Buf[0]=0;                //清空數(shù)據(jù) 49             LED1=0;50             delay_ms(300);51             LED1=1;52             delay_ms(300);    53             break;54         case 2:55             Rx_Buf[0]=0;                //清空數(shù)據(jù) 56             LED2=0;57             delay_ms(300);58             LED2=1;59             delay_ms(300);    60             break;61         case 3:62             Rx_Buf[0]=0;                //清空數(shù)據(jù) 63             LED3=0;64             delay_ms(300);65             LED3=1;66             delay_ms(300);    67             break;68         default:69             Rx_Buf[0]=0;                //清空數(shù)據(jù) 70             LED4=0;71             delay_ms(300);72             LED4=1;73             delay_ms(300);    74             break;75         }         76     }77 }

這個(gè)就不解釋啦,和發(fā)送的差不多,就是等待接收,接收的時(shí)候還能檢測(cè)按鍵然后將命令發(fā)送過(guò)去,當(dāng)收到數(shù)據(jù)時(shí),就轉(zhuǎn)到下面的switch對(duì)命令進(jìn)行解析,來(lái)實(shí)現(xiàn)不同LED燈的亮滅。



評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉