【技能大赛笔记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灯案例分析》一文。