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

📄 temperature.c

📁 该演示程序实现温度的采集与显示功能
💻 C
字号:

#ifndef ENABLE_DEBUG
//#define ENABLE_DEBUG
#endif

#include <string.h>


#include "msstate_lrwpan.h"
#include "MAC.h"
#include <stdlib.h>
   
#include "SensorComm.h"


#define  APP_TAG_STARTUP       (0)
#define  APP_TAG_INITED        (1)
#define  APP_TAG_JOINREQUESTED (2)
#define  APP_TAG_JOINEDGROUP   (3)
#define  APP_TAG_ADDITIONALlISTEN (4)
#define  APP_CAPTAIN_STARTUP   (5)
#define	 APP_CAPTAIN_INITED    (6)
#define	 APP_CAPTAIN_CALLING   (7)
#define	 APP_CAPTAIN_REPLACECAPTAIN (8)

#define STARTUP_MSG "ZigBee Demo RFD Application v1.0"
#define MAC_RESPONSE_WAITFOR_DURATION  (50)
#define MAC_ACK_WAITFOR_DURATION   (50)
#define QUERY_INT_DURATION  (200)
#define MAC_QUERY_WAIT_DURATION (25)
#define MAC_WAITFOR_QUERY_DURATION (250)


#define PHYSetChannel(x)	macSetChannel(x)
#define PHYGetPhyChannel() macGetChannel()
#define PHYSetTxPower(x) halSetTxPower(x)


#define GRADIENT_C 0.01496
#define OFFSET_C -300                    //偏移量,此参数需要标定
#define ADC14_TO_CELSIUS(ADC_VALUE) \
( (float)ADC_VALUE *(float)GRADIENT_C + OFFSET_C)
#define GRADIENT_F (9.0/5.0 * GRADIENT_C)
#define OFFSET_F (9.0/5.0 * OFFSET_C) + 32
#define ADC14_TO_FARENHEIT(ADC_VALUE) \
( (float)ADC_VALUE *(float)GRADIENT_F + OFFSET_F)
/*Ref: 1,25 V, Resolution: 14bit, Temperature Sensor */
#define SAMPLE_TEMP_SENSOR(v) \
do{ \
ADCCON2 = 0x3E; \
ADCCON1 = 0x73; \
while(!(ADCCON1 & 0x80)); \
v = ADCL; \
v |= (((unsigned int)ADCH) << 8); \
}while(0)


REPDATTOSENSORREC RepDatToSensorRec[MAXREPRECNUM];

BYTE ChannelIdx=0;
BYTE NewChannelIdx,GroupChannelIdx,NormalChannelIdx,NewGroupChannel;
NODE_STUTAS  ThisNode;
TICK  LedChangeTime;
TICK  TAGLastConnectTime;
TICK  TAGAddtionalListenTime;
TICK  TAGOnlineStartTime;
TICK  CAPTAINBroadcastStartTime;
TICK  CAPTAINLastCallingTime;
TICK  SENSORLastBroadcastTime;
TICK  CAPTAINSingleCallingTime;
TICK  SENSORLastReportTime;

BYTE WatchDogReset=0;

TICK  CAPTAINLastSleepTime;
TICK  ChannelStatiTime;
BYTE APPSTATE;

BYTE SensorInfo=0;
BYTE JoinReqCount=0;
BYTE DebugCode=0;
BYTE mainLoop=0;

BYTE UART0rcvBuf[200];
BYTE UART0rcvBuf2[200];
BYTE datalen=0,datalen2=0;
BYTE wlsendbuf[8];

float temperture;

extern void WirelessSendData(BYTE frame);
extern void Delay(WORD i);

//获取温度值函数
float getTemp(void){
unsigned int value;
SAMPLE_TEMP_SENSOR(value);       //采样温度
//return value;
return ADC14_TO_CELSIUS(value);  //返回AD采样值
// return ADC14_TO_FARENHEIT(value);
}


void _changetochannel(BYTE idx)     //切换信道
{
	ISRFOFF;                    //晶振关闭
	PHYSetChannel(idx);         //切换信道物理层函数
	ISRXON;                     //晶振打开
	ChannelIdx=idx;
}


void ChangeToNormalChannel(void)     //切换到公用信道函数
{
    ConsolePutROMString("切换到公用信道:");
    ConsolePutInitData(0,NormalChannelIdx);   //输出调试信息
   _changetochannel(NormalChannelIdx);        //切换信道
}


void ChangeToChannel(BYTE chlidx)    //切换到指定信道函数
{
    ConsolePutROMString("切换到信道(11~26):");
    ConsolePutInitData(0,chlidx);
    _changetochannel(chlidx);
}


