Bootstrap

51单片机——红外解码

目录

红外通讯

红外通讯简述

红外通讯特点

常用红外通讯的器件

红外通讯原理 

组成部分及作用

引导码

二进制逻辑 0 与逻辑 1的定义

逻辑0

逻辑1

红外解码硬件设计与程序设计

硬件设计

程序设计


红外通讯

红外通讯简述

  • 红外通讯可实现通讯双方近距离的无线可靠数据传输

红外通讯特点

  • 控制简单、接口简单、价格便宜、传输可靠、抗干扰能力强

常用红外通讯的器件

  • 光电计数器、红外光电开关、一体化接收头、发射管(透明)、接收管(黑色)

注:红外为不可见光,但是可以通过照相功能去观察其闪烁

红外通讯原理 

 

组成部分及作用

  • 发送端:将待发送的二进制信号编码调制为一系列的脉冲串信号(38k载波,通过其发送红外信号
  • 接收端:完成对红外信号的 接收、放大、检波、整形、解调出编码的脉冲

 注:发射与接受 是一对逆过程,即发射端原始端对应高电平,接收端输出就是低电平,反之亦然

引导码

发送端:9ms的高电平+4.5ms的低电平

接收端:9ms的低电平+4.5ms的高电平

二进制逻辑 0 与逻辑 1的定义

逻辑0

发送端:0.565ms的高电平+0.565ms的低电平

接收端:0.565ms的低电平+0.565ms的高电平

逻辑1

发送端:0.565ms的高电平+3*0.565ms(1.695ms)的低电平

接收端:0.565ms的低电平+3*0.565ms(1.695ms)的高电平

注:发射与接受 是一对逆过程,即发射端原始端对应高电平,接收端输出就是低电平,反之亦然

红外解码硬件设计与程序设计

硬件设计

 注:接收引脚直接与外部中断相连,即检测到上升沿或下降沿则进入外部中断

程序设计

低电平检测

u16 getLowTime()//获取低电平时间9ms
{
	TH1 = 0;//计数器清零
	TL1 = 0;
	TR1 =1 ;//开始计时
	while(IRIN == 0)//等待置1
	{
		if(TH1>0x40) //9000us/1.085us=8294个 换算为十六进制 为 0x2066*2=0x40cc 最长等待时间18ms
		{break;}
	}
	TR1 =0; //停止计时
	return (TH1*256+TL1);//返回时间
}

高电平检测

u16 getHightTime()//获取高电平时间4.5ms
{
	TH1 = 0;//计数器清零
	TL1 = 0;
	TR1 =1 ;//开始计时
	while(IRIN == 1)//等待置0
	{
		if(TH1>0x20) //4500us/1.085us=8294/2个 换算为十六进制 为 0x2066*2=0x40cc 最长等待时间9ms
		{break;}
	}
	TR1 =0; //停止计时
	return (TH1*256+TL1);//返回时间
}

外部中断解码

void EXT_INT0_Isr() interrupt 0//解码
{
	u16 time;
	u8 bit_data;
	time = getLowTime();//如果返回值在 8.5ms/1.085=7834 到 9.5ms/1.085=8755 都可
	if(time < 7834 || time >8755)
	{
		EA=0;//退出外部中断
		return;
	}
	
	time = getHightTime(); //4ms~5ms 4000/1.085=3686 5000/1.085=4608
	if(time < 3686 || time >4608)
	{
		EA=0;//退出外部中断
		return;
	}
	
	for(i=0;i<4;i++)//4位
	{
		for(j=0;j<8;j++)//8bit
		{
			time = getLowTime();
			if(time < 322 || time >645) //350us~700us
			{
				EA=0;//退出外部中断
				return;
			}
			
			time = getHightTime;
			if(time > 322 && time <645) //350us~700us
			{
				bit_data = bit_data<<1;//左移一位,接收时先接收最高位
				bit_data = bit_data | 0x00;
			}
			else if (time > 1198 && time <1658) //1.3~1.8
			{
				bit_data = bit_data<<1;//左移一位
				bit_data = bit_data | 0x01;
			}
			else
			{
				EA=0;//退出外部中断
				return;
			}
			
			
		}
		IRcode[i]=bit_data;//保存解码值
	}
}

注:实际应用时只需判断 IRcode[2]键值码,来执行要执行的程序

;