#include<reg52.h>
#include<intrins.h>
#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
#define uint unsigned int //预定义
#define uchar unsigned char
#define BUF_LEN 20 //数据长度
//-------------------------------------------------
extern uchar ReceiveData; //外部函数声明
extern void InitUart(void);
extern void Uart_Send_Byte(uchar Data);
extern void Uart_Send_string( unsigned char *str);
extern bit read_flg;
extern uchar str[];
extern uchar is_recv_ch;
extern uchar ReceiveData;
//-------------------------------------------------
bit RX_flg=0;
unsigned char TxRxBuf[32];
uchar is_recv_num = 0;
int gNumIdex = 0;
uchar recv_num_state = 0;
//nRF2401对应的引脚
sbit PWR_UP=P1^0;
sbit CE=P2^1;
//不用到通道2,保留引脚
//sbit DR2 =P1^1;
//sbit CLK2 =P1^2;
//sbit OUT2 =P3^3;
sbit CS =P2^0;
sbit DR1=P1^4;
sbit CLK1=P1^5;
sbit DATA=P1^6;
sbit LED0=P0^0;
/**********************************************************************
**nRF2401配置信息
**nrf configuration
***********************************************************************/
#define TEST_2 0x8E //MSB D143~D136 8b
#define TEST_1 0x08 // 8b
#define TEST_0 0x1C // 8b
#define DATA2_W 0x10 //两个字节的宽度 8b
#define DATA1_W 0xE0 //28个字节的宽度 8b
//频道2的接收地址,频道2未启用 ADDR2 40b
#define ADDR2_4 0x00
#define ADDR2_3 0x1c
#define ADDR2_2 0x3c
#define ADDR2_1 0xcc
#define ADDR2_0 0xcc
//频道1的接收地址,只使用频道1 ADDR1 40b
#define ADDR1_4 0x00
#define ADDR1_3 0xca
#define ADDR1_2 0xca
#define ADDR1_1 0xca
#define ADDR1_0 0xca
#define ADDR_W 0x10 //两个地址的宽度 6b
#define CRC_L 0x01 //CRC模式0=8位 1=16位 1b
#define CRC_EN 0x01 //CRC校验0为禁用 1为启用 1b
#define RX2_EN 0x0 //双频道功能 0为禁用 1b
#define CM 0x01 //0:direct mode 1:shock mode 1b
#define RFDR_SB 0x00 //传输速度0:250kbps 1:1M(250kbps比1M传的更远 1b
#define XO_F 0x03 //16M 3b
#define RF_PWR 0x03 //信号发射功率 2b
#define RF_CN 0x02 //频律设置 7b
#define RXEN 0x00 //0:TX 1:RX 1b
/*
//将设置信息组合成每个字的数据信息
#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_CN|RXEN)
//通过宏定义将18字节的寄存器参数按照各个功能能分解,以便于参数的修改
unsigned char 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};
*/
/*************************************************************************
* nrf2401的功能函数
* void Delay100(void); //延时函数
* void Config2401(void); //配置2401,写入初始化设置
* void SetTxMode(void); //设置为发送模式
* void SetRxMode(void); //设置为接受模式
* void nRF2401_TXPacket(unsigned char TxBuf[]);//发送TxBuf[]内的数据,长度
由DATA_W决定
* void nRF2401_RxPacket(unsignde char *RxBUF[]);//检查是否有数据要接受,如果有,则保存至
RxBUF[]
//返回值0没有接收到数据,1接收到数据
******************************************************************************
*/
//16M 600us
void Delay100(void)
{
unsigned int i;
for(i=0;i<100;i++);
}
void Delay(void)
{
unsigned int i;
for(i=0;i<100;i++){for(i=0;i<100;i++);}
}
/*****************************************************************************/
//====================
void recv_num(uchar ch)
{
// Uart_Send_Byte(recv_num_state);
//Uart_Send_Byte(ch);
switch (recv_num_state)
{
case 0:
if( ch == 0xff)
{
recv_num_state = 1;
//Uart_Send_Byte(recv_num_state);
//Uart_Send_Byte('0');
}
//else
//Uart_Send_Byte('n');
break;
case 1:
//Uart_Send_Byte('1');
if( ch == 0xaa)
recv_num_state = 2;
break;
case 2:
// Uart_Send_Byte('2');
if( ch == 0x55)
recv_num_state = 3;
break;
case 3:
// Uart_Send_Byte('3');
if(ch==0x77)
{
str[gNumIdex] = '\0';
recv_num_state = 4;
gNumIdex = 0;
}
else
{
if(gNumIdex<20)
{
str[gNumIdex] = ch;
gNumIdex++;
}
}
break;
case 4:
// Uart_Send_Byte('4');
if(ch==0xbb)
recv_num_state = 5;
break;
case 5:
// Uart_Send_Byte('5');
if(ch==0x33)
{
recv_num_state = 0;
is_recv_num = 1; //data end
}
break;
default:
break;
}
}
//====================
bdata unsigned char DATA_BUF;//用于ByteRead和ByteWrite函数
#define DATA7 ((DATA_BUF&BYTE_BIT7)!=0)
#define DATRA0 ((DATA_BUF&BYTE_BIT0)!=0)
/*******************************************************
读串口字,移位的方式
*******************************************************/
unsigned char ByteRead(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
DATA_BUF=DATA_BUF<<1;
CLK1=1;
_nop_();
_nop_();
DATA=1; //设置为输入状态,单片机对引脚置1,然后对其读值
if(DATA) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BYTE_BIT0;
}
else
{
DATA_BUF&=~BYTE_BIT0;
}
CLK1=0;
}
return DATA_BUF;
}
/*******************************************************
写串口字,移位的方式
*******************************************************/
void ByteWrite(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for(i=0;i<8;i++)
{
if(DATA7) //总是发送最高位
{
DATA=1;
}
else
{
DATA=0;
}
CLK1=1;
DATA_BUF=DATA_BUF<<1;
CLK1=0;
}
}
/**********************BuildInitWord() start*****************************/
uchar InitData[18];
void BuildInitWord()
{
InitData[0] =TEST_2 ; //0x8E
InitData[1] =TEST_1 ; //0x08
InitData[2] =TEST_0 ; // 0x1c
InitData[3] =DATA2_W ; // 0x10
InitData[4] =DATA1_W ; //0x20
InitData[5] =ADDR2_4 ; // 0x00
InitData[6] =ADDR2_3 ; // 0x1c
InitData[7] =ADDR2_2 ; // 0x3c
InitData[8] =ADDR2_1 ; // 0xcc
InitData[9] =ADDR2_0 ; // 0xcc
InitData[10]=ADDR1_4 ; // 0x00
InitData[11]=ADDR1_3 ; // 0xca
InitData[12]=ADDR1_2 ; // 0xca
InitData[13]=ADDR1_1 ; // 0xca
InitData[14]=ADDR1_0 ; // 0xca
InitData[15]=(ADDR_W<<2|CRC_L<<1|CRC_EN) ; // 0x43
InitData[16]=(RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR) ; // 0x4f
InitData[17]=(RF_CN|RXEN) ; // 0x05
}
/*********************BuildInitWord() end******************************/
/*****************************************************
***2401的配置寄存器写入通过写入移位寄存器完成********
*****************************************************/
void Config2401(void)
{
unsigned char variable1;
unsigned char i;
CS=0;
CE=0;
PWR_UP=1; //上电
for(i=0;i<10;i++)
Delay100(); //从上电到配置模式需要3毫秒的是延时
CS=1; //使2401进入配置模式
for(i=0;i<18;i++)
{
variable1=InitData[i];
ByteWrite(variable1);
}
Del
- 1
- 2
前往页