红外

来源:互联网 发布:张国荣 mj 知乎 编辑:程序博客网 时间:2024/04/28 23:57

它是一种电磁波,可以实现数据的无线传输

它的波长范围为760nm ~ 1mm,不为人眼所见

紫外光波长为10-400nm

红外与蓝牙
红外:对准、直接、0-10米,单对单
蓝牙:10米左右,加强信号后最高可达100米,可以绕弯,可以不对准,可以不在同一间房间,链接最大数目可达7个,同时区分硬件

红外线系统的组成
红外线系统一般由红外发射装置和红外接收设备两大部分组成

红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成

红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成

红外遥控器发射
红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的

红外发射

开发红外接收设备,一定要知道红外遥控器的编码方式和载波频率

红外线接收
大多都采用成品红外接收头。均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VOUT)

接收头

用时注意成品红外接收头的载波频率

数据格式
数据格式包括了引导码、用户码、数据码和数据码反码,编码总占32位

数据反码是数据码反相后的编码,编码时可用于对数据的纠错

数据格式

第二段的用户码也可以在遥控应用电路中被设置成第一段用户码的反码

位定义
用户码或数据码中的每一个位可以是位‘1’ ,也可以是位‘0’

区分‘0’和‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式

位定义

时间间隔取一个中间值(高电平时间1秒)

举例

sbit IRIN = P3 ^ 2;void IrInit(){    IT0 = 1; //下降沿触发    EX0 = 1; //打开中断0允许    EA = 1; //打开总中断    IRIN = 1; //初始化端口}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;        }    }           }