搜索
bottom↓
回复: 16

红外遥控解码程序RC5解码.已经测试通过.编译环境GCC.

[复制链接]

出0入0汤圆

发表于 2005-10-7 22:08:14 | 显示全部楼层 |阅读模式
工程见附件.

点击此处下载armok0176446.rar



/************************************************************

  *   Program:    AVRGCC - RC5 Test

  *   Comments:   RC5 decoder

  *   target mcu: 8515

  *   WEB: WWW.MCU123.COM

  ************************************************************/

#include <io.h>

#include <interrupt.h>

#include <signal.h>

#include "lcd.h"



unsigned int heartbeat=0;



// RC5 variables & definitions

#define PRSC1_SELECT 2                              // timer CLK/8

#define TRUE 1

#define FALSE 0

#define IRDet bit_is_set(PIND,PD2)

volatile unsigned char RC5RxAddress, RC5RxCommand;

volatile unsigned char RC5Avail=0, RC5Repeat, RC5PhaseErr;



void delay(unsigned int p)

{

  unsigned int i;

  unsigned char j;

  for(i=0;i<p;i++)

    for (j=0;j<100;j++);

}



/* signal handler for timer1 overflow interrupt */

SIGNAL(SIG_OVERFLOW1)

{

  static unsigned char RC5BitCnt=0;

  static unsigned int RC5Data;

  static unsigned char OldValue;

  static unsigned char ControlBit;



  // Load Timer again...

  outp(0xFC, TCNT1H);                  // set TCNT1  // 889us

  outp(0x87, TCNT1L);                  // set TCNT1



  if (RC5BitCnt==0) {

    RC5Data=0;

    OldValue=IRDet;

    RC5PhaseErr=FALSE;

  }



  if (RC5BitCnt<24) {                   // sample 24 bits

    if (RC5BitCnt & 0x01) {

      if (OldValue!=IRDet) {            // check for Biphase error

        RC5Data <<= 1;                  // next bit;

        if (IRDet) RC5Data &= 0xFFFE; else RC5Data |= 0x0001;

      } else RC5PhaseErr=TRUE;          // biphase error

    }

    RC5BitCnt++;

    OldValue=IRDet;                     // remember signal level



  } else {                              // if >24 then finish

    outp(0 , TCCR1B);                   // stop timer 1

    RC5BitCnt=0;                        // prepare for next time

    if (!RC5PhaseErr && !RC5Avail) {

      RC5Repeat=ControlBit==((RC5Data & 0x0800)==0x0800);   // if new controlbit=old then RC5Repeat=1

      ControlBit=((RC5Data & 0x0800)==0x0800);              // new controlbit

      RC5RxAddress=(unsigned char)((RC5Data & 0x07C0)>>6);

      RC5RxCommand=(unsigned char)(RC5Data & 0x003F);

      RC5Avail=TRUE;                                        // RC5 code is vailable...

    }

    RC5PhaseErr=FALSE;

    outp(0x40, GIMSK);

  }

}



/* signal handler for external interrupt int0 */

SIGNAL(SIG_INTERRUPT0)

{

  outp(0x00, GIMSK);                    // disable external int0

  outp(0xF3, TCNT1H);                   // set TCNT1 // 3111 us

  outp(0xD9, TCNT1L);                   // set TCNT1

  outp(PRSC1_SELECT, TCCR1B);           // start timer1

}



/* initialize RC5 decoder */

void RC5_init(void)

{

    cbi(DDRD,PD2);

    sbi(PORTD,PD2);



    outp((1<<ISC01), MCUCR);            // raise int0 on falling edge

    outp(0x40, GIMSK);                  // enable external int0



    outp(0x80, TIMSK);                  // enable timer1 Overflow interrupts

    outp(0x00, TCCR1A);                 // disable PWM and stuff

    outp(0x00, TCCR1B);

    outp(0xF3, TCNT1H);                 // set TCNT1 // 3111 us

    outp(0xD9, TCNT1L);                 // set TCNT1

}



/* main routine for testing */

int main(void)

{

    sei();                              // enable interrupts



    RC5_init();

    lcd_init();



    lcd_control(1,0,0);

    lcd_putstr("RC5 decoder");

    lcd_goto(0x49);

    lcd_putstr("PErr=");

    while(1)

    {

      lcd_goto(0x0E);

      printhex(heartbeat++);            // heart beat :)



      if (RC5Avail) {                   // display new RC5 data

        lcd_goto(0x40);

        printhex(RC5Repeat);

        lcd_putch(' ');

        printhex(RC5RxAddress);

        lcd_putch(' ');

        printhex(RC5RxCommand);

        RC5Avail=FALSE;                 // ready to get new one

      }

      lcd_goto(0x4E);

      printhex(RC5PhaseErr);            // error check

      delay(1000);

    }

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2005-10-7 22:21:17 | 显示全部楼层
o ,thanks ~!

收藏~!

出0入0汤圆

发表于 2005-10-8 12:05:45 | 显示全部楼层
good!收藏先!

出0入0汤圆

发表于 2005-10-8 17:20:01 | 显示全部楼层
盼望作者给出原理图和解码的思路!

出0入0汤圆

发表于 2006-9-20 12:29:56 | 显示全部楼层
good!收藏先!

出0入0汤圆

发表于 2006-11-21 11:18:21 | 显示全部楼层
哪位给个电路图?

出0入0汤圆

发表于 2006-11-26 21:34:07 | 显示全部楼层
好东西

出0入0汤圆

发表于 2007-2-8 09:35:07 | 显示全部楼层
GOOD

出0入0汤圆

发表于 2007-3-28 22:36:13 | 显示全部楼层
做个记号

出0入0汤圆

发表于 2007-3-28 23:30:45 | 显示全部楼层
我现在所接触到的遥控编码相当于只有两类。一种是以码宽来分的,另外一种是以跳变沿来分的。以前用51芯片做过一个同时接收两种遥控器的东西。

出0入42汤圆

发表于 2007-3-29 00:03:42 | 显示全部楼层
收藏先

出0入0汤圆

发表于 2007-3-29 09:54:28 | 显示全部楼层
谢谢。

出0入0汤圆

发表于 2007-5-19 20:48:27 | 显示全部楼层
谢谢。

出0入0汤圆

发表于 2007-5-20 20:21:58 | 显示全部楼层
3111us的TCNT1中断设置并不完善。设置成1333us比较好。因为不是所有的RC5起始位都是11。当数据码大于3FH时,起始位就是10。

不过仍要感谢LZ的解码思路。
-----此内容被newegg于2007-05-20,20:24:28编辑过

出0入0汤圆

发表于 2007-8-24 11:05:51 | 显示全部楼层

出0入0汤圆

发表于 2007-8-24 12:21:45 | 显示全部楼层
红外遥控编解码和无线电编解码有什么不一样吗?

出0入0汤圆

发表于 2007-8-24 22:01:20 | 显示全部楼层
红外遥控解码方便可靠。其实解码采用软件自动判断一下脉宽容错性会更好。红外遥控里面基本不会出现干扰信号,所以软件设计也非常方便。无线电编码主要就麻烦在干扰上,当无信号的时候,接收头会收到大量的针状干扰,会让单片机没时间去干别的事情。另外一般情况下无线电解码要丢弃第一个编码,因为那个受干扰往往不准。我采用的方式是,丢弃第一个,但由第一个产生一个检测同步启动标志。从第二个编码里面解出同步长度,通过同步来算出码宽。然后等待第三个代码开始真正解码,解码后保存,再等待第四个代码进行比较,只有比较相同才认为是真正的编码。这是我用软件解2262编码的方法。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-12 21:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表