您的位置:首页 > 其它

ZigBee 点对点无线通信

2011-07-21 11:31 295 查看
先从主函数开始
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: