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

📄 wxldemo.c

📁 基于zigbee的无线通讯程序
💻 C
字号:
/*
  V0.1 Initial Release   10/July/2006
  *2006/08/16 WXL 2.0
*/
#include "config.h"


#include "wx_lrwpan.h"


UINT16 ping_cnt;//接收一个16位数据用
UINT32 my_timer;//用于超时计数
LADDR_UNION dstADDR;//发送的数据数组
INT8U num;

int Beattime;
int RatePerd;
int f=0;
int x;

/*typedef enum _PP_STATE_ENUM {
	PP_STATE_IDLE,
	PP_STATE_SEND,
	PP_STATE_WAIT_FOR_TX
}PP_STATE_ENUM;

PP_STATE_ENUM ppState;*/ //RFD三状态定义
BYTE payload[2];//发送的数据数组


/*#ifdef LRWPAN_RFD

void SendData(void )
{
        //static INT16U count = 0;//计数变量,用以廷时
        //UINT16 temperature;//温度值
	apsFSM();////应用层处理函数

	switch (ppState) {

			case  PP_STATE_IDLE://空闲状态
				//if(++count ==5)//每一千次发送一次数据
                                {
                                        ppState = PP_STATE_SEND;
                                  //      count = 0;
                                }
				break;

			case PP_STATE_SEND://发送数据状态
                                {
                                        payload[1]=payload[0];
                                        payload[0] = ScanKey();//读按键值

                                        //temperature = ReadTc77();//读温度值
                                        //temperature >>= 7;//转换成每度
                                        //payload[1] = temperature;//载入传送数组
                                       if(payload[0]!=payload[1])
                                       {
                                         halPutch(payload[0]);
					ppState = PP_STATE_WAIT_FOR_TX;
					aplSendMSG (APS_DSTMODE_SHORT,//以网络地址发送
						&dstADDR,
						2,
						0,
						1,
						&payload[0],//数据
						2,  //数据长度
						apsGenTSN(),
						FALSE);  //不需要应用层应答
					ppState = PP_STATE_WAIT_FOR_TX;
                                       }
                                }
				break;

			case PP_STATE_WAIT_FOR_TX://等待发送数据完成
				if (apsBusy()) break; //如果没有完成则继续发送
				if (aplGetStatus() == LRWPAN_STATUS_SUCCESS)
                                {
					ppState = PP_STATE_IDLE;//发送成功切换到空闲状态
				}
                                else
                                {
					ppState = PP_STATE_SEND;//发送不成功,重新发送
				}
				break;
	}
}

#endif */




/*void Int0Interrupt(void) interrupt 0	//外中断0中断服务程序
{
	Beattime=RatePerd;
	RatePerd=0;
	f=1;
	
}

void Time0Interrupt(void) interrupt 1	//定时器0中断服务程序
{
	TH0=0x1c;
	TL0=0x18;
	RatePerd++;
	
}

void InitSystem(void)	//系统变量初始化
{
	
	RatePerd=0;
	Beattime=0;
	ET0=1;
	IT0=1;
	EX0=1;
	TMOD=0x01;
	TH0=0x1c;
	TL0=0x18;
	TF0=0;
	TR0=1;
	EA=1;
}

/****************************
T1初始化
****************************/
void InitT1(void)
{
  T1CCTL0 = 0X44;
  //T1CCTL0 (0xE5)
  //T1 ch0 中断使能
  //比较模式

  T1CC0H = 0x1f;
  T1CC0L = 0xbd;
  //0x1fbd = 8125(D)

  T1CTL |= 0X02;
  //start count
  //在这里没有分频。
  //使用比较模式 MODE = 10(B)

   /*P0DIR=0; //0号端口方向
   P0SEL=0X03;//0号端口功能中断使能
//P0DIR=0;
   P0INP=0;//0号端口输入模式
   P2INP&=0Xdf;//
   PICTL=0X09;//端口中断控制*/

  IEN1 |= 0X22;
  IEN0 |= 0X80;
  //开T1中断

  //TCON=0x0D;
}


#pragma vector = T1_VECTOR
 __interrupt void T1_ISR(void)
 {
        IRCON &= ~0x02;//清中断标示
        RatePerd++;
        if(RatePerd == 100)
       {
          RatePerd = 0;
          //timetemp = 1;           //second ++
         // led1 = ~led1;         // for test
          P1_1=~P1_1;
        }
 }

