请教两个51单片机利用NRF24L01无线模块进行无线通信发送数据的问题
时间:10-02
整理:3721RD
点击:
想用两个51单片机和NRF24L01模块实现无线通信,两个单片机一个做主机一个做从机,每个上面都连接无线模块。当按下主机上某按键时,会将对应的数据发送出去,比如按下主机键1则主机发送数据1,按下主机键2则主机发送数据2,从机一直处于接收模式,但是现在的实验现象却一直有问题,从机始终只能接收到第一次按键按下所发送的数据,以后再按按键,从机就收不到主机发来的数据,比如先按键1再按键2,从机就只能收到数据1,以后再按键从机也收不到任何数据;先按键2再按键1,从机就只能收到数据2,以后再按键从机也收不到任何数据。不知道是哪里出了问题。
主机程序
#include "NRF24L01.H"
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit LED1=P1^0;
sbit LED2=P1^1;
uchar keyscan() //按键函数
{
uchar temp;
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
temp=1;
}
}
if(key2==0)
{
delay_ms(10);
if(key2==0)
{
temp=2;
}
}
return temp;
}
void main()
{
uint flag=1,key;
CE = 0;
SCK = 0;
CSN = 1;
Serial_Init(); //初始化串口
while(1) //循环检测按键 并将对应数据发送出去
{
while(flag)
{
key=keyscan(); //检测按键,有按键按下则退出内循环执行后面的语句
if((key==1)|(key==2))
flag=0;
}
TX_Mode(); //发送模式,将数据发送出去
Delay(100);
if(key==1)
{
LED1=0;
Transmit(Tx_Buf1); //Tx_Buf1=0x01
Serial_SendString(Tx_Buf1);
}
if(key==2)
{
LED2=0;
Transmit(Tx_Buf2); //Tx_Buf2=0x02
Serial_SendString(Tx_Buf2);
}
while(CheckACK());
Delay(100);
LED1=1;
LED2=1;
flag=1; //flag置1,则可执行下一次按键检测操作
}
}
从机程序
#include "NRF24L01.H"
sbit LED=P1^0;
void main()
{
CE = 0;
SCK = 0;
CSN = 1;
Serial_Init(); //初始化串口
while( 1 )
{
RX_Mode(); //设置为接收模式,循环接收
Delay(100); //防止编译警告
if(nRF24L01_RxPacket(Rx_Buf1)) 如果接收到数据
{
LED=1;
Serial_SendString(Rx_Buf1); //就将数据显示在电脑上
}
else
LED=0;
}
}
主机程序
#include "NRF24L01.H"
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit LED1=P1^0;
sbit LED2=P1^1;
uchar keyscan() //按键函数
{
uchar temp;
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
temp=1;
}
}
if(key2==0)
{
delay_ms(10);
if(key2==0)
{
temp=2;
}
}
return temp;
}
void main()
{
uint flag=1,key;
CE = 0;
SCK = 0;
CSN = 1;
Serial_Init(); //初始化串口
while(1) //循环检测按键 并将对应数据发送出去
{
while(flag)
{
key=keyscan(); //检测按键,有按键按下则退出内循环执行后面的语句
if((key==1)|(key==2))
flag=0;
}
TX_Mode(); //发送模式,将数据发送出去
Delay(100);
if(key==1)
{
LED1=0;
Transmit(Tx_Buf1); //Tx_Buf1=0x01
Serial_SendString(Tx_Buf1);
}
if(key==2)
{
LED2=0;
Transmit(Tx_Buf2); //Tx_Buf2=0x02
Serial_SendString(Tx_Buf2);
}
while(CheckACK());
Delay(100);
LED1=1;
LED2=1;
flag=1; //flag置1,则可执行下一次按键检测操作
}
}
从机程序
#include "NRF24L01.H"
sbit LED=P1^0;
void main()
{
CE = 0;
SCK = 0;
CSN = 1;
Serial_Init(); //初始化串口
while( 1 )
{
RX_Mode(); //设置为接收模式,循环接收
Delay(100); //防止编译警告
if(nRF24L01_RxPacket(Rx_Buf1)) 如果接收到数据
{
LED=1;
Serial_SendString(Rx_Buf1); //就将数据显示在电脑上
}
else
LED=0;
}
}
正准备搞,发的程序不全吧
有沒有清除接收存儲器? 好像是叫接收存儲器吧,也可能叫數據緩存區