⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 app.c

📁 ATmega128L+CC2420的单片机源程序
💻 C
字号:
#include <string.h>
#include "app.h"
#include "mcu.h"
#include "config.h"
#include "my_ds18b20.h" 
#include <ds18b20.h>


unsigned char app_TxBuffer[APP_MAX_PAYLOAD_SIZE];
unsigned char app_RxBuffer[APP_MAX_PAYLOAD_SIZE];

unsigned char app_FCF;
unsigned char app_RequestOrAck; 



unsigned char wendu[9];
unsigned char app_ReceiveTemperature=0x00; 

unsigned char Temperature[10]={"115.00125"};


/***********************************************************************
* 应用层系统初始化函数
************************************************************************/
void app_SysInit(void)
{
    if( I_Am_What == COORDINATOR )
    {
        nwk_CreatNetwork();
        app_PermitJoinIn();
    }
    if( I_Am_What == ENDPOINT )
    {
        nwk_JoinInNetwork();
        DS18B20_Init();
        ds18b20_temperature(0); 
    }
}



/***********************************************************************
* 清空应用层发送缓冲区
************************************************************************/
void app_TxBuffer_Clear(void)
{
    memset(app_TxBuffer,'',APP_MAX_PAYLOAD_SIZE);
}


/***********************************************************************
* 清空应用层接收缓冲区
************************************************************************/
void app_RxBuffer_Clear(void)
{
    memset(app_RxBuffer,'',APP_MAX_PAYLOAD_SIZE);
}



/***********************************************************************
* 应用层允许接收 (只对协调器有效)
************************************************************************/
void app_PermitJoinIn(void)
{
    nwk_PermitJoinIn();
}

/***********************************************************************
* 应用层退出网络 (只对终端节点有效)
************************************************************************/
void app_LeaveNetwork(void)
{
    nwk_LeaveNetwork();
}


/***********************************************************************
* 请求终端节点发送温度数据 (只对协调器有效)
************************************************************************/
void app_RequestTemperature(void)
{
    unsigned char i;
        
    app_FCF = APP_FCF_CMD;
    app_RequestOrAck = APP_REQUEST;
    
    app_TxBuffer[0] = app_FCF; 
    app_TxBuffer[1] = app_RequestOrAck;
        
    for(i=0;i<MAX_ADDRTABLE;i++)
    {
        if(neighbor[i].Avail)
        {
            RLED2_EN();
              
            rfTxInfo.destAddr = neighbor[i].ShortAddr;// 发送的目的地址 
            nwk_PackData(app_TxBuffer,2);
 
            delay_ms(1000);
            if(app_ReceiveTemperature)   //成功接受节点温度信息
            {
                app_ReceiveTemperature = 0x00; 
                app_Send_Temperature_to_PC(wendu,i);          
            }
            else            //认为终端节点丢失,从邻居表中删除其信息,回收分配给它的 16 bit 地址
            {              
                 nwk_DeleteNeighborTable( neighbor[i].ShortAddr );
                 RLED3_TOGGLE();
            }
            
            RLED2_DISABLE();
            delay_ms(200);
        }
    }
    
    app_TxBuffer_Clear();   
} 


/***********************************************************************
* 请求终端节点发送温度数据的响应 (只对终端节点有效)
************************************************************************/
void app_RequestTemperature_ACK(void)
{
    unsigned char i; 
    float temp;
    
    app_FCF = APP_FCF_CMD;
    app_RequestOrAck = APP_ACK;

    app_TxBuffer[0] = app_FCF; 
    app_TxBuffer[1] = app_RequestOrAck;
  
    temp=ds18b20_temperature(0);   
    ftoa(temp,5,Temperature);     //转换浮点数temp为字符串temp_char,其中第二位参数指定四舍五入保留小数位(最多五位)。
       
    for(i=0;i<10;i++)
    {
        app_TxBuffer[i+2] = Temperature[i];
    }
    
    rfTxInfo.destAddr = rfSettings.pRxInfo->srcAddr;
    
    nwk_PackData(app_TxBuffer,11); 
    
}



void app_DriveNoteOut(void)
{
    unsigned char i;
        
    for(i=0;i<MAX_ADDRTABLE;i++)
    {
        if(neighbor[i].Avail)
        {  
            nwk_DriveNoteOut(neighbor[i].ShortAddr);
        }
    }
}



void app_SendData(void)
{


} 


void app_PackData(void)
{

}


/***********************************************************************
* 应用层解包函数
************************************************************************/ 
void app_UnPackData(unsigned char *pPayload, unsigned char length)
{
    unsigned char temp0,temp1,j;

    
    temp0 = *pPayload++; 

    switch (temp0)
    {
        case APP_FCF_DATA:
        {
            break;
        }            
        case APP_FCF_CMD:  // 网络层命令
        {
            temp1 = *pPayload++;
            switch (temp1)
            {
                case APP_REQUEST:   // 请求命令
                {
                    WLED_EN();
                    //发送温度信息给协调器
                    app_RequestTemperature_ACK();
                    WLED_DISABLE();
                    Sleep();//休眠模式:掉电模式
                    break;
                }
                case APP_ACK:       // 命令响应
                {
                    for(j=0;j<9;j++)
                    {
                        wendu[j] = *pPayload++; 
                    }
                    //接收温度信息成功标志位置1
                    app_ReceiveTemperature = 0x01;
                    break;
                }
                default:
                    break;
            }
        }
        default:
            break;
    }
}



void app_Send_Temperature_to_PC(unsigned char *temp,unsigned char id)
{
    unsigned char str_USART[34];
    unsigned char *str_USART_temp="";
    unsigned char length=0;
    unsigned char i;
    

    //str_USART[0]='C';
    str_USART[0]=0x43;
    for(i=0;i<8;i++)
    {
        sprintf(str_USART_temp, "%x",neighbor[id].IEEEAddr[i]);
        //sprintf(str_USART_temp, "%x",rfSettings.pRxInfo->srcIEEE[i]);
        length = strlen(str_USART_temp);
        if(length==2)
        {
            str_USART[3*i+1] =  *str_USART_temp++;
            str_USART[3*i+2] = *str_USART_temp;
            str_USART[3*i+3] = ' '; 
        }        
        else if(length==1)
        {
            str_USART[3*i+1] = '0';
            str_USART[3*i+2] = *str_USART_temp;
            str_USART[3*i+3] = ' ';  
        } 
        else if(length==0)
        {
            str_USART[3*i+1] = '0';
            str_USART[3*i+2] = '0';
            str_USART[3*i+3] = ' ';  
        }
    }
    //length = strlen(temp);
    length = 9;
    for(i=0;i<length;i++)
    {
        str_USART[i+24] = *temp++;
    }

    USART0_Send_Str(str_USART);   

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -