高职组CC2530开发点对点串口调试亮灯

1|0高职组CC2530开发点对点串口调试亮灯

1|1题目

找到 2 块 ZigBee(黑色)模块,分别命名为A、B,实现点对点的无线通讯和控制zigbee模块A和B板上LED灯功能 任务要求: 1. 2块ZigBee模块板上电运行时,D5点亮2秒后熄灭,D4、D3、D6保持熄灭 。 2. 参赛选手根据赛位号,设置该两块ZigBee模块信道为25,PANID为0x3000+【0x工位号】。如组号为4,则PANID为0x3004。 3. 选取ZigBee模块B作为协调器,当模块A在加入该协调器创建的网络后,两个模块的D6灯都点亮2秒熄灭。 4. Zigbee模块B通过DB9公头转接端子线连接串口服务器COM2, 5. 如下表绑定LED灯,1表示亮灯,0表示灭灯。例如“0010 1010”(0x2A)表示模块A的D6灯亮,其他灯灭,模块B的D4和D6灯亮,D3和D5灯灭。 Zigbee模块A | Zigbee模块B(Master) 高4位 低四位 1 2 3 4 | 5 6 7 8 D4 D3 D6 D5 |D4 D3 D6 D5 0 0 1 0 | 1 0 1 0 - 工作站电脑开启网络调试工具,通过TCP模式访问串口服务器COM2口。 - 工作站电脑手工发送0-100之间的随机整数,zigbee模块A和B上D4、D3、D6、D5按随机整数转换的8位二进制数做相应的亮灭响应。

1|2分析

  • 无线接收多个数据放在同一个数组(如果放多个数组造成延时比较高)

1|3A接收

#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 RF_CHANNEL 25 // 频道 11~26 #define PAN_ID 0x3001 //网络id #define MY_ADDR 0xA //本机模块地址 #define SEND_ADDR 0xB //发送地址 /**************************************************/ 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(); } void L_State(unsigned char i,unsigned char S){//设置亮灯函数 if(i == 1){ P1_1 = S; } if(i == 2){ P1_0 = S; } if(i == 3){ P1_4 = S; } if(i == 4){ P1_3 = S; } } void init(){//初始化 P1SEL &=~0x1F; P1DIR |= 0x1B; P1 = 0; P1_3 = 1; halMcuWaitMs(2000); P1_3 = 0; //定时器初始化 T1CC0L = 0x24; T1CC0H = 0xf4; T1CCTL0 |= 0x04; T1CTL |= 0x0e; EA = 1; T1IE = 1; } unsigned char Send1[4],Read1[4]; unsigned char first = 0; unsigned char LED_State[8] = {0,0,0,0,0,0,0,0}; /********************MAIN************************/ void main(void) { halBoardInit();//选手不得在此函数内添加代码 ConfigRf_Init();//选手不得在此函数内添加代码 init(); Send1[0] = 0xFF; while(1) { /* user code start */ //设置亮灯模式 unsigned char i; for(i = 0;i < 4;i++){ if(LED_State[i] == 0x01){ L_State(i+1,1); }else L_State(i+1,0); } /* user code end */ } } //定时器 //在CC2530中写一个无线接收数组写多造成信号接收延时大的结果 #pragma vector = T1_VECTOR __interrupt void T1(){ T1STAT &= ~0x01; basicRfSendPacket(SEND_ADDR,Send1,1); //if(first == 0){ /* if(basicRfPacketIsReady()){ basicRfReceive(Read1,1,NULL); if(Read1[0] == 0xff) P1_4 = 1; halMcuWaitMs(2000); P1_4 = 0;*/ // first ++; //} //} if(basicRfPacketIsReady()){ basicRfReceive(LED_State,8,NULL); //halUartWrite(LED_State,8); //加入如果收到0xff亮灯 if(flag == 0)//只执行一次 if(LED_State[0] == 0xff){ P1_4 = 1; halMcuWaitMs(2000); P1_4 = 0; flag ++; } } }

1|4B发送

#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 RF_CHANNEL 25 // 频道 11~26 #define PAN_ID 0x3001 //网络id #define MY_ADDR 0xB //本机模块地址 #define SEND_ADDR 0xA //发送地址 /**************************************************/ 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(); } void init(){ P1SEL &=~0x1F; P1DIR |= 0x1B; P1 = 0; P1_3 = 1; halMcuWaitMs(2000); P1_3 = 0; T1CC0L = 0x24; T1CC0H = 0xf4; T1CCTL0 |= 0x04; T1CTL |= 0x0e; EA = 1; T1IE = 1; } unsigned char Send1[4],Read1[4]; unsigned char first = 0,date[5]; unsigned char LED_State[8] = {0,0,0,0,0,0,0,0}; unsigned char St_B[8] = {128,64,32,16,8,4,2,1}; //将10进制转为二进制 void BIN_B(unsigned char num){ unsigned char i; for(i = 0;i < 8;i++){ if(num >= St_B[i]){ LED_State[i] = 1; num%=St_B[i]; } else LED_State[i] = 0; } } void L_State(unsigned char i,unsigned char S){ if(i == 1){ P1_1 = S; } if(i == 2){ P1_0 = S; } if(i == 3){ P1_4 = S; } if(i == 4){ P1_3 = S; } } /********************MAIN************************/ void main(void) { halBoardInit();//选手不得在此函数内添加代码 ConfigRf_Init();//选手不得在此函数内添加代码 init(); Send1[0] = 0xFF; while(1) { /* user code start */ halUartRead(date,1);//串口接收数据 //halUartWrite(date,1); BIN_B(date[0]);//转换10进制函数 //亮灯 unsigned char i; for(i = 4;i < 8;i++){ if(LED_State[i] == 0x01){ L_State(4-(8-i)+1,1); }else L_State(4-(8-i)+1,0); } /* user code end */ } } #pragma vector = T1_VECTOR __interrupt void T1(){ T1STAT &= ~0x01; basicRfSendPacket(SEND_ADDR,Send1,1);//发送0xff basicRfSendPacket(SEND_ADDR,LED_State,8);//定时器发送转换后的数组 if(first == 0) //只亮一次 if(basicRfPacketIsReady()){ basicRfReceive(Read1,1,NULL); if(Read1[0] == 0xff) P1_4 = 1; halMcuWaitMs(2000); P1_4 = 0; first ++; } }

__EOF__

本文作者~内个臣呐~
本文链接https://www.cnblogs.com/Xin-chen/p/16798242.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ~内个臣呐~  阅读(359)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示