📄 nrf2401a的51单片机的代码.txt
字号:
**********************************************************************************/
/**********************************************************************************/
// The nRF2401 2.4GHz Multi Channel Software
//
// This software and any related documentation is provided "as is" without any
// warranty of any kind, either express or implied, including, without
// limitation, the implied warranties or merchantability, fitness for a
// particular purpose, and noninfringment. The entire risk arising out of use
// of this software remains with you.
// cpu= At89S52,keilC51 compiler
/**********************************************************************************/
/**********************************************************************************/
#include "reg52.h" //晶振可以用11.0592MHZ,如果用串口的话
//提示:在调试程序的时候晶振用12MHZ
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "intrins.h"
/**********************************************************************************/
#define uchar unsigned char
#define uint unsigned int
#define Fclk 3686400
#define BitRate 19200
#define BRR (Fclk/(16*Bitrate))-1
#define timerdiv 1
#define timerval 256-(Fclk/timerdiv)/100000 // timeout each 10us
/**********************************************************************************/
uchar InitData[15];
uchar TXData[14];
uchar RXData[10];
uchar Temp;
uchar BitCnt;
uchar ByteCnt;
uchar Data1= 0xff;
bdata uchar tempi;
/**********************************************************************************/
sbit CLK1 =P1^7;
sbit CS =P1^5;
sbit Data =P3^2;
sbit CE =P1^1;
//sbit Clk2 =P1^5;
//sbit Dout2 =P1^6;
//sbit DR2 =P3^2;
sbit DR1 =P1^6;
sbit PWR_UP =P1^0;
sbit LED1 =P0^0;
sbit LED2 =P0^2;
sbit LED3 =P0^4;
sbit LED4 =P0^6;
/*sbit CLK1 =P2^0;
sbit CS =P2^2;
sbit Data =P2^3;
sbit CE =P2^4;
sbit Clk2 =P2^5;
sbit Dout2 =P2^6;
sbit DR2 =P3^2;
sbit DR1 =P3^3;
sbit PWR_UP =P3^5;
sbit LED1 =P0^4;
sbit LED2 =P0^5;
sbit LED3 =P0^6;
sbit LED4 =P0^7;
*/
sbit bflag =tempi^7;
/**********************************************************************************/
void init_io();
void nRF2401_ON();
void BuildInitWord();
void InitnRF2401();
void DoSPIClock();
void CE_High();
void RXEN_HIGH();
void TXEN_LOW();
void delay_n(uchar n);
void BuildShockWord(Data1);
void ShockBurst();
void CheckButtons();
void ReceiveShock();
void Inituart();
/*****************************************MAIN START ******************************/
/*****************************************MAIN START ******************************/
void main(void)
{
init_io(); //初始化51的I/O口
nRF2401_ON(); //给NRF2401上电,开启2401,PWR-up=1
delay_n(100);///jia////////
BuildInitWord(); //初始化120位状态字
InitnRF2401(); //送120位状态字到NRF2401
Inituart(); //单片机初始化计时器
CE_High(); //置CE为高
RXEN_HIGH(); //51单片机从NRF2401的DATA读出数据,NRF2401由配置方式转为激发方式
delay_n(100); //delay for LED light
P0=0xff; //close all LED
TXEN_LOW(); // set TX mode //51单片机向NRF2401写入数据
BuildShockWord(Data1);
ShockBurst();
delay_n(10); // delay for mode change
RXEN_HIGH();
while(1)
{
CheckButtons(); //check if the button is pressed
DR1=1;
if(DR1==1) // Check if DR1 is high (any received from nRF2401)
ReceiveShock();
}
}
/*************************************Rmain END *******************************/
/*************************************init_io START ******************************/
void init_io()
{
P0=0Xff;
P1=0x00;
P2=0xff;
P3=0xff;
P0=0xff;
/*
P0=0Xff;
P1=0xff;
P2=0x00;
P3=0xff;
P0=0x0f;
*/
}
/*************************************init_io END *******************************/
void Inituart(void)
{
TMOD = 0x20; //timer1 working mode 1
TL1 = 0xfd; //f7=9600 for 16mhz Fosc,and ...
TH1 = 0xfd; //...fd=19200 for 11.0592mhz Fosc
SCON = 0xd8; //uart mode 3,ren==1
PCON = 0x80; //smod=0
TR1 = 1; //start timer1
/* SCON=0x50; //模式1
TMOD=0x21; //定时模式2
IE=0x90;
//=====9600=======设置串口通讯寄存器
PCON=0x00; //波特率9600BPS,晶振11.0592MHZ
TH1=0xFD; //
TL1=0xFD; //计数器初值
TR1 = 1; //start timer1*/
}
/*************************************BuildSPIWord START****************************/
void BuildInitWord()
{
InitData[0]=0x50; //RX receiver 2, Datalength 80bit(10 byte)
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]=0xcc;
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)
}
/*************************************BuildSPIWord END******************************/
void TxData (uchar x)
{
SBUF=x;
while(TI==0);
TI=0;
}
/*************************************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 *******************************/
/*************************************TXEN_LOW START ******************************
void CE_Low()
{
CE=0;
}
*************************************CE_Low END ********************************/
/*************************************nRF2401_ON START******************************/
void nRF2401_ON()
{
PWR_UP=1;
}
/*************************************nRF2401_ON END *******************************/
/*************************************nRF2401_OFF START*****************************/
//void nRF2401_OFF()
//{
// PWR_UP=0; // Set Power_Up low
//}
/*************************************nRF2401_OFF 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 *******************************/
/*************************************delay_n START *****************************/
void delay_n(uchar n)
{
uchar x;
uchar y;
for(x=0;x<n;x++)
{
//for(y=0;y<100;y++)
for(y=0;y<130;y++)/////jia
_nop_();
}
}
/*************************************delay_n END *******************************/
/*************************************ShockBurst START *****************************/
void BuildShockWord(Data1)
{
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]=Data1; //MSB-4 ;Data byte 9
TXData[5]=0x02; //MSB-5 ;Data byte 8
TXData[6]=0x03; //MSB-6 ;Data byte 7
TXData[7]=0x04; //MSB-7 ;Data byte 6
TXData[8]=0x05; //MSB-8 ;Data byte 5
TXData[9]=0x06; //MSB-9 ;Data byte 4
TXData[10]=0x07; //MSB-10 ;Data byte 3
TXData[11]=0x08; //MSB-11 ;Data byte 2
TXData[12]=0x09; //MSB-12 ;Data byte 1
TXData[13]=0x10; //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<14;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 *************************************/
/************************************* CheckButtons START *******************************/
/*
void CheckButtons_jia()
{
uchar xx;
P0=0xff;
Temp=P0&0x0f; //read key value from port P0
if (Temp!=0x0f)
{
delay_n(10);
Temp=P0&0x0f; //read key value from port P0
if (Temp!=0x0f)
{
xx=Temp;
Temp=Temp<<4;
Data1=Temp; //put the button Data in dada package
P0=Data1; //Turn On the LED
TXEN_LOW(); //set TX mode
BuildShockWord(Data1);
ShockBurst();
TxData(xx);
delay_n(500);
P0=0xff; //close LED display
RXEN_HIGH();
while((P0&0x0f)!=0x0f);
}
}
}
*/
void CheckButtons()
{
uchar xx;
P0=0xff;
Temp=P0&0xaa; //read key value from port P0
if (Temp!=0xaa)
{
delay_n(10);
Temp=P0&0xaa; //read key value from port P0
if (Temp!=0xaa)
{
xx=Temp;
Temp=Temp>>1;
Data1=Temp; //put the button Data in dada package
P0=Data1; //Turn On the LED
TXEN_LOW(); //set TX mode
BuildShockWord(Data1);
ShockBurst();
TxData(xx);
delay_n(500);
P0=0xff; //close LED display
RXEN_HIGH();
while((P0&0xaa)!=0xaa);
}
}
}
/************************************* CheckButtons END *********************************/
/************************************* ReceiveShock START *******************************/
/*
void ReceiveShock_jia()
{
uchar xx;
Data=1; //Set Data tri state
Temp=0;
for (ByteCnt=0;ByteCnt<10;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;
if(DR1!=1) //check if DR1 is not still high
{
_nop_();
P0=RXData[0]; //Turn On the LED
xx=(RXData[0]>>4)&0x0f;
TxData(xx);
delay_n(500);
P0=0xff;
}
}
}
*/
void ReceiveShock()
{
uchar xx;
Data=1; //Set Data tri state
Temp=0;
for (ByteCnt=0;ByteCnt<10;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;
if(DR1!=1) //check if DR1 is not still high
{
_nop_();
P0=RXData[0]; //Turn On the LED
xx=RXData[0]<<1;//
TxData(xx);
delay_n(500);
P0=0xff;
}
}
}
/************************************* ReceiveShock END *********************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -