红外发光二极管。它实际上是一只特殊的发光二极管
编码方式
二进制脉冲码的形式有多种,其中最为常用的是PWM码(脉冲宽度调制码)和PPM码(脉冲位置调制码,脉冲串之间的时间间隔来实现信号调制)。
数据格式
- 数据格式包括了引导码、用户码、数据码和数据码反码,编码总占32位。数据反码是数据码反相后的编码,编码时可用于对数据的纠错。
传输位定义
- 用户码或数据码中的每一个位可以是位 ‘1’ ,也可以是位 ‘0’。区分 ‘0’和 ‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式,英文简写PPM
传输过程,注意有上拉电阻,即输出端口默认为高电平
附上代码
/*************************************************************************************** 红外通信实验 *实现现象: 具体接线操作请参考视频 下载程序后,数码管显示红外遥控键值数据注意事项: 红外遥控模块的短接片J1短接, 红外遥控器内的电池绝缘片一定要抽掉 ***************************************************************************************/#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit IRIN=P3^2;u8 IrValue[6];u8 Time;u8 DisplayData[8];u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码/******************************************************************************** 函 数 名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us*******************************************************************************/void delay(u16 i){ while(i--); }/******************************************************************************** 函数名 :DigDisplay()* 函数功能 :数码管显示函数* 输入 : 无* 输出 : 无*******************************************************************************/void DigDisplay(){ u8 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位 } P0=DisplayData[i];//发送数据 delay(100); //间隔一段时间扫描 P0=0x00;//消隐 } }/******************************************************************************** 函数名 : IrInit()* 函数功能 : 初始化红外线接收* 输入 : 无* 输出 : 无*******************************************************************************/void IrInit(){ IT0=1;//下降沿触发 EX0=1;//打开中断0允许 EA=1; //打开总中断 IRIN=1;//初始化端口}/******************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/void main(){ IrInit(); while(1) { DisplayData[0] = smgduan[IrValue[2]/16]; DisplayData[1] = smgduan[IrValue[2]%16]; DisplayData[2] = smgduan[16]; DigDisplay(); } }/******************************************************************************** 函数名 : ReadIr()* 函数功能 : 读取红外数值的中断函数* 输入 : 无* 输出 : 无*******************************************************************************/void ReadIr() interrupt 0{ u8 j,k; u16 err; Time=0; delay(700); //7ms if(IRIN==0) //确认是否真的接收到正确的信号 { err=1000; //1000*10us=10ms,超过说明接收到错误的信号 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时 侯,程序死在这里*/ while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去 { delay(1); err--; } if(IRIN==1) //如果正确等到9ms低电平 { err=500; while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去 { delay(1); err--; } for(k=0;k<4;k++) //共有4组数据 { for(j=0;j<8;j++) //接收一组数据 { err=60; while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去 { delay(1); err--; } err=500; while((IRIN==1)&&(err>0)) //计算高电平的时间长度。 { delay(10); //0.1ms Time++; err--; if(Time>30) { return; } } IrValue[k]>>=1; //k表示第几组数据 if(Time>=8) //如果高电平出现大于565us,那么是1 { IrValue[k]|=0x80; } Time=0; //用完时间要重新赋值 } } } if(IrValue[2]!=~IrValue[3]) { return; } } }