完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、任务要求:
大棚种植区改造过程中提出新的需求,要求部分设备需要支持短距离无线 通讯控制风扇功能,该功能需要选手通过编程自行设计并实现。 任务要求: 使用两块黑色 ZigBee 开发板,分别命名为 A、B 并用标签纸贴上。 为板 B 上装一个继电器并连接一个灯泡。 点击板 A 的 SW1 按键可以控制板 B 连接的灯的启动或关闭。 二、任务逻辑分析: 三、逻辑代码实现: ZigBee A板的主要代码: #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 #include #include #include "hal_button.h" /*****点对点通讯地址设置******/ #define RF_CHANNEL 16 // 频道 11~26 #define PAN_ID 0x1616 //网络id #define MY_ADDR 0x2020 //本机模块地址 #define SEND_ADDR 0x3030 //发送地址 /**************************************************/ #define APP_PAYLOAD_LENGTH 1 #define LIGHT_TOGGLE_CMD 0 static uint8 pTxData[APP_PAYLOAD_LENGTH]; //发射缓存区 static uint8 pRxData[APP_PAYLOAD_LENGTH]; //接收缓存区,发送时不需要使用 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(); } static void appSwitch() { if(halButtonPushed() == HAL_BUTTON_1) { //函数功能:给目的短地址发送指定长度的数据,发送成功刚返回SUCCESS,失败则返回FAILED //LIGHT_ADDR目的短地址;pTxData 指向发送缓冲区的指针; APP_PAYLOAD_LENGTH发送数据长度 basicRfSendPacket(SEND_ADDR, pTxData, APP_PAYLOAD_LENGTH); } } /********************MAIN************************/ void main(void) { halBoardInit();//选手不得在此函数内添加代码 ConfigRf_Init();//选手不得在此函数内添加代码 memset(pTxData,0,APP_PAYLOAD_LENGTH); //清除空缓存区的数据 pTxData[0] = LIGHT_TOGGLE_CMD; //默认状态为关闭 // 由于模块只需要发射,所以把接收屏蔽掉以降低功耗。 basicRfReceiveOff(); while(1) { /* user code start */ appSwitch(); //发射模块 按键S1对应P1_2 /* user code end */ } } ZigBee B 板的主要代码: #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 #include #include #include "hal_relay.h" /*****点对点通讯地址设置******/ #define RF_CHANNEL 16 // 频道 11~26 #define PAN_ID 0x1616 //网络id #define MY_ADDR 0x3030 //本机模块地址 //#define SEND_ADDR 0x3030 //发送地址 #define APP_PAYLOAD_LENGTH 1 //缓存区长度 #define LIGHT_TOGGLE_CMD 0 //控制灯的命令 /**************************************************/ static uint8 pTxData[APP_PAYLOAD_LENGTH]; //发送缓存区,接收时不需要使用 static uint8 pRxData[APP_PAYLOAD_LENGTH]; 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(); } static void appLight() { while(!basicRfPacketIsReady()); //检查模块是否已经可以接收下一个数据,如果准备好刚返回 TRUE //把收到的数据复制到pRxData中 if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) { if(pRxData[0] == LIGHT_TOGGLE_CMD) {//判断接收到的数据是否就是LIGHT_TOGGLE_CMD halRelayToggle(); //改装成P1.7控制继电器开关灯泡 } } } /********************MAIN************************/ void main(void) { halBoardInit();//选手不得在此函数内添加代码 ConfigRf_Init();//选手不得在此函数内添加代码 while(1) { /* user code start */ appLight(); //接收模块 灯泡对应P1_7 /* user code end */ } } 四、开发中注意的事项: 1、ZigBee A板和B板的频道和网络ID必须一致; 2、注意区分 A板和B板的地址; 3、使用某个GPIO引脚,一定得初始化该引脚; |
|
|
|
只有小组成员才能发言,加入小组>>
3213 浏览 9 评论
2896 浏览 16 评论
3405 浏览 1 评论
8848 浏览 16 评论
3998 浏览 18 评论
9630浏览 3评论
1010浏览 3评论
523浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
524浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2251浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-4 15:22 , Processed in 1.721181 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号