51单片机学习之红外通信

红外通信

简单介绍

红外线遥控器已被广泛使用在各种类型的家电产品上,它的出现给使用电器提供了很多的便利。红外线系统一般由红外发射装置红外接收设备两大部分组成。红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。通常为了使信号更好的被发射端发送出去,经常会将二进制数据信号调制成为脉冲信号,通过红外发射管发射。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。

本次采用的是PPM。

数据格式

51单片机学习之红外通信
思想:利用中断系统,收到起始码就进入判断环节。

51单片机学习之红外通信

  • 用户码或数据码中的每一个位可以是位 ‘1’ ,也可以是位 ‘0’。区分 ‘0’和 ‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式,英文简写PPM。
    一般来说是取中间时间,1ms来判断0/1
    代码如下:
#include <REGX52.H>
typedef unsigned char uchar;
typedef unsigned int uint;

sbit io=P3^2;

void start()
{
	EA=1;
	EX0=1;
	IT0=1;
	io=1;
}
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};//显示0~F的值
uchar sj[3];
uchar date[4];
void delay(uint i)
{
	while(i--);	
}
void DigDisplay()
{
	uchar i;
	for(i=0;i<3;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;//显示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; break;//显示第1位
			case(2):
				LSA=0;LSB=1;LSC=0; break;//显示第2位
//			case(3):
//				LSA=1;LSB=1;LSC=0; break;//显示第3位
//			case(4):
//				LSA=0;LSB=0;LSC=1; break;//显示第4位
//			case(5):
//				LSA=1;LSB=0;LSC=1; break;//显示第5位
//			case(6):
//				LSA=0;LSB=1;LSC=1; break;//显示第6位
//			case(7):
//				LSA=1;LSB=1;LSC=1; break;//显示第7位	
		}
		P0=smgduan[sj[i]];//发送段码
		delay(100); //间隔一段时间扫描	
		P0=0x00;//消隐
	}
}
void sjproc()
{
	sj[0]=date[2]/16;
	sj[1]=date[2]%16;
	sj[2]=16;
}
void main()
{
	start();
	while(1)
	{
		sjproc();
		DigDisplay();	
	}
}
void int0() interrupt 0
{
	uchar i,j;
	uint time=0,err;
	delay(700);
	if(io==0)
	{
		err=1000;
		while(!io&&err)
		{
			delay(1);
			err--;
		}
		if(err==0)
		return;
		else  if(io==1)
		{
			err=500;
			while(io&&err)
			{
				delay(1);
				err--;
			}
			for(i=0;i<4;i++)
				for(j=0;j<8;j++)
				{
					err=56;
					while(!io&&err)
					{
						delay(1);
						err--;
					}
					err=300;
					while(io&&err)
					{
						delay(10);
						time++;
						err--;
						if(time>30)
						return ;
					}
					date[i]>>=1;
					if(time>10)
					date[i]=date[i]|0x80;


				}
				time=0;
		}
		if(date[2]!=~date[3])
		return ;
	}

}

上一篇:单片机外部中断实验


下一篇:确定opencv矩阵元素类型