#include<intrins.h>
// 常量定义
#define uchar unsigned char
#define uint unsigned int
#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80
//---------------------------位变量定义----------------------------------------
bdata uchar DATA_BUF //用于ByteRead和ByteWrite 函数
#define DATA7 ((DATA_BUF&BYTE_BIT7)!=0)
#define DATA0 ((DATA_BUF&BYTE_BIT0)!=0)
uchar TxBuf[28]={
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x27,0x28,}// ------------------------------<RF2401_Pins 对应引脚>-----------------------
sbit PWR_UP = P1^3
sbit CE = P1^2
// sbit DR2 = P1^7 //暂时没有用到
// sbit CLK2 = P1^1
// sbit OUT2 = P1^6
sbit CS = P1^0
sbit DR1 = P1^5
sbit CLK1 = P1^4
sbit DATA = P3^3
//----------------------------------------LED显示端口团拦---------------------------------------------------
sbitLED=P3^5
//-------------------------------------------------------------------------------
unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc} //发送地址
//---------------------<nRF-Configuration-Register 配置信息 >------------------------------
//芯片测试用,无需修改
#define TEST_2 0x8E // MSBD143-D136
#define TEST_1 0x08//D135~D128
#define TEST_0 0x1c// D127~D120
// 注意 DATAx_W+ADDRx_W+CRC 的值必须小于256!单个数据包的大小必须小于32字节(256位)
#define DATA2_W 0x10//未用到--0x10=2字节 //频道2发送/接受数据长度(单位纯悄:Bit)
#define DATA1_W 0xE0//28字节 16 位 //频道1发送/接受数据长度(单位:Bit)
//频道2接收地址<-频道2未使用
#define ADDR2_4 0x00
#define ADDR2_3 0x1c
#define ADDR2_2 0xcc
#define ADDR2_1 0xcc
#define ADDR2_0 0xcc
// 频道1接收地址 (当前塌裤胡模块地址) <-只是用频道1
#define ADDR1_4 0x00
#define ADDR1_3 0xcc
#define ADDR1_2 0xcc
#define ADDR1_1 0xcc
#define ADDR1_0 0xcc
//接收地址位置设置--CRC设置
#define ADDR_W 0x10 //0x10 =2字节 //发送/接收地址宽度(单位:Bit)
#define CRC_L 0x1 //CRC模式 0:8位 1:16位
#define CRC_EN 0x1 //CRC校验 0:禁止 1:启用
//频道设置--发送方式设置--速率设置--频率设置
#define RX2_EN 0x0 //双频道功能 0:禁用 1:启用
#define CM 0x1 //0:Direct Mode 1: Shockburst Mode
#define RFDR_SB 0x1 //传输速率 0:250k 1: 1M (250k比1M传输距离远)
#define XO_F 0x3 //16M D12 D11 D10 确定 5种频率
#define RF_PWR 0x3 //信号发射功率---0DB
//
#define RF_CH 0x2 //Channal 频率设置Channel=2400MHz+RF_CH*1.0MHz
#define RXEN 0x0 //0:TX 1:RX
//<将设置信息组合成每个字节的数据信息
#define RFconfig_Bit0 TEST_2
#define RFconfig_Bit1 TEST_1
#define RFconfig_Bit2 TEST_0
#define RFconfig_Bit3 DATA2_W
#define RFconfig_Bit4 DATA1_W
#define RFconfig_Bit5 ADDR2_4
#define RFconfig_Bit6 ADDR2_3
#define RFconfig_Bit7 ADDR2_2
#define RFconfig_Bit8 ADDR2_1
#define RFconfig_Bit9 ADDR2_0
#define RFconfig_Bit10 ADDR1_4
#define RFconfig_Bit11 ADDR1_3
#define RFconfig_Bit12 ADDR1_2
#define RFconfig_Bit13 ADDR1_1
#define RFconfig_Bit14 ADDR1_0
#define RFconfig_Bit15 (ADDR_W<<2|CRC_L<<1|CRC_EN)
#define RFconfig_Bit16 (RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR)
#define RFconfig_Bit17 (RF_CH<<1|RXEN)
//通过宏定义将18字节的寄存器参数按照各个功能分解,参照DATASHHET
uchar code nRF2401_Conf[18]=
{
RFconfig_Bit0,RFconfig_Bit1,RFconfig_Bit2,
RFconfig_Bit3,
RFconfig_Bit4,
RFconfig_Bit5,RFconfig_Bit6,RFconfig_Bit7,RFconfig_Bit8,RFconfig_Bit9,
RFconfig_Bit10,RFconfig_Bit11,RFconfig_Bit12,RFconfig_Bit13,RFconfig_Bit14,
RFconfig_Bit15,
RFconfig_Bit16,
RFconfig_Bit17
}
//------------------------------------------函数申明------------------------------------------
void Delay_us(uchar n)
void DoClock()
void Delay_ms(uchar n)
unsigned char Spi_ByteRead(void)
void Spi_ByteWrite(unsigned char send)
void Config2401(void)
void SetTxMode(void)
void nRF2401_TxPacket(uchar TxBuf[])
//--------------------------------11.0592M晶振 n=100 868us 左右-------------------------------
void Delay_us(uchar n)
{
uint i
for(i=0i<ni++)
}
//------------------------------------------ -----------------------------------------
void Delay_ms(uchar n)
{
unsigned int i,j,kfor(i=0i<ni++)
{
for(k=0k<5k++)
{
for(j=0j<200j++)
}
}
}
/*
//--------------------------SPI读------------------------------------------
unsigned char Spi_ByteRead(void)
{
unsigned char i = 0
for (i=0i<8i++)
{
DATA_BUF = DATA_BUF <<1
CLK1 = 1
DATA = 1//设置为输入状态
if (DATA) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF |= BYTE_BIT0
}
else
{
DATA_BUF &= ~BYTE_BIT0
}
CLK1 = 0
}
return DATA_BUF
}*/
//----------------------------------SPI写-----------------------------------------
void Spi_ByteWrite(unsigned char send)
{
unsigned char iDATA_BUF = sendCLK1 = 0for (i=0i<8i++)
{
if (DATA7) //总是发送最高位
{
DATA = 1
}
else
{
DATA = 0
}
CLK1 = 1
DATA_BUF = DATA_BUF <<1
CLK1 = 0
}
}
//-----------------------------配置2401--------------------------------------------
void Config2401(void)
{
uint i
uchar variable1
PWR_UP=1 //上电
CE=0
CS=1 //使RF2401进入配置方式
Delay_ms(3) //从上电到进入配置模式需要3ms的延时(最少)
for(i=0i<18i++) //输入3个测试字节15个配置字节共 18Byte
{
variable1=nRF2401_Conf[i]
Spi_ByteWrite(variable1)
}
CS=0//Disable CS -----standby mode
DATA=0
Delay_us(100)
}
//--------------------------------设置为发送模式 ----------------------------
void SetTxMode(void)
{
//-------------------------------设置为配置模式----------------------------------
PWR_UP=1 //上电
CE=0
CS=1 //进入配置模式
Delay_us(100)
DATA=0 //配置寄存器0字节RXEN 设置为0: 发送模式
CLK1=1
CLK1=0
//----------------------------设置为 Activemodes(TX)------------------------------
CS=0
CE=1 //set standby mode
Delay_us(100)
}
//--------------------------------nRF 数据发送函数--------------------------------
void nRF2401_TxPacket()
{
int i
uchar variable2
CE=1
for(i=0i<2i++)//写入接受地址(按字节对齐)
{
variable2=TxAddress[i]
Spi_ByteWrite(variable2)
}
for(i=0i<(28)i++) //写入接受地址(按字节对齐)
{
variable2=TxBuf[i]
Spi_ByteWrite(variable2)
}
CE=0 //CE配置低使发送有效
Delay_us(100) //时钟信号高电平有效
}
//------------------------------------主函数---------------------------------------
main()
{
Config2401()
while(1)
{
nRF2401_TxPacket()
SetTxMode()
LED=0 Delay_ms(10)LED=1Delay_ms(10)
}
}
我有一完整的程序,由于担心单片含厅机实验板上的5V电压会损坏24L01,加上需两块单片机协调工缓姿作,因此也没敢试,如果你有条件,帮我试一下,我不要积分,只告诉我实验结果就行#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条)