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

  • 相关阅读:
    如何设计一个百万级用户的抽奖系统?
    服务注册发现
    消息列队7
    消息列队6
    bzoj 4771: 七彩树
    [SDOI2013]刺客信条
    bzoj 5291: [Bjoi2018]链上二次求和
    51nod 1245 Binomial Coefficients Revenge
    bzoj 5308: [Zjoi2018]胖
    bzoj 5294: [Bjoi2018]二进制
  • 原文地址:https://www.cnblogs.com/ALittleBee/p/8068391.html
Copyright © 2020-2023  润新知