1. 程式人生 > 其它 >CC2530開發試題(一)

CC2530開發試題(一)

試題

注意

分為兩個專案便於管理(當然如果開發經驗頗深,不分的話小試題也不會亂)
基於BasicRF無線點對點框架簡單完成試題

主要部分

第一個專案ZigbeeA

rf_set.c

#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 <stdio.h>
#include <string.h>
#include <stdarg.h>
/*****點對點通訊地址設定******/
#define RF_CHANNEL                20         // 頻道 11~26
#define PAN_ID                    0x1234     //網路id 
#define MY_ADDR                   0x1111     //本機模組地址
#define SEND_ADDR                 0x2222     //傳送地址
/**************************************************/
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();
}
/********************MAIN************************/
void main(void)
{
    halBoardInit();//選手不得在此函式內新增程式碼
    ConfigRf_Init();//選手不得在此函式內新增程式碼
    
    uint8 key_recv, key_send;
    P1SEL &= ~0xFF;
    P1DIR |= 0xFF;
    P1DIR &= ~0x04;
    P1 = 0xFF;
    uint8 horseRaceFG = 0, horseRaceCount = 0;
    uint8 ledArray[4] = {0x02, 0x01, 0x10, 0x08};
    
    while(1)
    {
    /* user code start */
        int count = 0;
        
        if(P1_2 == 0)
        {
            halMcuWaitMs(10);
            if(P1_2 == 0)
            {
                while(P1_2 == 0);
                
                for(int time = 500; time > 0; time--)
                {
                    halMcuWaitMs(1);
                    if(P1_2 == 0)
                    {
                        halMcuWaitMs(10);
                        if(P1_2 == 0)
                        {
                            count = 2;
                            //P1_2 = 1;   //斷開,此處很重要 //因無法直接控制高低電壓,所以,只能加迴圈,
                            while(P1_2 == 0);
                            break;
                        }
                    }
                    
                    if(time == 1) count = 1;
                }
            }
        }
        else count = 0;
        
        if(count == 1)
        {
            key_send = 0xD4;
            basicRfSendPacket(SEND_ADDR, &key_send, 1);
        }
        else if(count == 2)
        {
            key_send = 0xD5;
            basicRfSendPacket(SEND_ADDR, &key_send, 1);
        }
        
        if(basicRfPacketIsReady())
        {
            basicRfReceive(&key_recv, 1, NULL);
            if(key_recv == 0xDD)
            {
                horseRaceFG = horseRaceFG == 1 ? 0 : 1;
            }
        }
        
        
        if(horseRaceFG == 1)
        {
            P1 = ledArray[horseRaceCount];
            halMcuWaitMs(380);
            if(horseRaceCount < 4) ++horseRaceCount;
            else horseRaceCount = 0;
        }
        else P1 = 0;
    /* user code end */
    }
}

第二個專案ZigbeeB

rf_set.c

#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 <stdio.h>
#include <string.h>
#include <stdarg.h>
/*****點對點通訊地址設定******/
#define RF_CHANNEL                20         // 頻道 11~26
#define PAN_ID                    0x1234     //網路id 
#define MY_ADDR                   0x2222     //本機模組地址
#define SEND_ADDR                 0x1111     //傳送地址
/**************************************************/
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();
}
/********************MAIN************************/
void main(void)
{
    halBoardInit();//選手不得在此函式內新增程式碼
    ConfigRf_Init();//選手不得在此函式內新增程式碼
    
    uint8 key_recv, key_send;
    P1SEL &= ~0xFF;
    P1DIR |= 0xFF;
    P1DIR &= ~0x04;
    P1 = 0xFF;
    uint8 D5FG = 0;
    
    while(1)
    {
    /* user code start */
        if(basicRfPacketIsReady())
        {
            basicRfReceive(&key_recv, 1, NULL);
            if(key_recv == 0xD4) P1_1 = ~P1_1;
            else if(key_recv == 0xD5) D5FG = D5FG == 1 ? 0 : 1;
        }
        
        if(P1_2 == 0)
        {
            halMcuWaitMs(10);
            if(P1_2 == 0)
            {
                key_send = 0xDD;
                basicRfSendPacket(SEND_ADDR, &key_send, 1);
                while(P1_2 == 0);
                basicRfSendPacket(SEND_ADDR, &key_send, 1);
            }
        }
        
        
        if(D5FG == 1)
        {
            int32 pwm_cycle = 1000, pwm = 0;
            for(pwm = 0; pwm < pwm_cycle; pwm++)
            {
                P1_3 = 0;
                halMcuWaitUs(pwm);
                P1_3 = 1;
                halMcuWaitUs(pwm_cycle - pwm);
            }
            for(pwm = pwm_cycle - 1; pwm > 0; pwm--)
            {
                P1_3 = 0;
                halMcuWaitUs(pwm);
                P1_3 = 1;
                halMcuWaitUs(pwm_cycle - pwm);
            }
        }
    /* user code end */
    }
}

自此本文告一段落。。。