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