ZigBee 点对点无线通信

本文介绍了一种利用无线通信技术实现点对多点数据传输,并通过液晶显示器显示接收数据的方法。详细阐述了无线模块初始化、串口通信设置及接收数据处理流程,以及如何在不同频率下区分数据来源并进行显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先从主函数开始

void main(void)

{

   SET_MAIN_CLOCK_SOURCE(CRYSTAL);  //选择32M晶振 

   //RFPWR.RREG_RADIO_PD位清零,

   //打开模拟稳压器对无线电供电

   //同时电源延迟250us

   RFPWR = 0x04;         

   while(RFPWR & 0x10);//等待稳压器的稳定

   initUART();        //初始化串口

   IO_DIR_PORT_PIN(0,5,IO_OUT);//以下三条

   IO_DIR_PORT_PIN(1,3,IO_OUT);//设置IO口

   IO_DIR_PORT_PIN(1,2,IO_IN);

   P0_5 = 1;

   P1_3 = 0;

   rf_test_main();      //进入无线程序

}

串口初始化

void initUART(void)

{

   // Setup for UART0

   IO_PER_LOC_UART0_AT_PORT0_PIN2345();  //设置UART0的I/O口位置,选择位置1

   SET_MAIN_CLOCK_SOURCE(CRYSTAL);      //设置时钟晶振资源

   //设置UART参数,使用UART0,19200bps,U0UCR设为0x02,快速传输,奇偶校验位禁止

   UART_SETUP(0, 19200, HIGH_STOP);         

   U0CSR = 0xc0;    //选择UART模式,允许接收

   U0UCR = 0x02;    //低起始位,高结束位

   UTX0IF = 1; //UART0等待中断

   IEN0|=0x04;//开中断

}

初始化RF

void initRfTest(void)

radioInit(frequency, myAddr); //频率,地址

发送函数

void contionuousMode(void)   //和没用串口的时候基本相同

接收函数

void receiveMode(void)

{

   BYTE* receiveBuffer;

   BYTE length;

   BYTE res;

   BYTE sender;

   while(1)

   {

     // YLED = LED_ON;

      res = radioReceive(&receiveBuffer, &length, RECEIVE_TIMEOUT, &sender);

     // YLED = LED_OFF;

      if(res == TRUE)

      {

         GLED = LED_ON;

        UART0_SEND_PC(receiveBuffer);      //用串口0发送接收到的数据

            // IEN0&=0XFB;

         halWait(200);

      }

      else

      {

         GLED = LED_OFF;

         halWait(200);

      }

      GLED = LED_OFF;

   }

}

总体相对于点对点,只是加了个串口发送程序

void UART0_SEND_PC(BYTE* receive_data)

{

  BYTE i;

  for(i=0;i<50;i++)

  {

    U0DBUF =* receive_data;

    receive_data ++;

  // while(~ (U0CSR & 0x02));

     halWait(1);

  }

}

点对多点建立在点对点__UART的基础上,将两个节点的频率设置为不同的两个,

通过一个while程序来依次读取。

while(1)

        {  

           //交替读取两个节点的数据

           Receivesel = (Receivesel+1)%3;//自动切换信道

           if(Receivesel ==0) Receivesel = 1;

           TryToReceive = TRY_TO_RECEIVE;

           if(Receivesel==1)  frequency = NO_1_FREQUENCY;

           if(Receivesel==2)  frequency = NO_2_FREQUENCY;

           initRfTest(frequency);

           receiveMode();

         }

void contionuousMode(void)

发送程序与点对点程序基本相同

while(TryToReceive--)

   {

      RLED = LED_OFF;

      YLED = LED_OFF;

      res = radioReceive(&receiveBuffer, &length, RECEIVE_TIMEOUT, &sender);

      if(res == TRUE)

      {

           //UartTX_Send_String((char*)receiveBuffer,21);

          if(frequency == NO_1_FREQUENCY)

          {

            Print(2,2,receiveBuffer,1);

            YLED = LED_ON;//接收成功的标志

          }

          if(frequency == NO_2_FREQUENCY)

          {

            Print(5,2,receiveBuffer,1);

            RLED = LED_ON;//接收成功的标志

          }

           halWait(200);

          return;

      }

      else

      {

           YLED = LED_OFF;

           halWait(200);

      }

      YLED = LED_OFF;

   }

   return;

}

接收程序通过频率的不同来区分是来自哪一个节点发送来的数据。

然后通过液晶显示。

此程序中运用液晶显示。

引自: http://hi.baidu.com/sendoc/blog/item/ac923500ccc8ed1f728b65a2.html
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值