
#include "reg52.h"
#include "intrins.h" //_nop_()延时函数用
#define uchar unsigned char
#define uint unsigned int
sbit DATA=P1^1 //发送方管脚配置
sbit CLK1=P1^2
sbit CS=P1^3
sbit CE=P1^4
sbit DR1=P1^5
sbit PWR_UP=P1^6
sbit led1=P1^0
sbit diol=P2^5
/*sbit DATA=P2^1 //接收方管脚配置
sbit CLK1=P2^2
sbit CS=P2^3
sbit CE=P2^4
sbit DR1=P2^5
sbit PWR_UP=P1^6
sbit led1=P3^7
sbit diol=P2^0//没用*/
sbit BIT0=ACC^0
sbit BIT7=ACC^7//
uchar TXData[14]
uchar RXData[10]
uchar Data1=0xff
uchar code table1[]={0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
uchar code table2[]={0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
delay1ms(int t)
{
uint i
uint j
for(i=0i<ti++)
for(j=0j<116j++)
}
void delay10us(void)
{
uchar y
for(y=0y<10y++)
_nop_()
}
void delay100us(void)
{
uchar y
for(y=0y<100y++)
_nop_()
}
/****************************************************************************************************
/*函数:write( uchar byte)
/*功能:通过IO口写入一个字节到NRF24L01
/****************************************************************************************************/
void write(uchar byte)
{
uchar i
ACC=byte
i=8
while(i)
{
DATA=BIT7
CLK1=1// output 'uchar', MSB to MOSI
_nop_()
_nop_() // shift next bit into MSB..
ACC<<=1
CLK1=0 // Set SCK high..
i-- // ..then set SCK low again
}
}
/****************************************************************************************************
/*函数:Read(uchar reg)
/*功能:NRF24L01的读时序
/****************************************************************************************************/
uchar Read(void)
{
uchar i
i=8
while(i)
{
CLK1=1// output 'uchar', MSB to MOSI
_nop_()
_nop_() // shift next bit into MSB..
ACC<<=1
BIT0=DATA
CLK1=0 // Set SCK high..
i-- // ..then set SCK low again
}
return ACC // return register value
}
/****************************************************************************************************/
/*功能:NRF24L01初始化控制结构体
/****************************************************************************************************/
struct RFConfig
{
uchar n
uchar buf[15]
}
typedef struct RFConfig RFConfig
#define ADDR_INDEX 8 //地址起始号为 8
#define ADDR_COUNT 4 //地址占4字节
code RFConfig tconf= //发射时配置字
{
15,//配置字长度15
0x50,//接收通道2数据长度80bit(10byte)
0x50,//接收通道1数据长度80bit(10byte)
0x00,0x00,0x00,0x00,0x00,//接收通道2地址最多40bit(5byte)
0x00,0xaa,0xbb,0x12,0x34,//接收通道1地址最多40bit(5byte)
0x83,//32bit地址长度,16bit crc校验
0x6f,//单通道接收
0x04//02频道发射
}
code RFConfig rconf=//接收时配置字
{
15,
0x50,
0x50,
0x00,0x00,0x00,0x00,0x00,
0x00,0xaa,0xbb,0x12,0x34,
0x83,
0x6f,
0x05//2频道接收
}
void nrf2401_on()
{
CE=0
CS=0
PWR_UP=1
delay1ms(3)
}
void nrf2401init_receiver(void)//接收初始化
{
uchar b
CE=0
CS=1
delay10us()
for(b=0b<rconf.nb++)//rconf.n=15
{
write(rconf.buf[b])
}
CE=1
CS=0
}
void nrf2401init_transmitter(void)//发射初始化
{
uchar b
CE=0
CS=1
delay10us()
for(b=0b<rconf.nb++)//rconf.n和tconf.n相等
{
write(tconf.buf[b])
}
CS=0
}
void nrf2401set_rxmode(void)//接收初始化后快速进入接收状态
{
CE=0
CS=1
delay10us()
write(rconf.buf[14])//写入命令0x05
CE=1
CS=0
}
void nrf2401set_txmode(void)//发射初始化后快速进入发射状态
{
CE=0
CS=1
delay10us()
write(tconf.buf[14])//写入命令0x04
CE=1
CS=0
}
void tx_packet(uchar m)//m=1发射数据包选table1,m=2选table2
{
uchar i
TXData[0]=0xaa//要不要补1个地址码0x00?不用,前面已设32bit地址长度,
TXData[1]=0xbb
TXData[2]=0x12
TXData[3]=0x34
if (m==1)
{
for(i=4i<14i++)
{TXData[i]=table1[i-4]}
}
else
{
for(i=4i<14i++)
{TXData[i]=table2[i-4]}
}
CS=0CE=1
delay10us()
for(i=0i<14i++)
{
write(TXData[i])
}
CE=0
}
/*void tx_packet(void)//发射数据包
{
uchar i
TXData[0]=0xaa//要不要补1个地址码0x00?不用,前面已设32bit地址长度,
TXData[1]=0xbb
TXData[2]=0x12
TXData[3]=0x34
for(i=4i<14i++)
{TXData[i]=table2[i-4]}
CS=0CE=1
delay10us()
for(i=0i<14i++)
{
write(TXData[i])
}
CE=0
}*/
void recevice_packet(void)//接收数据包
{
uchar i
for(i=0i<10i++)
{
RXData[i]=Read()
}
}
//发射方先发一个数据包,其中第5个数据(TXData[4])为0x88,然后进入接收状态,若收到的数据包第5个数是0x99,则点亮发光二极管
//接收方先进入接收状态,若收到的数据包第5个数是0x88,则点亮LED并发送一个数据包,其中第5个是0x99
void main(void)//发射方主程序
{
nrf2401_on()
nrf2401init_transmitter()
nrf2401set_txmode//进入发射状态
tx_packet(1)//发射数据包1第4个数据为0x88
nrf2401init_receiver()
nrf2401set_rxmode()//进入接收状态
while(DR1!=1)
recevice_packet()//接收数据包
diol=1//开通锁存器
if(RXData[4]==0x99)//如果收到正确遥数据0x99,则灯亮说明通信成功
{
led1=0
}
while(1)
}
/*void main(void)//接收方主程序
{
nrf2401_on()
nrf2401init_receiver()
nrf2401set_rxmode()//进入接收状态
while(DR1!=1)
recevice_packet()//接收数据包
diol=1//开通锁存器
if(RXData[4]==0x88)//如果收到正确遥数据0x88,则灯亮说明通信成功
{
led1=0
}
nrf2401init_transmitter()
nrf2401set_txmode//进入发射状态
delay1ms(10)//延时,让发送方准备好
tx_packet(2)//发射数据包2,第4个数据为0x99
while(1)
}*/
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)