无线收发nfr905接收程序
时间:01-15 09:47 阅读:643次
*温馨提示:点击图片可以放大观看高清大图
简介:本文介绍的主要是无线收发nfr905的接收程序
//数传接收2007/8/1 AT89C2051 11.0592MHz
//Module nRF905_RX VCC=3V
#include <reg51.H>
#include <intrins.h>//_nop_()
typedef unsigned char uchar;
typedef unsigned int uint;
//配置口定义//
sbit TXEN = P1^7;
sbit TRX_CE = P1^6;
sbit PWR = P1^5;
//SPI口定义//
sbit MISO = P1^1;
sbit MOSI = P1^0;
sbit SCK = P3^7;
sbit CSN = P3^3;
//状态输出口//
sbit CD = P1^4;
sbit AM = P1^3;
sbit DR = P3^2;
sbit LED1 = P3^4;
sbit LED2 = P3^5;
//控制按钮
sbit AN1 = P3^0;
sbit AN2 = P3^1;
//--------------------------------------
void Init_MCU(void)
{
TMOD=0x20;
TH1=0xfd; //Baudrate=19200
TL1=0xfd;
PCON=0x80;
SCON=0x50;
TR1=1;
LED1=1;
LED2=1;
}
//-----------------------------------------------
void Send_PC(uchar mess)
{
SBUF=mess;
while(TI==0); TI=0;
}
//----------------------------------------------
//RF寄存器配置//
unsigned char idata RFConf[11]=
{
0x00, //配置命令
0x6C, //CH_NO,配置频段在433.2MHZ
0x0C, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x04,0x04, //接收发送有效数据长度为4字节
0xE7,0xE7,0xE7,0xE7,//接收地址
0xDE, //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振
};
uchar TxRxBuffer[5];
bit lcdbit;
//延时
void Delay(uint x)
{
uint i;
for(i=0;i<x;i++){
_nop_();
}
}
//SPI口写数据到nRF905
void SpiWrite(uchar b)
{
uchar i=8;
while (i--)
{
Delay(10);
SCK=0;
MOSI=(bit)(b&0x80);
b<<=1 ;
Delay(10);
SCK=1;
Delay(10);
SCK=0;
}
SCK=0;
}
//由nRF905读数据
uchar SpiRead(void)
{
uchar i=8;
uchar ddata=0;
while (i--)
{
ddata<<=1 ;
SCK=0;
_nop_();_nop_();
ddata|=MISO;
SCK=1 ;
_nop_();_nop_();
}
SCK=0;
return ddata;
}
//接收数据包
void RxPacket(void)
{
uchar i;
i=0;
while(DR)
{
TxRxBuffer = SpiRead();
i++;
}
}
/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
//--------------------------------------
void DelayMs(uint n) //j=115@F=11.0592MHz
{ uchar j;
while(n--)
{for(j=0;j<115;j++);}
}
//等待接收数据包
uchar temp;
void Wait_Rec_Packet(void)
{
TXEN=0;
TRX_CE=1;
while(1)
{
if(DR)
{
TRX_CE=0; //若数据准备好则进入待机模式,操作SPI
CSN=0;
SpiWrite(0x24);
RxPacket();
CSN=1;
LED2=0;
DelayMs(200);
LED2=1; //如果接收的数据正确
//}
break;
}
}
}
//初始化配置寄存器
void Ini_System(void)
{
uchar i;
LED1=0;
Delay(10000);
LED1=1;
lcdbit=1;
CSN=1;
SCK=0;
PWR=1;
TRX_CE=0;//SPI写入
TXEN=0;
_nop_();
CSN=0;
for(i=0;i<11;i++){
SpiWrite(RFConf);
}
CSN=1;
PWR=1;
TRX_CE=1;//
TXEN=0;
Delay(1000);
}
//-----------------------------------------------
void main(void)
{
uint i;
DelayMs(100);
LED1=0;
DelayMs(1000);
LED1=1;
Init_MCU();
Send_PC(0xAA);
Send_PC(0xBB);
Ini_System();
while(1)
{
Wait_Rec_Packet(); //等待接收完成
for(i=0;i<4;i++)
Send_PC(TxRxBuffer);
}
}