无线发射程序.docx
《无线发射程序.docx》由会员分享,可在线阅读,更多相关《无线发射程序.docx(7页珍藏版)》请在冰豆网上搜索。
无线发射程序
无线发射
#include
#include
#include
#include
//----------------------------------------------------------------------------------------------------------------
#defineuintunsignedint
#defineucharunsignedchar
//----------------------------------------------------------------------------------------------------------------
#defineBYTE_BIT0 0x01
#defineBYTE_BIT7 0x80
//----------------------------------------------------------------------------------------------------------------
bdataunsigned charDATA_BUF;
#defineDATA7 ((DATA_BUF&BYTE_BIT7)!
=0)
#defineDATA0 ((DATA_BUF&BYTE_BIT0)!
=0)
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
//---------------------------------------------------发送数据缓冲区-------------------------------------------------
#defineTxRxBuf_Len4
unsignedcharTxRxBuf[TxRxBuf_Len]={0x29,0x30,0x31,0x32,};
codeTxAddress[4]={0xcc,0xcc,0xcc,0xcc};
chartf;
//----------------------------------------NRF905工作模式控制端口------------------------------------------------------
sbit TXEN=P1^4;
sbit TRX_CE=P3^2;
sbit PWR=P1^3;
//----------------------------------------LED显示端口---------------------------------------------------
sbit LED=P3^5;
//----------------------------------------NRF905数据交换端口---------------------------------------------------
sbit MISO=P1^6;
sbit MOSI=P1^1;
sbit SCK=P1^5;
sbit CSN=P1^0;
//----------------------------------------nrf905状态端口---------------------------------------------------------
sbit AM=P1^7;
sbit DR=P3^3;
sbit CD=P1^2;
//---------------------------------------------------------------------------------------------------------------
sbit led3=P2^0;
sbit led2=P2^1;
sbit led1=P2^2;
sbit led0=P2^3;
//----------------------------------------按键端口-------------------------------------------------------
sbit KEY=P3^4;
//----------------------------------------nrf905控制指令-------------------------------------------
#defineWC 0x00
#defineRC 0x10
#defineWTP 0x20
#defineRTP 0x21
#defineWTA 0x22
#defineRTA 0x23
#defineRRP 0x24
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsignedcharidataRFConf[11]=
{
0x00, //配置命令//
0x4c, //CH_NO,配置频段在430MHZ
0x0c, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x04,0x04, //接收发送有效数据长度为4字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//================================================延时===========================================================
voidnrf905_Delay(intn)
{
uinti;
while(n--)
for(i=0;i<80;i++);
}
//=================================================SPI读函数=======================================================
unsignedcharSpiRead(void)
{
unsignedcharj;
for(j=0;j<8;j++)
{
DATA_BUF=DATA_BUF<<1;
SCK=1;
if(MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BYTE_BIT0;
}
else
{
DATA_BUF&=~BYTE_BIT0;
}
SCK=0;
}
returnDATA_BUF;
}
//===========================================SPI写函数===============================================================
voidSpiWrite(unsignedcharsend)
{
unsignedchari;
DATA_BUF=send;
for(i=0;i<8;i++)
{
if(DATA7) //总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
DATA_BUF=DATA_BUF<<1;
SCK=0;
}
}
//------------------------------------------------------初始化nRF905---------------------------------------------
voidnRF905Init(void)
{
CSN=1; //Spi disable
SCK=0; //Spiclocklineinitlow
DR=1; //InitDRforinput
AM=1; //InitAMforinput
CD=1; //InitCDforinput
PWR=1; //nRF905poweron
TRX_CE=0; //SetnRF905instandbymode
TXEN=0; //setradioinRxmode
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
voidConfig905(void)
{
uchari;
CSN=0; //Spienableforwriteaspicommand
//SpiWrite(WC); //Writeconfigcommand写放配置命令
for(i=0;i<11;i++) //Writeconfigrationwords 写放配置字
{
SpiWrite(RFConf[i]);
}
CSN=1; //DisableSpi
}
//-----------------------------------------------------发送数据打包---------------------------------------------------
voidTxPacket(uchar*TxRxBuf)
{
uchari;
//Config905();
CSN=0;
SpiWrite(WTP); //Writepayloadcommand
for(i=0;i<4;i++)
{
SpiWrite(TxRxBuf[i]); //Write32bytesTxdata
}
CSN=1;
nrf905_Delay
(1); //Spidisable
CSN=0; //Spienableforwriteaspicommand
SpiWrite(WTA); //Writeaddresscommand
for(i=0;i<4;i++) //写入与对方地址一样的地址
{
SpiWrite(TxAddress[i]);
}
CSN=1; //Spidisable
TRX_CE=1; //SetTRX_CEhigh,startTxdatatransmission
nrf905_Delay
(1); //while(DR!
=1);
TRX_CE=0; //SetTRX_CElow
}
//----------------------------------------------设置发送初始状态---------------------------------------------
voidSetTxMode(void)
{
TRX_CE=0;
TXEN=1;
nrf905_Delay
(1); //nrf905_Delayformodechange(>=650us)
}
//-----------------------------------------------设置接收初始化---------------------------------------------------
voidSetRxMode(void)
{
TXEN=0;
TRX_CE=1;
nrf905_Delay
(1); //nrf905_Delayformodechange(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsignedcharCheckDR(void) //检查是否有新数据传入DataReady
{
DR=1;
//通过对端口写1,可以使端口为输入状态,这51的特性。
不熟悉者可以参阅51相关书籍作证(将DR端口设置为输入状态。
)
if(DR==1)
{
DR=0;
return1;
}
else
{
return0;
}
}
//----------------------------------------------------读NRF905接收数据------------------------------------------------------------
voidRxPacket(void)
{
uchari;
nrf905_Delay
(1);
// TRX_CE=0; //SetnRF905instandbymode
nrf905_Delay(100);
TRX_CE=0;
CSN=0; //Spienableforwriteaspicommand
nrf905_Delay
(1);
SpiWrite(RRP);
for(i=0;i<4;i++)
{
TxRxBuf[i]=SpiRead(); //Readdataandsavetobuffer
}
CSN=1;
nrf905_Delay(10);
TRX_CE=1;
}
//--------------------------------------------------------数据接收------------------------------------------------
void RX(void)
{
SetRxMode();
// while(CheckDR()==0); 为了实现双向通信,就不能一直处于接收等待状态,所以注释掉
nrf905_Delay(10);
RxPacket();
if(TxRxBuf[0]==0x29)
{
LED=0;
nrf905_Delay(300);
LED=1;
nrf905_Delay(300);//接收到数据后闪烁
}
}
//-----------------------------------------------------------------------------------------------------------------
voidmain(void)
{
nRF905Init();
Config905();
LED=1;
while
(1)
{
RX();
if(KEY==0)
{
while(KEY==0);
tf=1;
TxRxBuf[0]=0x29;
}
if(tf==1)
{
SetTxMode();
TxPacket(TxRxBuf); //发送命令数据
LED=0;
nrf905_Delay(300);
LED=1;
nrf905_Delay(300); //发送后LED闪烁