📄 rev.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
#include "lcd1602.h"
//for nRF2401
// new PCB
#define nRF2401_DataLength_TX (24+4) //发送数据的长度
#define nRF2401_DataLength_RX (24) //接收数据的长度
sbit Data =P2^7;
sbit CLK1 =P2^6;
sbit DR1 =P2^5;
sbit CS =P2^1;
sbit CE =P2^0;
//for nRF2401
uchar xdata InitData[15];
uchar xdata TXData[nRF2401_DataLength_TX];
uchar xdata RXData[nRF2401_DataLength_RX];
uchar Temp;
uchar BitCnt;
uchar ByteCnt;
bdata uchar tempi;
sbit bflag =tempi^7;
//nRF2401
void BuildInitWord();
void InitnRF2401();
void DoSPIClock();
void CE_High();
void RXEN_HIGH();
void TXEN_LOW();
void delay10();
void delay100();
void BuildShockWord();
void ShockBurst();
void CheckButtons();
void ReceiveShock();
void nRF2401SendData();
/*Build mode,write build words*/
void BuildInitWord()
{
InitData[0]=nRF2401_DataLength_RX<<3;//InitData[0]=0x50; //RX receiver 2, Datalength 80bit(10 byte)
InitData[1]=InitData[0];//InitData[1]=0x50; //RX receiver 1, Datalength 80bit(10 byte)
InitData[2]=0x00;
InitData[3]=0xcc;
InitData[4]=0xcc;
InitData[5]=0xcc;
InitData[6]=0xcc;
InitData[7]=0x00;
InitData[8]=0xcc; //RX receiver 1 address High byte
InitData[9]=0xcc; //RX receiver 1 address High byte
InitData[10]=0xcc; //RX receiver 1 address Low byte
InitData[11]=0xcc; //RX receiver 1 address Low byte
//InitData[12]=0x82; //this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC disable(Bit0) for ES chip
InitData[12]=0x83; //this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0) for final chip
//InitData[13]=0x4f; //One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 250K, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
InitData[13]=0x6f; //One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 1M, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
InitData[14]=0x05; //Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
TXData[0]=0xcc; //MSB ;RX receiver 1 address High byte
TXData[1]=0xcc; //MSB-1 ;RX receiver 1 address High byte
TXData[2]=0xcc; //MSB-2 ;RX receiver 1 address Low byte
TXData[3]=0xcc; //MSB-3 ;RX receiver 1 address Low byte
}
/*************************************BuildSPIWord END******************************/
/*************************************InitnRF2401 START******************************/
void InitnRF2401()
{
CE=0; //Disable CE
CS=1; //Enable CS--confige mode
for (ByteCnt=0;ByteCnt<15;ByteCnt++)
{
tempi=InitData[ByteCnt];
for (BitCnt=0;BitCnt<8;BitCnt++)
{
if (bflag==1) //Check if first bit is HIGH
Data=1; //Set Data high
else
Data=0; //Set Data low
tempi=tempi<<1; //Left Shift to get next bit
DoSPIClock(); //Call "DoClock" to generate a clock pulse
}
}
CS=0; //Disable CS--standby mode
Data=0; //Set Data low
}
/*************************************InitnRF2401 END *******************************/
/*************************************DoSPIClock START******************************/
void DoSPIClock()
{
CLK1=1;
_nop_();
_nop_();
CLK1=0;
}
/*************************************DoSPIClock END *******************************/
/*************************************CE_High START ******************************/
void CE_High()
{
CE=1;
}
/*************************************CE_High END *******************************/
/*************************************RXEN_HIGH START ******************************/
void RXEN_HIGH()
{
CE=0; //Set CE LOW
CS=1; //Set CS HIGH--confige mode
Data=1; //Set Data HIGH
DoSPIClock(); //Make one SPIClock cycle
CS=0; //Set CS LOW
CE=1; //Set CE HIGH--active mode
}
/*************************************RXEN_HIGH END *******************************/
/*************************************TXEN_LOW START ******************************/
void TXEN_LOW()
{
CE=0; //Set CE LOW
CS=1; //Set CS HIGH--confige mode
Data=0; //Set Data LOW
DoSPIClock(); //Make one SPIClock cycle
CS=0; //Set CS LOW
CE=1; //Set CE HIGH--active mode
}
/*************************************TXEN_LOW END *******************************/
/*************************************delay10 START ******************************/
/*void delay10()
{
uchar x;
uchar y;
for(x=0;x<10;x++)
{
for(y=0;y<100;y++)
_nop_();
}
} */
/*************************************delay10 END *******************************/
/*************************************delay100 START *****************************/
void delay100()
{
uchar x;
uchar y;
for(x=0;x<100;x++)
{
for(y=0;y<100;y++)
_nop_();
}
}
/*************************************delay100 END *******************************/
/*************************************ShockBurst START *****************************/
void BuildShockWord()
{
TXData[0]=0xcc; //MSB ;RX receiver 1 address High byte
TXData[1]=0xcc; //MSB-1 ;RX receiver 1 address High byte
TXData[2]=0xcc; //MSB-2 ;RX receiver 1 address Low byte
TXData[3]=0xcc; //MSB-3 ;RX receiver 1 address Low byte
TXData[4]=0; //MSB-4 ;Data byte 9
TXData[5]=0; //MSB-5 ;Data byte 8
TXData[6]=0; //MSB-6 ;Data byte 7
TXData[7]=0; //MSB-7 ;Data byte 6
TXData[8]=0; //MSB-8 ;Data byte 5
TXData[9]=0; //MSB-9 ;Data byte 4
TXData[10]=0; //MSB-10 ;Data byte 3
TXData[11]=0; //MSB-11 ;Data byte 2
TXData[12]=0; //MSB-12 ;Data byte 1
TXData[13]=0; //MSB-13 ;Data byte 0
}
/************************************* BuildShockWord END *******************************/
/************************************* ShockBurst START *******************************/
void ShockBurst()
{
CS=0; //Pull CS low
CE=1; //Enable CE active mode
for (ByteCnt=0;ByteCnt<nRF2401_DataLength_TX;ByteCnt++)
{
tempi=TXData[ByteCnt];
for (BitCnt=0;BitCnt<8;BitCnt++)
{
if (bflag==1) //Check if first bit is HIGH
Data=1; //Set Data high
else
Data=0; //Set Data low
tempi=tempi<<1; //Left Shift to get next bit
DoSPIClock();
//SendData(); //Call SendData
}
}
CE=0; //Disable CE (TX Starts!)--standby mode
Data=0; //Set Data low
}
/************************************* ShockBurst END ***********************************/
/************************************* SendData START *******************************
void SendData()
{
for (BitCnt=0;BitCnt<8;BitCnt++)
{
if (bflag==1) //Check if first bit is HIGH
Data=1; //Set Data high
else
Data=0; //Set Data low
tempi=tempi<<1; //Left Shift to get next bit
DoSPIClock(); //Call "DoClock" to generate a clock pulse
}
}
************************************** SendData END *************************************/
/************************************* ReceiveShock START *******************************/
void ReceiveShock()
{
Data=1; //Set Data tri state
Temp=0;
for (ByteCnt=0;ByteCnt<nRF2401_DataLength_RX;ByteCnt++)
{
for(BitCnt=0;BitCnt<8;BitCnt++)
{
Temp=Temp<<1; //shift left to receive next bit
CLK1=1; //set clock high
_nop_();
_nop_(); //wait one clk cycle
Data=1;
if(Data==1) //check if Data=high
Temp|=0x01; //yes - set bit high
CLK1=0; //set clock low
_nop_(); //wait one clk cycle
}
_nop_();
RXData[ByteCnt]=Temp;
DR1=1;
}
}
void nRF2401SendData()
{
BuildInitWord();
InitnRF2401();
CE_High();
RXEN_HIGH();
delay100();
TXEN_LOW(); // set TX mode
BuildShockWord();
ShockBurst();
delay100(); // delay for mode change
RXEN_HIGH();
}
main()
{
uchar code str[]="nRf2401";
uchar code str1[]="----OK!";
uchar i;
nRF2401SendData();
lcd_ini();
lcd_wrcmd(0x80);
for(i=0;i<strlen(str);i++)lcd_wrdata(str[i]);
DR1=1;
while(DR1!=1);
for(i=0;i<strlen(str1);i++)lcd_wrdata(str1[i]);
ReceiveShock();
lcd_wrcmd(0xc0);
for(i=0;i<10;i++)lcd_wrdata(RXData[i]);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -