高职组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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Xin-chen/p/16798242.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了