【技能大賽筆記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燈案例分析》一文。