先展示我的硬件部分图片:
要求完成的功能:
1.两个模块和两个单片机相连,分别称为单片机A,单片机B
2.功能:单片机A上的两个按键控制单片机B上的P2口等四个灯的亮灭;单片机B上的两个按键控制单片机A上的P2口等四个灯的亮灭
代码如何实现呢,只要你对我之前的文章《
2.4G无线模块(NRF24L01)学习(1)——串口实现两个模块之间信息交互》学习完之后再来实现这个功能那就太简单了,简直就不值得下手的感觉,但我认为虽然简单,但为了学好这个NRF24L01模块还是值得的,只有这样才能逐步达到灵活使用模块。
代码如下:
【提示】这里的2401.h代码依然没有改动,因此这里就不涉及2401.h代码,直接使用。下面主要看两个主函数文件的代码如何实现的?
单片机A代码:
#include"2401.h"
#define uint unsigned int
#define uchar unsigned char
sbit KEY1=P3^5; //发送按键
sbit KEY2=P3^4; //发送按键
sbit beep=P1^7; //喇叭
sbit LED6=P1^6; //发送数据时显示灯+接收到数据后的功能实现灯
/*------------------------------------------------
延时函数
------------------------------------------------*/
void delay_ms(uint z) //延时函数
{
uint y;
while(z--)
for(y=110;y>0;y--);
}
/*------------------------------------------------
main函数
------------------------------------------------*/
void main()
{
uchar Tx_Buf1[]={1}; //发送的信息1
uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据
LED6=1; //初始灯6熄灭
init_NRF24L01(); //初始化24L01
while(NRF24L01_Check()) //检查不到24l01则报警
{
beep=0;
delay_ms(200);
beep=1;
delay_ms(200);
}
while(1)
{
RX_Mode(); //接收模式
while(!nRF24L01_RxPacket(Rx_Buf)) //等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式
{
if(KEY1==0) //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式
{
delay_ms(5);//消抖动
if(KEY1==0)
{
while(!KEY1);
Tx_Buf1[0]=1;
TX_Mode(); //发送模式
nRF24L01_TxPacket(Tx_Buf1); //发送命令数据
LED6=0;
delay_ms(300);
LED6=1;
delay_ms(300); //发送后LED6闪一下
break; //退出最近的循环,从而变回接收模式,这句关键
}
}
if(KEY2==0) //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式
{
delay_ms(5);//消抖动
if(KEY2==0)
{
while(!KEY2);
Tx_Buf1[0]=2;
TX_Mode(); //发送模式
nRF24L01_TxPacket(Tx_Buf1); //发送命令数据
LED6=0;
delay_ms(300);
LED6=1;
delay_ms(300); //发送后LED6闪一下
break; //退出最近的循环,从而变回接收模式,这句关键
}
}
}
switch(Rx_Buf[0]){//对数据进行分析来控制灯亮
case 1:
Rx_Buf[0]=0; //清空数据
P2=0X0F;
LED6=0;
delay_ms(300);
LED6=1;
delay_ms(300);
break;
case 2:
Rx_Buf[0]=0; //清空数据
P2=0XF0;
LED6=0;
delay_ms(300);
LED6=1;
delay_ms(300);
break;
default:
break;
}
}
}
单片机B的代码:
#include"2401.h"
#define uint unsigned int
#define uchar unsigned char
sbit KEY1=P3^5; //发送按键
sbit KEY2=P3^4; //发送按键
sbit beep=P1^7; //喇叭
sbit LED6=P1^6; //发送数据时显示灯
void delay_ms(uint z) //延时函数
{
uint y;
while(z--)
for(y=110;y>0;y--);
}
void main()
{
uchar Tx_Buf1[]={1}; //发送的信息1
uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据
init_NRF24L01();
LED6=1; //初始灯6熄灭
while(NRF24L01_Check()) //检查不到24l01则报警
{
beep=0;
delay_ms(200);
beep=1;
delay_ms(200);
}
while(1)
{
RX_Mode(); //接收模式
while(!nRF24L01_RxPacket(Rx_Buf)) //等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式
{
if(KEY1==0) //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式
{
delay_ms(5);//消抖动
if(KEY1==0)
{
while(!KEY1);
Tx_Buf1[0]=1;
TX_Mode(); //发送模式
nRF24L01_TxPacket(Tx_Buf1); //发送命令数据
LED6=0;
delay_ms(300);
LED6=1;
delay_ms(300); //发送后LED6闪一下
break; //退出最近的循环,从而变回接收模式,这句关键
}
}
if(KEY2==0) //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式
{
delay_ms(5);//消抖动
if(KEY2==0)
{
while(!KEY2);
Tx_Buf1[0]=2;
TX_Mode(); //发送模式
nRF24L01_TxPacket(Tx_Buf1); //发送命令数据
LED6=0;
delay_ms(300);
LED6=1;
delay_ms(300); //发送后LED6闪一下
break; //退出最近的循环,从而变回接收模式,这句关键
}
}
}
switch(Rx_Buf[0]){//对数据进行分析来控制灯亮
case 1:
Rx_Buf[0]=0; //清空数据
P2=0X0F;
LED6=0;
delay_ms(300);
LED6=1;
delay_ms(300);
break;
case 2:
Rx_Buf[0]=0; //清空数据
P2=0XF0;
LED6=0;
delay_ms(300);
LED6=1;
delay_ms(300);
break;
default:
break;
}
}
}
你会发现这两个代码基本一致,因为这两个代码中都有发送和接受的过程,而且实现是一样的效果。
效果展示: