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

📄 app.i

📁 ATmega128L+CC2420的单片机源程序
💻 I
📖 第 1 页 / 共 2 页
字号:
       } __ds18b20_scratch_pad;

unsigned char ds18b20_select(unsigned char *addr);
unsigned char ds18b20_read_spd(unsigned char *addr);
float ds18b20_temperature(unsigned char *addr);
unsigned char ds18b20_init(unsigned char *addr,signed char temp_low,signed char temp_high,
unsigned char resolution);
#pragma used-

#pragma library ds18b20.lib




unsigned char app_TxBuffer[20];
unsigned char app_RxBuffer[20];

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( 0x03 == 0x01 )
    {
        nwk_CreatNetwork();
        app_PermitJoinIn();
    }
    if( 0x03 == 0x03 )
    {
        nwk_JoinInNetwork();
        DS18B20_Init();
        ds18b20_temperature(0); 
    }
}



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


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



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

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


/***********************************************************************
* 请求终端节点发送温度数据 (只对协调器有效)
************************************************************************/
void app_RequestTemperature(void)
{
    unsigned char i;
        
    app_FCF = 0x01;
    app_RequestOrAck = 0x01;
    
    app_TxBuffer[0] = app_FCF; 
    app_TxBuffer[1] = app_RequestOrAck;
        
    for(i=0;i<20      ;i++)
    {
        if(neighbor[i].Avail)
        {
            PORTE |= (1<<2 );
              
            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 );
                 PORTE ^= (1<<3 );
            }
            
            PORTE &= ~(1<<2 );
            delay_ms(200);
        }
    }
    
    app_TxBuffer_Clear();   
} 


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

    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<20      ;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 0x02:
        {
            break;
        }            
        case 0x01:  // 网络层命令
        {
            temp1 = *pPayload++;
            switch (temp1)
            {
                case 0x01:   // 请求命令
                {
                    PORTD |= (1<<7 );
                    //发送温度信息给协调器
                    app_RequestTemperature_ACK();
                    PORTD &= ~(1<<7 );
                    Sleep();//休眠模式:掉电模式
                    break;
                }
                case 0x02:       // 命令响应
                {
                    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 + -