[51單片機] nRF24L01 無線模塊 串口法命令 通過無線控制另一個的燈


 

 

>_<!概述:

這是在上一個的基礎上通過按鍵發送4種不同命令來控制接收端的LED燈亮的改進版(上一個:http://www.cnblogs.com/zjutlitao/p/3840013.html),這里俺把按鍵發命令給去掉,然后加入一個串口通信的功能,PC通過串口給發送端發送命令,然后發送端通過無線將命令發給接收端來實現控制,這里接收端和上一個例程中的一樣,只是在發送端的代碼里去除了按鍵控制,變成了串口控制。

>_<!發送端電路:

>_<!接收電路圖:

>_<!代碼:

由於這里的接收端的代碼和上一個一樣,所以不做介紹(惜墨如金呀,哈哈~~),下面就發送端進行介紹:

 1 /*------------------------------------------------
 2 定義UART_Init函數
 3 ------------------------------------------------*/
 4 void UART_Init(void)
 5 {
 6     SCON = 0x50;         // 設定串行口工作方式,8位數據位,允許接收
 7     T2CON = 0x34;         //設置定時器2,作為波特率發生器
 8     RCAP2L = 0XDC;      //9600波特率的低8位
 9     RCAP2H = 0XFF;        //9600波特率的高8位    
10     ES = 1;                 //允許串口中斷
11     EA = 1;                 //允許總中斷
12 }

這里是串口初始化函數,采用定時器2作為波特率發生器,允許串口中斷(我采用發送就是循環發送策略,而接受通過觸發中斷來改變標志符,在主函數里再判斷標志符來判斷是否收到數據,預知更多詳情,請繼續瀏覽,哈哈)

1 /*------------------------------------------------
2 定義UART_Send_Byte函數
3 ------------------------------------------------*/
4 void UART_Send_Byte(uchar byte)
5 {
6     SBUF=byte;              //緩沖區裝載要發送的字節數據
7     while(TI==0);        //等待發送完畢,TI標志位會置1
8     TI=0;                //清零發送完成標志位
9 }

這是我定義的一個發送一個字符的串口發送函數,大致意思就是把待發送數據給SBUF,然后等待標志位TI為1,即發送完畢,最后別忘清0!

 1 /*------------------------------------------------
 2 串口接收中斷服務程序
 3 ------------------------------------------------*/
 4 void UART(void) interrupt 4
 5 {
 6     if(RI)                   //檢測接收完成標志位置1
 7     {
 8         RI=0;            //清零接收完成標志位
 9         a=SBUF;            //讀取接收到的數據
10         uart_flag = 1;    //中斷標志位置1
11     }
12 }

上一個函數負責發送,這一個是負責接收的函數,對的,這里采用的是串口接收中斷,當觸發串口中斷時,判斷是否RI為1,即接收完成與否,如果接收完成就把緩沖SBUF中的數據給全局變量a,然后置接收標志uart_flag為1,並RI清0.

 1 /*------------------------------------------------
 2 main函數
 3 ------------------------------------------------*/
 4 void main()
 5 {
 6      LED6=1;                //初始燈6熄滅   
 7      uart_flag=0;            //串口標志初始為0
 8      init_NRF24L01();        //初始化24L01
 9      UART_Init();            //初始化串口
10 
11      while(NRF24L01_Check())                    //檢查不到24l01則報警 
12      {
13         beep=0;
14         delay_ms(200);
15         beep=1;
16         delay_ms(200);
17      }
18      while(1)
19      {    
20         RX_Mode();                            //接收模式  
21         while(!nRF24L01_RxPacket(Rx_Buf))     //等待接收數據,返回1則接收到數據,在等待接收數據期間,可以隨時變成發送模式  
22         {
23             if(uart_flag==1)                //當串口接受標志為1表示有數據過來
24             {
25                 ES=0;                               //關串口中斷
26             
27                 TX_Mode();                         //發送模式 
28                 Tx_Buf1[0]=a-'0';                    //將串口數據給發送緩沖區
29                 nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據24L01
30                 UART_Send_Byte('O');            //向串口發送已經傳送
31                 UART_Send_Byte('K');
32                 UART_Send_Byte(':');
33                 UART_Send_Byte(a);
34                 UART_Send_Byte('\n');
35                 LED6=0;
36                 delay_ms(300);
37                 LED6=1;
38                 delay_ms(300);                    //發送后LED1閃一下 
39 
40                 ES=1;                            //允許串口中斷
41                 uart_flag=0;                      //中斷標志位置0
42                 break;                            //退出最近的循環,從而變回接收模式,這句關鍵
43             }
44          }
45          if(Rx_Buf[0]==1)                               //若接收到對應的數據則實現對應功能 
46          {
47              Rx_Buf[0]=0;                //清空數據 
48              LED6=0;
49               delay_ms(300);
50               LED6=1;
51               delay_ms(300);                //接收到數據 后閃爍      
52          }
53      }
54 }

主函數初始化串口和24L01,然后檢測24L01是否存在,若不存在就響鈴,接着進入主循環,設置24L01為接收模式,循環檢測是否收到數據,如果收到數據直接跳到第45行對信息處理作出相應動作,如果沒有收到數據就一直執行循環體內的代碼,循環體內不斷檢查uart_flag是否為1,即是否收到了數據,當收到了數據就關閉串口中斷,將收到的數據發送出去,並回復PC端,並使LED6閃爍一次。【PC端為1,2,3,4】

>_<!注:

  • l 如果24L01用reg51那么兩個設備都要用reg51,如果用reg52就都得用reg52!
  • l PC通過串口發送給單片機命令[相當於協調器],單片機把命令通過24L01無線發送給另一個單片機,另一個單片機控制燈LED1,LED2,LED3,LED4閃爍。

 

資源下載鏈接:http://pan.baidu.com/s/1bntPMFH

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM