2.4G无线模块(NRF24L01)学习(2)——单片机互相控制LED灯

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XiaoCaiDaYong/article/details/84289810

先展示我的硬件部分图片:

要求完成的功能:

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;
		}	 	
	}
}

你会发现这两个代码基本一致,因为这两个代码中都有发送和接受的过程,而且实现是一样的效果。

效果展示:

猜你喜欢

转载自blog.csdn.net/XiaoCaiDaYong/article/details/84289810