2022山东高职Zigbee点对点开发

发布时间 2023-04-13 22:41:00作者: ~内个臣呐~

2022山东高职Zigbee点对点开发

题目

3、ZigBee 设备功能开发
使用两个蓝色 ZigBee 节点盒进行组网通讯,并分别命名为节点端和控制端。
节点端上安装双联继电器模块并外接风扇、照明灯。根据任务要求完成功能开发。
任务要求:

在控制端点击 SW1 键后,板上的 LED1 灯实现间隔 0.5 秒亮灭状态,同时
节点端的风扇转动。再次点击 SW1 键后,板上的 LED1 灯熄灭、风扇停止。
可以反复实现此功能。

在节点端点击 SW1 键后,板上 LED1 灯实现呼吸灯效果,同时照明灯亮起。
再次点击 SW1 键后,板上的 LED1 灯和照明灯都熄灭。可以反复实现此功
能。

控制端

#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "hal_uart.h" 
#include <stdio.h>
#include <string.h>
#include <stdarg.h>



/*****点对点通讯地址设置******/


#define RF_CHANNEL                11         // 频道 11~26
#define PAN_ID                    2201     //网络id 
#define MY_ADDR                   0x0A     //本机模块地址
#define SEND_ADDR                 0x0B     //发送地址

/**************************************************/
static basicRfCfg_t basicRfConfig;
// 无线RF初始化
void ConfigRf_Init(void)
{
  
    basicRfConfig.panId       =   PAN_ID;
    basicRfConfig.channel     =   RF_CHANNEL;
    basicRfConfig.myAddr      =   MY_ADDR;
    basicRfConfig.ackRequest  =   TRUE;
    while(basicRfInit(&basicRfConfig) == FAILED);
    basicRfReceiveOn();
 
}

void init(){
  P1SEL &= ~ 0x1F;
  P1DIR |= 0x1B;
  P1 = 0;
}
unsigned char flag = 0;
void KeyScanner(){

  if(P1_2 == 0){
    while(P1_2 == 0);
    flag = flag ==0?1:0;
              P1_0 = 0;
  }
  
}


/********************MAIN************************/
void main(void)
{
    halBoardInit();//选手不得在此函数内添加代码
    ConfigRf_Init();//选手不得在此函数内添加代码
   init();
   unsigned int t = 0;
    while(1)
    {
    /* user code start */
      KeyScanner();
      if(flag == 1){
        t ++;
        halMcuWaitMs(1);
        if(t == 500){
          P1_0 = 1;
        }
        if(t == 1000){t = 0;
          P1_0 = 0;

        }
      }
     basicRfSendPacket(SEND_ADDR,&flag,1);
       
    /* user code end */
    }
}

节点端

#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "hal_uart.h" 
#include <stdio.h>
#include <string.h>
#include <stdarg.h>



/*****点对点通讯地址设置******/


#define RF_CHANNEL                11         // 频道 11~26
#define PAN_ID                    2201     //网络id 
#define MY_ADDR                   0x0B     //本机模块地址
#define SEND_ADDR                 0x0A     //发送地址

/**************************************************/
static basicRfCfg_t basicRfConfig;
// 无线RF初始化
void ConfigRf_Init(void)
{
  
    basicRfConfig.panId       =   PAN_ID;
    basicRfConfig.channel     =   RF_CHANNEL;
    basicRfConfig.myAddr      =   MY_ADDR;
    basicRfConfig.ackRequest  =   TRUE;
    while(basicRfInit(&basicRfConfig) == FAILED);
    basicRfReceiveOn();
 
}
void Read();
unsigned char read = 0;
void init(){
  P1SEL &= ~ 0x1F;
  P1DIR |= 0x1B;
  P1 = 0;
  P1SEL &= ~0x80;
  P1DIR |= 0x80;
  P2SEL &= ~ 0x01;
  P2DIR |= 0x01;
  P2 = 0;
}
unsigned flag = 0;
void KeyScanner(){

  if(P1_2 == 0){
    while(P1_2 == 0);
    flag = flag == 0?1:0;
  }
}
void Led1_HX(){
P1_7 = 1;
  unsigned int time = 300,i,j;
  
  for(i = 0;i < time;i++){
    for(j = 0;j < i;j++){
      P1_0 = 1;
      KeyScanner();Read();
      if(flag != 1)break;
    }
    for(j = 0;j <time - i;j++){
      P1_0 = 0;
      KeyScanner();Read();
      if(flag != 1)break;
    }
  }
  for(i = 0;i < time;i++){
    for(j = 0;j < i;j++){
      P1_0 = 0;
      KeyScanner();Read();
      if(flag != 1)break;
    }
    for(j = 0;j <time - i;j++){
      P1_0 = 1;
      KeyScanner();Read();
      if(flag != 1)break;
    }
  }  
  
}

void Read(){
        basicRfReceive(&read,1,NULL);
      if(read){
        P2_0 = 1;
      }else P2_0 = 0;
}
/********************MAIN************************/
void main(void)
{
    halBoardInit();//选手不得在此函数内添加代码
    ConfigRf_Init();//选手不得在此函数内添加代码
   init();
    while(1)
    {
    /* user code start */
      Read();
      KeyScanner();
      if(flag)
      Led1_HX();
       else P1_7 =P1_0= 0;
    /* user code end */
    }
}