实训题目要求
选择2块国赛Zigbee模块或小蜜蜂的XMF09B国赛兼容板,在国赛提供的工程资源中进行基于BasicRF的程序设计,实现基于BasicRF无线点对点通信的双向灯光控制,具体要求如下:
<1> 节点A 和节点B 的PANID设置为0x1234,通道号设置为17,节点地址自定义。
<2> 按下节点A的SW1按键,松开后,向节点B发送1个字节的无线数据。节点B接收到新的无线数据后,判断该数据如果为0xa5,则切换节点B中D4灯的开关状态。
<3> 按下节点B的SW1按键,松开后,向节点A发送1个字节的无线数据。节点A接收到新的无线数据后,判断该数据如果为0xa5,则切换节点A中D4灯的开关状态。
硬件资源说明:
<1> D4灯,连接到CC2530的P1_1引脚。
<2> SW1按键;连接到CC2530的P1_2引脚。
参考资料:Zigbee模块XMF09B国赛兼容版资料汇总
参考资料:BasicRF点对点无线通信的应用开发核心要点
参考资料:BasicRf点对点与Z-Stack组网国赛官方提供API函数汇总
HEX烧写文件下载:基于BasicRF的双向灯控-节点A
HEX烧写文件下载:基于BasicRF的双向灯控-节点B
配置点对点无线通信的基本参数
#define RF_CHANNEL 17 // 频道 11~26
#define PAN_ID 0x1234 //网络id
//节点A的地址信息
#define MY_ADDR 0x000a //本机模块地址
#define SEND_ADDR 0x000b //发送地址
//节点B的地址信息
//#define MY_ADDR 0x000b //本机模块地址
//#define SEND_ADDR 0x000a //发送地址
变量定义与函数声明
#define D4 P1_1
#define SW1 P1_2
unsigned char cmd = 0xa5; //无线发送的命令字
unsigned char dat = 0; //无线接收的数据
void Init_Port(); //初始化D4灯与SW1按键
void Delay(unsigned char t); //普通延时函数
void Scan_Keys(); //按键扫描处理函数
void Recv_RF_Data(); //无线数据接收处理函数
主函数的实现
void main(void)
{
halBoardInit();//选手不得在此函数内添加代码
ConfigRf_Init();//选手不得在此函数内添加代码
Init_Port(); //初始化D4灯和SW1按键的端口
while(1)
{
/* user code start */
Scan_Keys(); //扫描处理按键
Recv_RF_Data(); //接收处理无线数据
/* user code end */
}
}
端口初始化函数的实现
void Init_Port()
{
//初始化D4灯和D5灯的端口P1_1
P1SEL &= ~0x02; //P1_1为通用I/O端口
P1DIR |= 0x02; //P1_1端为输出口
//初始化SW1按键的端口P1_2
P1SEL &= ~0x04; //P1_2为通用I/O端口
P1DIR &= ~0x04; //P1_2端为输出口
P1INP &= ~0x04; //P1_2设置为上拉/下拉模式
P2INP &= ~0x40; //P1_2设置为上拉
D4 = 0;
}
按键扫描处理函数的实现
void Delay(unsigned char t)
{
while(t--);
}
void Scan_Keys()
{
if(SW1 == 0)
{
Delay(100);
if(SW1 == 0) //确定SW1按键按下
{
while(SW1 == 0); //等待SW1按键松开
basicRfSendPacket(SEND_ADDR, &cmd, 1);
}
}
}
无线数据接收处理函数的实现
void Recv_RF_Data()
{
if(TRUE == basicRfPacketIsReady()) //接收到新的无线数据
{
basicRfReceive(&dat, 1, NULL); //读出1个字节数据到dat变量
if(dat == 0xa5) //判断接收数据是否为0xa5
{
D4 = ~D4; //切换D4灯的开关状态
dat = 0x00;
}
}
}
注:如需完整工程源码,可通过网站下方的“联系我们”中的联系方式,留下邮箱地址,我们会将资料以邮件方式发到该邮箱。