2021物联网国赛zigbee点对点通讯——G卷
一、实现的功能
二、预备知识
1:zigbee的点对点可以使用协议栈或者新大陆的工程文件进行开发,在这里我使用的新大陆的点对点工程文件对题目进行开发
2:新大陆的zigbee开发板(无论是白板还是黑板(协调器))它的继电器的引脚分别是P1_7和P2_0这里拿的是新大陆的开发板举例其他开发板需要自己参考电路图
3:在通讯的时候两个zigbee之间的网络ID和频道一定要一致,选手在比赛时要注意自己设置的网络ID,频道和模块地址一定要不要与其他选手冲突!!!!
三、主节点代码
#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 "sensor_drv/sensor.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
/*****点对点通讯地址设置******/
#define RF_CHANNEL 11 // 频道 11~26
#define PAN_ID 0x0001 //网络id
#define MY_ADDR 0x1234 //本机模块地址
#define SEND_ADDR 0x4321 //发送地址
/**************************************************/
static basicRfCfg_t basicRfConfig;
int count=0;
//unsigned char dat_send[20];
// 无线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();
}
#define SW1 P1_2
#define D4 P1_0
#define D3 P1_1
#define D5 P1_4
#define D6 P1_3
unsigned char switch_LED=0;
void Init_Port() //LED配置
{
P1SEL &=~0x1b;
P1DIR |=0x1b;
P1 &=~0x1b;
}
void delay(unsigned int xms)
{
while(xms--)for(unsigned int i=0;i<533;i++);
}
void Scan_Key()
{
if(SW1==0){
delay(10);
if(SW1==0)
{
switch_LED=1;
basicRfSendPacket(SEND_ADDR,"00",sizeof("00")); //当按键按下主节点发送字符串00给到从节点
while(SW1==0);
}
}
}
/********************MAIN************************/
void main(void)
{
halBoardInit();//选手不得在此函数内添加代码
ConfigRf_Init();//选手不得在此函数内添加代码
Init_Port();
while(1)
{
/* user code start */
Scan_Key();
if(switch_LED==1)
{
delay(500); //当按键按下执行流水灯
P1=0x02;
delay(500);
P1=0x01;
delay(500);
P1=0x10;
delay(500);
P1=0x08;
count++; //每次流完一次count++
if(count>3) //当大于3的时候发送01给到从节点
{
basicRfSendPacket(SEND_ADDR,"01",sizeof("01"));
}
}
/* 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 "sensor_drv/sensor.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
/*****点对点通讯地址设置******/
#define RF_CHANNEL 11 // 频道 11~26
#define PAN_ID 0x0001 //网络id
#define MY_ADDR 0x4321 //本机模块地址
#define SEND_ADDR 0x1234 //发送地址
/**************************************************/
static basicRfCfg_t basicRfConfig;
unsigned char dat_recv[10]; //接收数组
// 无线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();
}
#define SW1 P1_2
#define D4 P1_0
#define D3 P1_1
#define D5 P1_4
#define D6 P1_3
#define JD1 P1_7
#define JD2 P2_0
void delay(unsigned int xms)
{
while(xms--)for(unsigned int i=0;i<533;i++);
}
void Init_Port() //LED配置
{
P1SEL &=~0x9f;
P1DIR |=0x9b;
P1 &=~0x9b;
P2DIR |=0x01;
P2SEL &=~0x01;
}
/********************MAIN************************/
void main(void)
{
halBoardInit();//选手不得在此函数内添加代码
ConfigRf_Init();//选手不得在此函数内添加代码
Init_Port();
while(1)
{
/* user code start */
if(basicRfPacketIsReady()) //判断是否接收到内容 返回值为true或者false
{
basicRfReceive(dat_recv,10,NULL); //将接收到的数据存入dat_recv当中
if(strcmp(dat_recv,"00")==0) //对其进行判断使用strcmp函数 如果为00就打开继电器 也就是让对应引脚为高电平
{
JD1=1;
JD2=1;
}else if(strcmp(dat_recv,"01")==0) //如果为01关闭继电器 也就是让对应的引脚为0
{
halMcuWaitMs(3000); //延时大约3秒 毫秒级延时函数
JD1=0;
JD2=0;
}
}
/* user code end */
}
}
附:新大陆zigbee点对点工程链接!!
链接:https://pan.baidu.com/s/1A3NtZYWm_Z-Va7kJghRn-g
提取码:1ent
版权声明:本文为qq_58300592原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。