1 发送程序
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit TXEN = P1^0; //配置口定义5`6`7//
sbit TRX_CE = P1^1;
sbit PWR = P1^2;
sbit MISO = P2^0; //SPI口定义0`1`2`3//
sbit MOSI = P2^1;
sbit SCK = P2^2;
sbit CSN = P2^3;
sbit DR = P1^5; //状态输出口4//
/************//*RF寄存器配置*//*************
// 0x00, //配置命令//
// 0x6C, //CH_NO,配置频段在433.2MHZ
// 0x0E, //输出功率为10db,不重发,节电为正常模式
// 0x44, //地址宽度设置,为4字节
// 0x03,0x03, //接收发送有效数据长度为3字节
// 0xE7,0xE7,0xE7,0xE7,//接收地址,16位CRC校验,外部时钟信号使能,16M晶振//UP_CLK输出1MHZ频率
// 0xDE, //CRC充许
//******************************/
/*uchar code RFConf[11]={0x00,0x6c,0x0e,0x44,0x03,0x03,
0xe7,0xe7,0xe7,0xe7,0xde};
*/
uchar RFConf[11]=
{
0x00, //配置命令//
0x4c, //CH_NO,配置频段在423MHZ
0x0C, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x02,0x02, //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void SpiWrite(uchar date) //用SPI口写数据至NRF905内//
{
uchar i;
for(i=0;i<8;i++)
{
delay(1);
SCK=0;
MOSI=(date&0x80);
date<<=1 ;
delay(1);
SCK=1;
delay(1);
SCK=0;
}
SCK=0;
}
void TxPacket(void)
{
TXEN=1;
CSN=0;
SpiWrite(0x22); //写发送地址,后面跟4字节地址//
SpiWrite(0xcc);
SpiWrite(0xcc);
SpiWrite(0xcc);
SpiWrite(0xcc);
CSN=1;
delay(1);
CSN=0;
SpiWrite(0x20); //写发送数据命令,后面跟三字节数据//
SpiWrite(0x00);
SpiWrite(0xff);
SpiWrite(0xfe);
CSN=1;
delay(1);
TRX_CE=1;
TXEN=1; //CE,EN同时为1,为发送模式
delay(1); //等带发送完成//
// while(!DR); //在非屏蔽状态下,只能发射一次
TRX_CE=0;
//led=~led; //加上led后,对接收产生了一定的影响,
//while(!DR); //有时多接收一次的数据
}
void Ini_System(void)
{ //初始化配置寄存器//
uchar i;
delay(1);
CSN=1;
SCK=0;
DR=0;
PWR=1; //进入掉电模式
TRX_CE=0;
TXEN=0;
delay(1);
CSN=0; //进入SIP模式
for(i=0;i<11;i++)
{
SpiWrite(RFConf[i]); //设置配置寄存器
}
CSN=1; //关闭SPI,进入发射状态
PWR=1;
}
void main(void)
{
Ini_System(); //设置配置,并进入发射模式
//PWR=1; //进入掉电模式
while(1)
{
TxPacket(); //发送数据
DR=0;
}
}
2接收程序
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit TXEN = P1^0; //配置口定义7`6`5//
sbit TRX_CE = P1^1;
sbit PWR = P1^2;
sbit MISO = P2^0; //SPI口定义0`1`2`3//
sbit MOSI = P2^1;
sbit SCK = P2^2;
sbit CSN = P2^3;
sbit DR = P1^5; //状态输出口4//
sbit led0=P0^0;
sbit led1=P0^1;
/************//*RF寄存器配置*//*************
// 0x00, //配置命令//
// 0x6C, //CH_NO,配置频段在433.2MHZ
// 0x0E, //输出功率为10db,不重发,节电为正常模式
// 0x44, //地址宽度设置,为4字节
// 0x03,0x03, //接收发送有效数据长度为3字节
// 0xE7,0xE7,0xE7,0xE7,//接收地址,16位CRC校验,外部时钟信号使能,16M晶振//UP_CLK输出1MHZ频率
// 0xDE, //CRC充许
//******************************/
/*uchar code RFConf[11]={0x00,0x6c,0x0e,0x44,0x03,0x03,
0xe7,0xe7,0xe7,0xe7,0xde};
*/
uchar RFConf[11]={ //配置命令//
0x00,0x4c,0x0c,0x44,0x02,0x02,
0xcc,0xcc,0xcc,0xcc,0x58 //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
uchar TxRxBuffer[2];
uchar date;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void SpiWrite(unsigned char date) //用SPI口写数据至NRF905内//
{
uchar i;
for(i=0;i<8;i++)
{
delay(1);
SCK=0;
MOSI=(date&0x80);
date<<=1 ;
delay(1);
SCK=1;
delay(1);
SCK=0;
}
SCK=0;
}
unsigned char SpiRead(void) //from 905 read data//
{
uchar i;
for(i=0;i<8;i++)
{
date<<=1 ;
SCK=0;
delay(1);
date|=MISO;
SCK=1 ;
delay(1);
}
SCK=0;
return(date);
}
void RxPacket(void) //接收数据包//
{
uchar i;
while(DR)
for (i = 0 ;i < 2 ;i++)
{
//led=~led;
TxRxBuffer[i] = SpiRead();
i++;
}
}
void Wait_Rec_Packet(void) //等待接收数据包//
{
// uchar temp;
PWR=1;
TXEN=0; //接收模式
TRX_CE=1;
delay(2);
while(!DR)
{ delay(10);
if(DR) //数据接收成功
{
TRX_CE=0; //如果数据准备好,则进入待机模式,以便SPI口操作
CSN=0;
delay(1);
SpiWrite(0x24); //读nRF905所接受到的数据
RxPacket(); //保存数据
CSN=1;
delay(10);
TRX_CE=1;
/*temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2];
if(temp==0x07)
{
lcdbit=!lcdbit; //lcdbit=0
}*/
break;
}
}
}
void Ini_System(void) //初始化配置寄存器//
{
uchar i;
//lcdbit=1;
CSN=1;
SCK=0;
DR=0;
PWR=1; //进入掉电模式
TRX_CE=0;
TXEN=0;
delay(1);
CSN=0; //进入SIP模式
for(i=0;i<11;i++)
{
SpiWrite(RFConf[i]); //设置配置寄存器
}
CSN=1; //关闭SPI,进入接收状态
PWR=1;
TRX_CE=1;
TXEN=0;
}
void main(void)
{
Ini_System(); //设置配置,并进入接收模式 (收)
//PWR=1; //进入掉电模式
led0=0;
while(1)
{
Wait_Rec_Packet(); //等待接收完成,保存完接收数据(保存数据+地址)
CSN=0;
P0 = TxRxBuffer[0];
delay(600);
P0 = TxRxBuffer[1];
delay(600);
P0 = TxRxBuffer[2];
delay(600);
CSN=1;
}
}
求各位大神帮忙看看,第一次使用无线模块,真心不太懂。。。。。
一周热门 更多>