高职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 */
}