×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-18 发布时间:
|

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


需要完成两个功能:


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


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

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

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


单片机中的代码如下:


#include

#include

#include

 

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,'',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] == ''))

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端和单片机通过红外模块的正常信息交互了,下次文章准备写一下,通过两个红外模块完成对电机的正反转操作。

关键字:红外通信模块  红外收发  交互信息

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址