欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    红外遥控解码原理(12页).doc

    • 资源ID:37367245       资源大小:173.50KB        全文页数:13页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    红外遥控解码原理(12页).doc

    -红外遥控解码原理-第 13 页红外线遥控器解码原理红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。1 红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。2 遥控发射器及其编码遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如图3所示。UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合的编码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在4563ms之间,图4为发射波形图。当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms18ms),高8位地址码(9ms18ms),8位数据码(9ms18ms)和这8位数据的反码(9ms18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。代码格式(以接收代码为准,接收代码与发射代码反向)位定义        单发代码格式     连发代码格式 注:代码宽度算法:16位地址码的最短宽度:1.12×16=18ms 16位地址码的最长宽度:2.24ms×16=36ms 易知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms)×8=27ms32位代码的宽度为(18ms+27ms)(36ms+27ms)1 解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。2 根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。如果邮购我们开发的51单片机试验板和扩展元件的网友,可以获得如上图所示的红外遥控手柄,这种遥控器的编码格式符合上面的描述规律,而且价格低廉,有32个按键,按键外形比较统一,如果用于批量开发,可以把遥控器上贴膜换成你需要的字符,这为开发产品提供了便利。接收器及解码一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。下面是一个对51实验板配套的红外线遥控器的解码程序,它可以把上图32键的红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。红外遥控器软件解码原理及程序             红外一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms高电平,2.25ms的低电平,跟着是一个短脉冲,本程序经过试用,能解大部分遥控器的编码!红外发送一开始发送一段13。5ms的引导码,引导码由9ms的高电平和4。5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2。25ms的低电平,跟着是一个短脉冲,本程序是免费给大家,版权所有,不得用于商业目的,如需用到本程序到商业上请与本人联系jiang_xi_sheng,经本人同意后方可用于商业目的,本程序经过试用,能解大部分遥控器的编码! #include    "at89x52.h"#define     NULL       0x00/数据无效#define     RESET      0X01/程序复位#define     REQUEST    0X02/请求信号#define     ACK        0x03/应答信号,在接收数据后发送ACK信号表示数据接收正确,也位请求信号的应答信号#define     NACK       0x04/应答信号,表示接收数据错误#define     BUSY       0x05/忙信号,表示正在忙#define     FREE       0x06/空闲信号,表示处于空闲状态#define     READ_IR    0x0b/读取红外#define     STORE_IR   0x0c/保存数据#define     READ_KEY   0x0d/读取键值#define     RECEIVE    0Xf400/接收缓冲开始地址#define     SEND       0xfa00/发送缓冲开始地址#define     IR         0x50/红外接收缓冲开始地址#define     HEAD       0xaa/数据帧头#define     TAIL       0x55/数据帧尾#define     SDA        P1_7#define     SCL        P1_6unsigned char xdata *buf1; /接受数据缓冲unsigned int buf1_length; /接收到的数据实际长度unsigned char xdata *buf2; /发送数据缓冲unsigned int buf2_length; /要发送的数据实际长度bit buf1_flag;    /接收标志,1表示接受到一个数据帧,0表示没有接受到数据帧或数据帧为空bit buf2_flag;    /发送标志,1表示需要发送或没发送完毕,0表示没有要发送的数据或发送完毕unsigned char state1,state2;         /用来标志接收字符的状态,state1用来表示接收状态,state2用来表示发送状态unsigned char data *ir;union    unsigned char a2;    unsigned int b;    unsigned char data *p12;    unsigned int data *p22;    unsigned char xdata *p3;    /红外缓冲的指针    unsigned int xdata *p4;p;/union                       / unsigned char a2;           / unsigned int b;/ unsigned char data *p12;/ unsigned int data *p22;/ unsigned char xdata *p3;/ unsigned int xdata *p4;       /地址指针/q;                        /union   unsigned char a2;   unsigned int b;count;union   unsigned char a2;   unsigned int b;temp;union   unsigned char a4;   unsigned int b2;   unsigned long c;ir_code;union   unsigned char a4;   unsigned int b2;   unsigned long c;   unsigned char data *p14;   unsigned int data *p24;   unsigned char xdata *p32;   unsigned int xdata *p42;i;unsigned char ir_key;bit ir_flag;        /红外接收标志,0为缓冲区空,1为接收成功,2为缓冲溢出void sub(void);void delay(void);void ie_0(void);void tf_0(void);void ie_1(void);void tf_1(void);void tf_2(void);void read_ir(void);void ir_jiema(void);void ir_init(void);void ir_exit(void);void store_ir(void);void read_key(void);void reset_iic(void);unsigned char read_byte_ack_iic(void);unsigned char read_byte_nack_iic(void);bit write_byte_iic(unsigned char a);void send_ack_iic(void);void send_nack_iic(void);bit receive_ack_iic(void);void start_iic(void);void stop_iic(void);void write_key_data(unsigned char a);unsigned int read_key_data(unsigned char a);void ie0(void)   interrupt 0ie_0();void tf0(void)   interrupt 1tf_0();void ie1(void)   interrupt 2ie_1();void tf1(void)   interrupt 3tf_1();tf_2();void tf2(void)   interrupt 5            /采用中断方式跟查询方式相结合的办法解码   EA=0;                                 /禁止中断   if(TF2)                              /判断是否是溢出还是电平变化产生的中断        TF2=0;                           /如果是溢出产生的中断则清除溢出位,重新开放中断退出        EA=1;        goto end;       EXF2=0;                               /清除电平变化产生的中断位   *ir=RCAP2H;                            /把捕捉的数保存起来   ir+;   *ir=RCAP2L;   *ir+;   F0=1;   TR0=1;                                 /开启计数器0loop:   TL0=0; /将计数器0重新置为零   TH0=0;   while(!EXF2)                         /查询等待EXF2变为1        if(TF0)goto exit;                /检查有没超时,如果超时则退出   ;   EXF2=0;                               /将EXF2清零   if(!TH0)                            /判断是否是长低电平脉冲过来了                                        /不是长低电平脉冲而是短低电平      if(F0)count.b+;                      /短脉冲数加一      temp.a0=RCAP2H;                  /将捕捉数临时存放起来      temp.a1=RCAP2L;      goto loop;                         /返回继续查询      else                                 /是低电平脉冲,则进行处理       F0=0;       *ir=temp.a0;       /把连续的短脉冲总时间记录下来       ir+;       *ir=temp.a1;       ir+;       *ir=RCAP2H;          /把长电平脉冲时间记录下来       ir+;       *ir=RCAP2L;       ir+;       if(ir>=0xda)                  goto exit;    /判断是否溢出缓冲,如果溢出则失败退出              goto loop;         /返回继续查询       exit:       ir_flag=1;       /置ir_flag为1表示接收成功end:       ;void rs232(void)   interrupt 4     static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2;      /sbuf1,sbuf2用来接收发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节     EA=0;                                         /禁止中断     if(RI)         RI=0;                                     /清除接收中断标志位         sbuf1=SBUF;                               /将接收缓冲的字符复制到sbuf1         if(sbuf1=HEAD)                                  /判断是否帧开头                         state1=10;                 /是则把state赋值为10                         buf1=RECEIVE;              /初始化接收地址                                          else         switch(state1)         case 10:sbuf2=sbuf1>>4;                   /把高半字节右移到的半字节                 sbuf2=sbuf2;                     /把低半字节取反                 if(sbuf2&0x0f)!=(sbuf1&0x0f)    /判断接收是否正确                                                  /接收错误,有可能接收的是数据帧尾,也有可能是接收错误                       if(sbuf1=TAIL)             /判断是否接收到数据帧尾                                                  /是接收到数据帧尾                                buf1=RECEIVE;      /初始化接收的地址                                if(*buf1=RESET)   /判断是否为复位命令                                                                             ES=0;                                        sbuf2=SP+1;                                        for(p.p10=SP-0x10;p.p10<=sbuf2;p.p10+)*p.p10=0;                                                                     state1=0;          /将接收状态标志置为零,接收下一个数据帧                                buf1_flag=1;       /置接收标志为1,表示已经接收到一个数据帧                                REN=0;             /禁止接收                                                   else                                                  /不是接受到数据帧尾,表明接收错误                               state1=0;           / 将接收状态标志置为零,重新接收                               buf1=RECEIVE;       /初始化发送的地址                               *buf1=NACK;         /把NACK信号存入接收缓冲里                               buf1_flag=1;        /置标志位为1,使主程序能对接收错误进行处理                               REN=0;              /禁止接收                                                                  else                                                  /接收正确                     rsbuf1=sbuf1;                /按位取反,使高半字节变原码                     rsbuf1&=0xf0;                 /仅保留高半字节,低半字节去掉                     state1=20;                    /将状态标志置为20,准备接收低半字节                                  break;         case 20:sbuf2=sbuf1>>4;                   /把高半字节右移到的半字节                 sbuf2=sbuf2;                     /将低半字节取反                 if(sbuf2&0x0f)!=(sbuf1&0x0f)    /判断接收是否正确                                                  /接受错误                        state1=0;                  / 将接收状态标志置为零,重新接收                        buf1=RECEIVE;              /初始化接收的地址                        *buf1=NACK;                /把NACK信号存入发送缓冲里                        buf1_flag=1;               /置标志位为1,使主程序能对接收错误进行处理                        REN=0;                     /禁止接收                                     else                                        sbuf1&=0x0f;                   /仅保留低半字节,去掉高半字节                    rsbuf1|=sbuf1;                 /高低半字节合并                    *buf1+=rsbuf1;                /将接收的数据保存至接收缓冲里,并且数据指针加一                    buf1_length+;                 /接收数据长度加一                    state1=10;                     /将state1置为10,准备接收下个字节的高半字节                                     break;                      else       TI=0;                                       /清除发送中断标志       if(buf2_length)                             /判断发送长度是否为零                                                  /发送长度不为零               if(state2=0)                       /判断是否发送高半字节                                                  /发送高半字节                       sbuf2=*buf2;                /将要发送的字节送到sbuf2                       rsbuf2=sbuf2;              /取反,使高半字节变为反码                       sbuf2>>=4;                  /将高半字节右移到低半字节                       rsbuf2&=0xf0;               /保留高半字节,去掉低半字节                       sbuf2&=0x0f;                /保留低半字节,去掉高半字节                       rsbuf2|=sbuf2;              /合并高低半字节                       SBUF=rsbuf2;                /发送出去                       state2=10;                  /将state2置为10准备发送下半字节                                    else                                                  /发送低半字节                       sbuf2=*buf2;                /将要发送的字节送到sbuf2                       buf2+;                     /指针加一                       buf2_length-;              /发送数据长度减一                       rsbuf2=sbuf2;              /取反,使低半字节变为反码                       rsbuf2<<=4;                 /将低半字节反码左移到高半字节                       rsbuf2&=0xf0;               /保留高半字节,去掉低半字节                       sbuf2&=0x0f;                /保留低半字节,去掉高半字节                       rsbuf2|=sbuf2;              /合并高低半字节                       SBUF=rsbuf2;                /发送出                       state2=0;                                              else                                                  /如果发送数据长度为零则发送数据帧尾                    if(buf2_flag)                 /判断是否发过数据帧尾                    SBUF=TAIL;                     /将数据帧尾发送出去                    while(TI=0);                    TI=0;                    buf2_flag=0;                   /置发送标志为零,表示发送完毕                                    EA=1;                                             /开放中断

    注意事项

    本文(红外遥控解码原理(12页).doc)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开