#pragma vector=P0INT_VECTOR
__interrupt void INT0_Server(void)
{
  //Beattime=RatePerd;
	//RatePerd=0;
	//f=1;
       P1_0=~P1_0;
        P0IFG=0;//0号端口响应外中断
        P0IF=0;
}



void InitClock(void)
{
  CLKCON = 0X28;
  //TICKSPD = 101 定时器计数时钟源
  //CLKSPD = 000 和波特率有关
  //两个时钟源选用晶振

  while(!(SLEEP&0X40));
  //等晶振稳定
}

void main (void){


  InitClock();
   InitT1();
   P0DIR=0; //0号端口方向
   P0SEL=0X03;//0号端口功能中断使能
//P0DIR=0;
   P0INP=0;//0号端口输入模式
   P2INP&=0Xdf;//
   PICTL=0X09;//端口中断控制
  // InitUART0();
  // InitIO();


	my_timer = 0;
	halInit();
	evbInit();//CC2430初始化
#ifdef LRWPAN_COORDINATOR
        Bk1KeyInit();//初始化按键
        InitLcd();//初始化液晶
        TurnOnDisp();//开机画面显示
        ClearScreen();//清屏
#else

        InitSensorIO();//初始化I/O口
        SensorPowerOn();//打开传感器电源
#endif

	aplInit();  //初始化协议栈
	conPrintConfig();
	ENABLE_GLOBAL_INTERRUPT();  //使能中断


	EVB_LED1_OFF();
	EVB_LED2_OFF();

#ifdef LRWPAN_COORDINATOR

	aplFormNetwork();//格式化一个新的网络
	while(apsBusy()) {apsFSM();}//等待格式化网络完成
	conPrintROMString("Network formed, waiting for RX\n");
        // x=100/Beattime;
        //printf("x");
        //Print6(7,3,"Network formed!",1);
	EVB_LED1_ON();
#else
	do {
		aplJoinNetwork();//加入网络
		while(apsBusy()) {apsFSM();}  //等待加入网络完成
		if (aplGetStatus() == LRWPAN_STATUS_SUCCESS) {//如果加入网络成功
			EVB_LED1_ON();

			conPrintROMString("Network Join succeeded!\n");
			conPrintROMString("My ShortAddress is: ");
			conPrintUINT16(aplGetMyShortAddress());//串口输出网络地址
			conPCRLF();
			conPrintROMString("Parent LADDR: ")
			conPrintLADDR(aplGetParentLongAddress());//串口输出物理地址
			conPrintROMString(", Parent SADDR: ");
			conPrintUINT16(aplGetParentShortAddress());
			conPCRLF();
			break;
		}else {//加入网络失败
			conPrintROMString("Network Join FAILED! Waiting, then trying again\n");
			my_timer= halGetMACTimer();
			//wait for 2 seconds
			while ((halMACTimerNowDelta(my_timer))< MSECS_TO_MACTICKS(2*1000));
		}
	} while(1);

#endif

#ifdef LRWPAN_COORDINATOR//网络协调器

	aplSetMacMaxFrameRetries(0);

	while (1) {
		apsFSM();//应用层处理函数
	}
#endif

#ifdef LRWPAN_RFD//RFD节点

	dstADDR.saddr = 0; //RFD发送数据的目的地址为网络协调器
	//ppState = PP_STATE_SEND;
        aplSetMacMaxFrameRetries(0);
        while (1) {
		//SendData();//发送按键值和温度值函数


          apsFSM();
         if(++num ==5)//每五次发送一次数据
                                {


                                       // payload[1]=payload[0];
                                       // payload[0] = ScanKey();//读按键值

                                       if(f==1)
                                       {

                                         payload[0]=100/Beattime;

                                         aplSendMSG (APS_DSTMODE_SHORT,//以网络地址发送
						&dstADDR,
						2,
						0,
						1,
						&payload[0],//数据
						2,  //数据长度
						apsGenTSN(),
						FALSE);  //不需要应用层应答
					f=0;
                                       }
                                      // num=0;
                                }







	}

#endif




#ifdef LRWPAN_ROUTER//路由节点
	DEBUG_PRINTNEIGHBORS(DBG_INFO);
	conPrintROMString("Router, doing its thing.!\n");
	while(1) {
		apsFSM();//应用层处理函数
	}
#endif


}

//########## Callbacks ##########