void SleepSomeTime(int time)         //休眠函数
{
    ConsolePutROMString("休眠:");
    ConsolePutInitData(0,time);	
    ISRFOFF;                     //晶振关闭
    halSleep(time+100);          //休眠
    ISRXON;                      //晶振打开
    ConsolePutROMString("唤醒\r\n");
}

BYTE DebugParam[20];
BYTE DebugParamLen;
void WirelesDebugOut(BYTE code)      //无线发送调试信息函数
{
    BYTE OldChlIdx;
	
    OldChlIdx=ChannelIdx;
    DebugCode=code;
    ChangeToChannel(DEBUGCHANNEL);	
    WirelessSendData(MSG_DEBUG_OUT);
    DebugParamLen=0;
    ChangeToChannel(OldChlIdx);	
	
}
int TickGetDiff(TICK now,TICK start)  //返回值单位:50ms
{
    return halMACTimerDelta(now,start) *50/LRWPAN_SYMBOLS_PER_SECOND;
}

void Delay(WORD i)
{
    while( i-- );
}

void Delayx(WORD i)
{
    while( i-- )
      while( i-- );
}

void MainLoop(void)                  //主循环函数
{
    BYTE TxPower;
    BYTE  rst;
    unsigned int xyz=0;

    NormalChannelIdx=COMMCHANNEL;	
    ChangeToNormalChannel();        //切换信道到公用信道


    #if defined(IAMTAG)
        TxPower =TAG_TXPOWER;
    #else
        TxPower =SENSOR_TXPOWER;    //设置发射功率,标签与节点的功率设置不同
    #endif
	
	
    PHYSetTxPower(TxPower);//设置发射功率//0~7;0-min   ;  7-max
    ThisNode.NODEID[0] = macInfo.longAddr.v[0];
    ThisNode.NODEID[1] = macInfo.longAddr.v[1];
    ThisNode.MEMBERNUM = 0;

    JoinReqCount=0;

    ThisNode.NODESTATE = GROUP_MEMBER;
    APPSTATE=APP_TAG_STARTUP;

    #if defined(IAMSENSOR)
    for(i=0;i<MAX_GROUPINSENSOR_NUM;i++)
    {
	GroupList[i].USED=0;
    }
    #endif
	
    srand(ThisNode.NODEID[0]*256+ThisNode.NODEID[1]);
    CAPTAINLastSleepTime=TickGet();
    SENSORLastReportTime=0;

    DebugParamLen=0;

    rst=(SLEEP>>0x03)&0x03;
	
    #if defined(IAMTAG)
    WirelesDebugOut(DEBUG_HARDWARE_RESET);
    if(rst==0x02)//看门狗复位
    {     
        ConsolePutROMString("watch dog reset\r\n");
	WirelesDebugOut(DEBUG_WATCHDOG_RESET);
	WatchDogReset=0;
    }
    if(rst==0x00)//看门狗复位
    {     
        ConsolePutROMString("Power-on reset\r\n");

	WatchDogReset=0;
    }	
    if(rst==0x01)//看门狗复位
    {     //ConsolePutROMString("External reset\r\n");
	    	
	WatchDogReset=0;
    }	
	
   #endif

   //WDT_SET_TIMEOUT_PERIOD(M_SEC_250);   //设置看门狗时间值
   //WDT_ENABLE();  //使能看门狗

    Delay(4000); 	
    mainLoop=1;
    macFSM();

    while (1)
    {
        //WDT_RESET();          //看门狗喂狗
        //SleepSomeTime(100);   //休眠
        macFSM();               //mac层通讯处理
        if(submacCurrentFrame.sub_type.Val==0x20)              //若收到数据
        {
          P0_0=~P0_0;                                          //改变红灯状态
          ConsolePutROMString("当前温度:\r\n");               //串口输出当前温度字符
          ConsolePutInitData(0,submacCurrentFrame.data[0]);    //串口输出当前温度值
        }
        if(xyz==0)              //定时时间到
     	{    	
            P0_1=~P0_1;                                       //改变绿灯状态
            temperture=getTemp();                             //获取当前温度值
            WirelessSendData(MSG_TAG_ISANYCAPTAINHERE);       //将温度值无线广播发送出去
        }
       xyz++;
       if(xyz>8000)xyz=0;
        continue;
    }
}					


void ResetsubmacCurrentFrame(void)
{
     submacCurrentFrame.sub_type.Val=0xff;
}

⌨️ 快捷键说明

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