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

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

题目

找到 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位二进制数做相应的亮灭响应。

分析

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

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 <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 ++;
          }
        }
          

  
}

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 <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 ++;
      }  
  

}
posted @ 2022-10-17 10:24  ~内个臣呐~  阅读(479)  评论(0)    收藏  举报