内容简介
ZIGBBE自组网方式,将两个ZIGBBE盒进行组网
按键按下A将数据发送给B
B判断是否有ZIGBBE信号,如果有就接收信息
如果接收到的数据为开启跑马灯,则开启跑马灯
代码解析
按键按下LED3亮并且A发送数据给B
if(scan_key()) //有按键,则发送数据 { halLedToggle(3); // 绿灯取反,发送指示 LED3 basicRfSendPacket(SEND_ADDR,"ZIGBEE TEST\r\n",13); }
B节点判断是否有新的ZIGBBE信号,如果有就接收数据,并判断是否为需要的数据,如果是,则开启跑马灯
if(basicRfPacketIsReady()) // 判断有无收到zigbee信号 { //halLedToggle(1); len = basicRfReceive(pRxData, MAX_RECV_BUF_LEN, NULL); // 接收数据 if(pRxData[0]=='Z') LSD(); }
跑马灯实现代码
void LSD() { uchar i; uchar stat[4]={0x20,0x01,0x10,0x08}; P1DIR |= 0x39; //LED定义为输出 P1 &= ~0x39; //全部熄灭 while(1) { for(i=0;i<4;i++) { P1=stat[i]; Delay(10000); } } }
延迟函数实现
void Delay(uint n) { uint tt; for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); }
全部代码
#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 <stdio.h> #include <string.h> #include <stdarg.h> #define uint unsigned int #define uchar unsigned char uint8 scan_key(); void LSD(); void Delay(uint); #define MAX_SEND_BUF_LEN 128 #define MAX_RECV_BUF_LEN 128 static uint8 pTxData[MAX_SEND_BUF_LEN]; //定义无线发送缓冲区的大小 static uint8 pRxData[MAX_RECV_BUF_LEN]; //定义无线接收缓冲区的大小 #define MAX_UART_SEND_BUF_LEN 128 #define MAX_UART_RECV_BUF_LEN 128 uint8 uTxData[MAX_UART_SEND_BUF_LEN]; //定义串口发送缓冲区的大小 uint8 uRxData[MAX_UART_RECV_BUF_LEN]; //定义串口接收缓冲区的大小 uint16 uTxlen = 0; uint16 uRxlen = 0; /*****点对点通讯地址设置******/ #define RF_CHANNEL 20 // 频道 11~26 #define PAN_ID 0x1A5B //网络id //#define MY_ADDR 0xAC3A //本机模块地址 //#define SEND_ADDR 0x1015 //发送地址 #define MY_ADDR 0x1015 // 本机模块地址 #define SEND_ADDR 0xAC3A //发送地址 /**************************************************/ static basicRfCfg_t basicRfConfig; // 无线RF初始化 void ConfigRf_Init(void) { basicRfConfig.panId = PAN_ID; //zigbee的ID号设置 basicRfConfig.channel = RF_CHANNEL; //zigbee的频道设置 basicRfConfig.myAddr = MY_ADDR; //设置本机地址 basicRfConfig.ackRequest = TRUE; //应答信号 while(basicRfInit(&basicRfConfig) == FAILED); //检测zigbee的参数是否配置成功 basicRfReceiveOn(); // 打开RF } /********************MAIN************************/ void main(void) { uint16 len = 0; halBoardInit(); //模块相关资源的初始化 ConfigRf_Init(); //无线收发参数的配置初始化 while(1) { if(scan_key()) //有按键,则发送数据 { halLedToggle(3); // 绿灯取反,发送指示 LED3 basicRfSendPacket(SEND_ADDR,"ZIGBEE TEST\r\n",13); } if(basicRfPacketIsReady()) // 判断有无收到zigbee信号 { //halLedToggle(1); len = basicRfReceive(pRxData, MAX_RECV_BUF_LEN, NULL); // 接收数据 if(pRxData[0]=='Z') LSD(); } } } /************/ #define key_io P1_2 uint8 keysta=0; uint16 KeyTime = 0; uint8 scan_key() { //按键新开 if(key_io == 0) { if(KeyTime<100) { KeyTime++; keysta=1; } else { keysta=0; } halMcuWaitMs(10); return 0; } else { KeyTime = 0; if(keysta==0) return 0; else keysta=0; return 1; } } void LSD() { uchar i; uchar stat[4]={0x20,0x01,0x10,0x08}; P1DIR |= 0x39; //LED定义为输出 P1 &= ~0x39; //全部熄灭 while(1) { for(i=0;i<4;i++) { P1=stat[i]; Delay(10000); } } } void Delay(uint n) { uint tt; for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); }