【技能大賽筆記01】Zigbee點對點按鍵控制程序開發


【技能大賽筆記01】Zigbee點對點按鍵控制程序開發

--2017年“物聯網物聯網技術應用與維護”任務五題1(中職組)

廣東職業技術學院  歐浩源 2017-12-20

1、題目要求

 

2、工程文件

    在比賽中,提供了一個基於BasicRF的工程項目和一份函數說明文檔,參賽選手需要在這個工程項目中編寫合適的代碼以實現題目的功能。在工程項目中有“rf_set.c”和"slave_node.c"這兩個代碼文件,分別是主節點從節點的應用代碼,參賽選手需要在這兩個文件中編寫合適的代碼。
<1> 主節點“rf_set.c”的代碼如下:

<2> 從節點"slave_node.c"的代碼如下:

3、關鍵知識點

<1> 對題目的理解非常關鍵。

    剛看到題目的時候我也懵B了。四個LED怎么表示8個數據位呢?
    主節點和從節點分別有4個LED,一共8個LED分別表示8個數據位。
    1:用LED亮表示,
    0:用LED滅表示。
    數據依次從高到低排列:
    主節點D4 D3 D6 D5從節點D4 D3 D6 D5
    例如:1110 0100用二進制表示,就是:
    主節點的D4:
    主節點的D3:
    主節點的D6:
    主節點的D5:滅
    從節點的D4:滅
    從節點的D3:
    從節點的D6:滅
    從節點的D5:滅
    理解這個很重要,不然題目是做不出來的。

<2> 補碼與原碼的換算關系

    對於正數,原碼 = 補碼。
    對於負數,原碼 = 補碼(除了符號位)的各個位取反,加1。
    補碼1001 1100的原碼為:1110 0100
    補碼1010 0110的原碼為:1101 1010
    補碼1011 0000的原碼為:1101 0000

<3> 點對點通信的數據發送和數據接收的兩個函數的應用。
    //將數據mode的一個字節發送到目標地址為0x0002的板子上。
    basicRfSendPacket(0x0002, mode, 1);
    //將板子接收到的數據讀取1個字節放到Rx數組中。
    basicRfReceive(Rx,1,NULL);

4、代碼實現

<1> 主節點“rf_set.c”的代碼編寫如下:

//↓↓↓↓↓↓↓請在選手此區域內補充代碼↓↓↓↓↓↓↓

void RFInit()
{
  rf.myAddr=0x0001;        //本機地址
  rf.panId=0x1000;          //網絡ID
  rf.channel=10;           //通信信道
  rf.ackRequest=1;         //應答信號
  while(basicRfInit(&rf)==1);
  basicRfReceiveOn();
}

void main()
{
  Init();
  RFInit();
  while(1)
  {
    if(key1==0)
    {
      DelayMS(10);
      if(key1==0)
      {
        while(key1==0);
        P1=0x00;
        mode[0]++;
        switch(mode[0])
        {
          
          case 0x30:   break;
            P1=0x00;
          //補碼1001 1100的原碼為:1110 0100
          case 0x31:   
            LED4 = 1;
            LED3 = 1;
            LED6 = 1;
            LED5 = 0;
            break;
          
          //補碼1010 0110的原碼為:1101 1010
          case 0x32:   
            LED4 = 1;
            LED3 = 1;
            LED6 = 0;
            LED5 = 1;
            break;
          
          //補碼1011 0000的原碼為:1101 0000
          case 0x33:   
            LED4 = 1;
            LED3 = 1;
            LED6 = 0;
            LED5 = 1;
            break;
        }
        basicRfSendPacket(0x0002, mode, 1);
        if(mode[0]>=0x34)
        {
          mode[0]=0x30;
        }
      }
    }
  }
}
//↑↑↑↑↑↑↑請在選手此區域內補充代碼↑↑↑↑↑↑↑

 

<2> 從節點"slave_node.c"的代碼編寫如下:

//↓↓↓↓↓↓↓請在選手此區域內補充代碼↓↓↓↓↓↓↓

void RFInit()                                                          
{                                                                        
  rf.myAddr=0x0002;        //本機地址                                    
  rf.panId=0x1000;          //網絡ID                                    
  rf.channel=10;           //通信信道                                    
  rf.ackRequest=1;         //應答信號                                  
  while(basicRfInit(&rf)==1);                                           
  basicRfReceiveOn();                                                    
}

void main()
{
  Init();
  RFInit();
  while(1)
  {
    if(basicRfPacketIsReady())
    {
      uint8 Rx[5]=0x00;
      //basicRfReceive(Rx,5,NULL);
      basicRfReceive(Rx,1,NULL);
      P1=0x00;
      switch(Rx[0])
      {
      case 0x30:   
        P1=0x00;
        break;
      //補碼1001 1100的原碼為:1110 0100
      case 0x31:   
        LED4 = 0;
        LED3 = 1;
        LED6 = 0;
        LED5 = 0;
        break;
      //補碼1010 0110的原碼為:1101 1010
      case 0x32:   
        LED4 = 1;
        LED3 = 0;
        LED6 = 1;
        LED5 = 0;
        break;
        //補碼1011 0000的原碼為:1101 0000
      case 0x33:   
        LED4 = 0;
        LED3 = 0;
        LED6 = 0;
        LED5 = 0;
        break;
      }
    }
  }
}
//↑↑↑↑↑↑↑請在選手此區域內補充代碼↑↑↑↑↑↑↑

    在編譯和燒寫代碼的時候要注意,主節點的要把"slave_node.c"代碼文件移除出工程,在把“rf_set.c”添加進來,然后編譯、燒寫。從節點也需要做相應的移除和添加代碼文件。當代碼分別燒寫到兩個Zigbee模塊上,上電就可以實現題目的功能了。

<注1>:完整工程代碼下載(百度雲盤):https://pan.baidu.com/s/1bpxxNqf
<注2>:關於BasicRF更詳細的資料,可以參考網絡中《基於BasicRF的點對點無線雙向控制LED燈案例分析》一文。


免責聲明!

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



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