//callback for anytime the Zero Endpoint RX handles a command
//user can use the APS functions to access the arguments
//and take additional action is desired.
//the callback occurs after the ZEP has already taken
//its action.
LRWPAN_STATUS_ENUM  usrZepRxCallback(void){

#ifdef LRWPAN_COORDINATOR
	if (aplGetRxCluster() == ZEP_END_DEVICE_ANNOUNCE) {
		//a new end device has announced itself, print out the
		//the neightbor table and address map
		dbgPrintNeighborTable();
	}
#endif
 return LRWPAN_STATUS_SUCCESS;
}

//callback from APS when packet is received
//user must do something with data as it is freed
//within the stack upon return.
LRWPAN_STATUS_ENUM  usrRxPacketCallback(void) {

	BYTE len, *ptr;
//#ifdef LRWPAN_COORDINATOR
  //      INT8U Temperature, KeyValue;
    //    JOYSTICK_DIRECTION x;
//#endif

	conPrintROMString("User Data Packet Received: \n");
	conPrintROMString("SrcSADDR: ");
	conPrintUINT16(aplGetRxSrcSADDR());//串口输出发送数据的节点地址
	conPrintROMString(", DstEp: ");
	conPrintUINT8(aplGetRxDstEp());
	conPrintROMString(", Cluster: ");
	conPrintUINT8(aplGetRxCluster());
	conPrintROMString(", MsgLen: ");
	len = aplGetRxMsgLen();//串口输出数据长度
	conPrintUINT8(len);
	conPrintROMString(",RSSI: ");
	conPrintUINT8(aplGetRxRSSI());//串口输出RSSI值
	conPCRLF();
	conPrintROMString("PingCnt: ");
	ptr = aplGetRxMsgData();
	ping_cnt = *ptr;
	ptr++;
	ping_cnt += ((UINT8)*ptr)<<8;
	conPrintUINT8(ping_cnt);//串口输出接收到的数据
	conPCRLF();
	
#ifdef LRWPAN_COORDINATOR
	//x = Bk1ScanKey();//扫描按键
	//KeyValue = ping_cnt;//读出按键值
	//Temperature = ping_cnt>>8;//读出温度值

        switch(aplGetRxSrcSADDR())
	{
		case 0x1699://如果是加入网络的第一个节点

			switch((INT8U)*aplGetRxMsgData())
                        {
                        case 0x25:
                             EVB_LED2_ON();
                             break;
                        case 0x22:
                             EVB_LED2_OFF();
                             break;
                        }
			
		/*case 0x169A://如果是加入网络的第二个节点
			if(KeyValue == 0x24)
			{
				Print6(4,3,"2#:Help me!",1);//显示需要帮助
			}
			Print6(5,3,"2#Temperature:",1);
			Printn(5,87,Temperature,0,2);//显示温度值
			if(x == CANCEL)//按CANCEL键清除信息
			{
				Print6(4,3,"            ",1);//清除求助信息
			}
			break;*/
	}
#endif
	return LRWPAN_STATUS_SUCCESS;
}


#ifdef LRWPAN_FFD
//Callback to user level to see if OK for this node
//to join - implement Access Control Lists here based
//upon IEEE address if desired
BOOL usrJoinVerifyCallback(LADDR *ptr, BYTE capinfo){

#if 0      //set this to '1' if you want to test through a router
//only accept routers.
//only let routers join us if we are coord
#ifdef LRWPAN_COORDINATOR
if (LRWPAN_GET_CAPINFO_DEVTYPE(capinfo)) {
	//this is a router, let it join
	conPrintROMString("Accepting router\n");
	return TRUE;
}else {
	conPrintROMString("Rejecting non-router\n");
	return FALSE;
}
#else
return TRUE;
#endif

#else

return TRUE;

#endif

}


BOOL usrJoinNotifyCallback(LADDR *ptr){

	//allow anybody to join

	conPrintROMString("Node joined: ");
	conPrintLADDR(ptr);
        ClearScreen();
#ifdef LRWPAN_COORDINATOR
        Print8(0,29,"--COORD-- ",1);
        Print6(6,3,"Node joined: ",1);
        LcdPrintLADDR(ptr,6,81);
#endif
	conPCRLF();
	DEBUG_PRINTNEIGHBORS(DBG_INFO);
	return TRUE;
}
#endif

//called when the slow timer interrupt occurs
#ifdef LRWPAN_ENABLE_SLOW_TIMER
void usrSlowTimerInt(void ) {}
#endif


//general interrupt callback , when this is called depends on the HAL layer.
void usrIntCallback(void){}

⌨️ 快捷键说明

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