NRF24L01+串口通信

#include
#include


//串口初始化
void UART_Init(void)
{
SCON = 0x50; //串口工作方式为1 , 串行允许接收
//SM0=0;
//SM1=1;
//REN=1;
TMOD = 0x20; //定时器1 工作在方式2
//PCON = 0x80; //SMOD = 1; 波特率加倍
TH1 = 0xfd; //波特率 9600bps fosc="11".0592MHz
TL1 = 0xfd;
ES = 1; //开串口中断
TR1 = 1; //允许定时器1工作
EA = 1; //开总中断
}
/*-------------------------------------------------------------*/
//串口发送一个字节
void Uart_SendChar( uchar dat)
{
SBUF = dat; //待发送的数据写入缓冲区
while(!TI); //等待发送完成
TI = 0; //清零发送标志位
}



/*-------------------------------------------------------------*/
//串口发送一个字符串
void Uart_SendString()
{
uchar i=0;
while(trdata[i]!=0x00)
{
SBUF=trdata[i];
while(!TI);
TI=0;
i++;
}
}




//************************************主函数************************************************************
void main(void)
{
uchar n=0;
// uchar j;
uchar m;

unsigned char tf =0;
// unsigned char TxBuf[32]={0,0,0,'a'}; //
// unsigned char RxBuf[32]={0};
UART_Init() ;
init_NRF24L01() ;
EA = 1; //开总中断
// EX0=1; //允许使用外中断
// IT0=1; //选择负跳变来触发外中断
TxBuf[1] = 1 ;
TxBuf[2] = 1 ;
// led1=0;
// x=0;
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
Delay(6000);

while(1)
{


//***********************************************************************************************
SetRX_Mode();
nRF24L01_RxPacket(RxBuf);
if( RxBuf[1]==1)
{
m=3;
while(RxBuf[m]!='\0')
{
Uart_SendChar(RxBuf[m]);
m++;



}

led1=0;
}
Delay(60);led1=1;
RxBuf[1] = 0x00;
RxBuf[2] = 0x00;
}

}
/**************************************************************
函数功能:外中断T0的中断服务程序
**************************************************************/
//void int0(void) interrupt 2 using 0 //外中断0的中断编号为0
//{
// uchar j;
// moshi=SPI_Read(CONFIG); // 读取状态寄存其来判断数据接收状况
// if(rx_tx==1) //接收模式
// {
//nRF24L01_RxPacket(RxBuf);


// led2=0;
// Delay(60);
// led2=1;

//
// }
// if(rx_tx==0)//fa送模式
// {
// led1 =0;
// Delay(60);
// led1=1;


// }
//EA=0;
// data1=SPI_Read(RD_RX_PLOAD);
// SPI_RW_Reg(WRITE_REG+STATUS,0x0e); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志


/* if(data1=='$')
{
i=0;
}


if(i<32)
{
RxBuf[i]= receive;

}

if(i==33)
{ //RxBuf[32]= '\0';
for(j=0;j<32;j++)
{

Uart_SendChar(RxBuf[j]); //让从计算机上传

到单片机的数据 , 传回的计算机显示
j++;
break;
}


}
led1=~led1; //每产生一次中断请求,P1取反一次。
Delay(10);
i++; */
// SPI_RW_Reg(WRITE_REG+STATUS,0x01);
// EA=1;

//}
/*-------------------------------------------------------------*/
//串口接收中断函数
void INT_UartRcv(void) interrupt 4
{
unsigned char tf =0;
uchar n=0;
// unsigned char TxBuf[32]={0,0,0,'a'}; //
unsigned char Rcv = 0;
// EA=1;
if(RI) //查询接收标志位(有数据发送过来时置为1)
{
//fsong=1;//发送标志位
RI = 0; //接收标志位清零
Rcv = SBUF; //存储缓冲区的数据
// TxBuf[3]= Rcv;
// nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
// P0=SBUF;
if(Rcv=='$')
{ i=3;
j=1;//计数标志
// jcun[i]='$';


}


if(Rcv=='*')
{
TxBuf[i]='*';
// TxBuf[31]='';
TxBuf[i+1]='\0';
j=0;
sman=1;//串口接受完成标志
fsong=1; //发送标志位
// x=i;
i=0;
}
if(j==1&&i<32)
{
TxBuf[i]=Rcv;
// i++;
if(i==31)

{
j=0;
}

}
i++;
// x=Rcv;
Uart_SendChar(Rcv); //让从计算机上传到单片机的数据 , 传回的计算机显示
//EA=1;
//////////////////////////////////////////////////////////////////////////////////////////
if(fsong==1)
{

//x++;
TxBuf[0] = 1; //判忙标志位
TxBuf[1] = 1 ; //接受标志位
tf = 1 ;// LED=0;
fsong=0;
}
if (tf==1)
{
//多一位

// TxBuf[3]=jcun[n];
// n++;
// TxBuf[4]=jcun[n];
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
// n++;
Delay(300);


//x=0;
TxBuf[0] =0;
TxBuf[1] =0;
// TxBuf[3] = 0; //还原
// TxBuf[4] = 0; //还原
nRF24L01_TxPacket(TxBuf); //清楚忙标志
Delay(300);
TxBuf[1] = 0x00;
TxBuf[2] = 0x00;
tf=0;
// TxBuf[3] = 0; //还原

Delay(60);//LED=1;
}
}
}


相关文档
最新文档