【22物联网国赛样题】zigbee点对点呼吸灯,按键长按双击效果,物联网竞赛今年历年国赛样题真题代码

高职22年物联网职业技能竞赛国赛样题第一套第一题,zigbee编程

 难点:点对点按键呼吸灯维持当前亮度

题目要求

  • 使用两块黑色ZigBee开发板,分别命名为A、B并用标签纸贴上。
  • 实现功能:长按板A的SW1键不松开,板B上D4灯可以实现呼吸灯效果。此时松开板A的SW1键,板B上D4灯维持当前亮度。
  • 实现功能:连续点击板B的SW1键2次,板A上D4、D3、D6、D5可以实现跑马灯效果。

 题目分析

        题目并不难,基础的点对点basicrf工程通用就行,先将A板与B板的按键写出来,再编写相对应的响应程序,确保两块板子能通讯上就行。

代码实现

        将要实现的功能拆分成一个个函数,先写A板上的发送与接收的相应功能,KeyLong()函数是按键长按的效果,led()为流水灯的效果,RFrec()为接收函数,最后在while中调用各个效果就OK。

/*网络配置*/
#define RF_CHANNEL                14         // 频道 11~26
#define PAN_ID                    0xaaaa     //网络id 
#define MY_ADDR                   0xaa12     //本机模块地址
#define SEND_ADDR                 0xaa21     //发送地址


char flag=0;
char count=0;
char rfBuf[32];//接收数据缓冲区


void KyeLong() //按键长按
{
  if(P1_2==0)
  {
    halMcuWaitMs(10);
    while(P1_2==0)
    {
      basicRfSendPacket(SEND_ADDR,"A1Start",sizeof("A1Start")); //长按的时候发送
      halMcuWaitMs(5);
    }
    if(P1_2==1)
    { 
      halMcuWaitMs(20);
      basicRfSendPacket(SEND_ADDR,"A1Stop",sizeof("A1Stop"));//松开的时候发送
    }
  }
}

void led()//流水灯
{
  halMcuWaitMs(2);
  count+=1;
  if(count==100)
    P1=0x02;
  if(count==200)
    P1=0x01;
  if(count==300)
    P1=0x10;
  if(count==400)
  {
    P1=0x08;
    count=0;
  }
}

void RFrec()//数据接收
{
  if(basicRfPacketIsReady())
  {
    basicRfReceive(rfBuf,32,NULL);
    if(strcmp(rfBuf,"B1Go")==0)
    {
      flag=!flag;
    }
  }
  if(flag)
    led();
  else
    P1=0x00;
}

while(1)//主循环
  {
    /* user code start */
    KyeLong();
    rec();    
    /* user code end */
  }

zigbee板B代码

        上面的是A代码,下面的是B板代码,函数效果看注释,最后同样是在while中调用

/*****点对点通讯地址设置******/
#define RF_CHANNEL                14         // 频道 11~26
#define PAN_ID                    0xaaaa     //网络id 
#define MY_ADDR                   0xaa21     //本机模块地址
#define SEND_ADDR                 0xaa12     //发送地址


void T1_pwm_init
{
  T1CTL|=0X01;
  PERCFG|=0X40;
  P1SEL|=0X01;//pwm引脚  
  /*
  通道0:主P0.2 备P1.3
  通道1:主P0.3 备P1.1
  通道2:主P0.4 备P1.0
  通道3:主P0.5 备P1.7
  通道4:主P0.6 备P1.6
  */
  //01100100
  T1CCTL2=0X64;
  T1CC2L=0XFF;
  T1CC2H=h;
}


void KeyDouble()//按键双击发送数据
{
  if(P1_2==0)
  {
    halMcuWaitMs(10);
    while(P1_2==0);
    if(P1_2==1)
    {
      key_count=0;
      key_flag=1;
      mode+=1;
    }
  }
  if(key_flag)
  {
    halMcuWaitMs(1);
    key_count++;
    if(key_count>300)
    {
      key_flag=0;
      if(mode==2)
      {
        basicRfSendPacket(SEND_ADDR,"B1Go",4);
      }
      mode=0;
    }
  }
}


void led() //呼吸灯效果
{
 if((T1STAT&0x04)>0)
 {
   T1STAT=T1STAT&0xfb;
    if(a==1)
      h+=1;
    else
      h-=1;
    T1CC2L=0XFF;
    T1CC2H=h;
    if(h>254)
      a=0;
    if(h==0)
      a=1;
 }  
void led2() //维持当前亮度
{
  T1CC2L=0XFF;
  T1CC2H=h;
}

void rec() //接收函数
{
  if(flag==1)
    led();
  if(flag==2)
    led2();
  
  
  if(basicRfPacketIsReady())
  {
    basicRfReceive(rfBuf,32,NULL);
    if(strcmp(rfBuf,"A1Go")==0)
    {
      flag=1;
    }
    if(strcmp(rfBuf,"A1St")==0)
    {
      flag=2;
    }
  }
}

while(1)
  {
    /* user code start */
    KeyDouble();
    rec();
    /* user code end */
  }

  • 12
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Azhuo9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值