红外通信模块、NEC红外收发模块(2)——两个红外模块交互信息

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

上次文章写的是红外模块的是否正常验证,和基本功能的展示与掌握,本次要完成两个红外模块,借助单片机进行互相交互信息:

需要完成两个功能:

1.通过串口助手给单片机发送信息(这里要注意:我们使用两个红外模块,PC端一个,单片机端也接一个,实现远程传输信息),如果单片机收到信息,则实现P2口的LED灯进行闪烁

2.设置单片机按键,来模拟给PC发信息,然后在电脑上的串口助手进行显示,进行验证是否如单片机所要发的数据一致。

红外线模块1,它是与PC端连接的。

红外模块2,它是与单片机相连的。

单片机中的代码如下:

#include <reg52.h>
#include <string.h>
#include <stdio.h>

sbit EN  = P1^0;  //    电机输入输出1,2
sbit IN1 = P1^1;  //    输入1
sbit IN2 = P1^2;  //    输入2
sbit P32=P3^2;


char Recive_table[20]="";  //接收缓冲,最大20个字节
char Recive_state = 0;   //接收完成标志
void Uart_Init(void);
void ms_delay(int t);
void LED(void);

int main (void)
{ 
	/********************功能初始化***********************/
	Uart_Init();//串口初始化,波特率为9600
	ms_delay(1000) ;
	/****************************************************/
	/**********************主循环************************/
	while(1)
	{ 
		ms_delay(10) ;
		if(Recive_state == 1)
		{
			ES=0;  //清空接收标志位 
			if(Recive_table[0]==51)//接收到的字符串形式
			{
			    LED();
                LED();
                LED();
                LED();
                LED();
			}
			memset(Recive_table,'\0',20);
			Recive_state = 0;
			ES=1;  //打开接收标志位
		}
        if(0 == P32)    //  通过串口给手机发送字符串   wantin
        {
            ms_delay(400);
            if(0 == P32)
            {
                ES = 0;
            	TI = 1; 
            	//printf("%bd",0XA1);//printf("A1F11C2F33");
                SBUF= 0XA1;
                ms_delay(10);
                SBUF= 0XF1;
                ms_delay(10);
                SBUF= 0X1C;
                ms_delay(10);
                SBUF= 0X2F;
                ms_delay(10);
                SBUF= 0X33;
                ms_delay(10);
            	LED();
            	ms_delay(1000) ;
            	while(!TI);
            	TI = 0;
            	ES = 1;
            }
            while(0 == P32);
        } 
	}
	/****************************************************/
	  
}

/******************************************************************
函 数: void Uart_Interrupt() interrupt 4
功 能: 串口中断函数,将收到的字符存到Recive_table[]数组中
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Interrupt() interrupt 4         
{   
	static char i=0;  //因为是一位一位接收,所以用static
	if(RI==1)    
	{  
		ES = 0;
		RI=0;         
		Recive_table[i]=SBUF;        
		i++; 
		if((Recive_table[i] == '\0'))
		{ 
			i=0; 
			Recive_state = 1;
		}
		ES = 1;      
	}
	else
	TI = 0;     
} 

/******************************************************************
函 数: void Uart_Init(void)
功 能: 串口初始化,波特率为9600(这个不会,上网百度)
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Init(void)
{  
	TMOD=0x20;
	TH1=0xfD;
	TL1=0xfD;
	TR1=1;
	REN=1;
	SM0=0;
	SM1=1;
	EA=1;
	ES=1;
}

/******************************************************************
函 数: void ms_delay(int t)
功 能: 毫秒级延时
参 数: 无
返回值: 无
*******************************************************************/
void ms_delay(int t) 
{  
	int i,j; 
	for(i=t;i>0;i--)   
		for(j=110;j>0;j--); 
}

/******************************************************************
函 数: void LED(void)
功 能: 发送完命令后显示用的函数
参 数: 无
返回值: 无
*******************************************************************/
void LED(void)
{
	P2 = 0;
	ms_delay(1000);
	P2 = 0xff;
	ms_delay(1000);
}

这是我的完整代码,大家可以下载尝试。

代码中sbit P32=P3^2;是指按键,他与P32口相连

代码还可以读到,单片机想给PC传输的数据为:A1 F1 1C 2F 33,也就是说数据为1C 2F 33

现在来上电验证:

1.验证电脑向单片机发送数据:

        |-发送数据 A1 F1 1C 2F 33,因为代码是判断最后一个字节是否为0X33,如果是则让灯闪烁,如果不是则不闪烁。

发现等的确闪烁了,无法拍视频。

        |-如果我不发送数据 A1 F1 1C 2F 33,而是发送A1 F1 1C 2F 44,也就是使得最后一个字节部位0X33,验证是不是单片机上灯就不会闪烁了,验证开始。

灯是不能闪烁的。

2.验证单片机按键按一下能给电脑发送数据,数据为1C 2F 33,然后在串口上显示出来,验证开始。

   按一下按键,观看串口助手,如图:

发现数据接收正常,因此这里就完成了PC端和单片机通过红外模块的正常信息交互了,下次文章准备写一下,通过两个红外模块完成对电机的正反转操作。O(∩_∩)O哈哈~

猜你喜欢

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