搜索
bottom↓
回复: 7

最近想做一个红外遥控解码的程序

[复制链接]

出0入0汤圆

发表于 2008-3-1 16:43:38 | 显示全部楼层 |阅读模式
我刚刚入门的AVR,最近想做一个红外遥控解码的程序,用红外逻辑分析仪测出的波形(附件),看不出来是什么编码,也没有思路,不知道有哪位有经验的高手可否指点一下,谢谢!1

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2008-3-1 17:50:19 | 显示全部楼层
晚上找个时间,把以前用51做的解码程序给你贴上来,用于产品了。

出0入0汤圆

发表于 2008-3-1 19:50:52 | 显示全部楼层
呵呵,在这里找到的,测试过可以用,
c文件
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>

#include "chuankou.h"

/*------宏定义------*/
#define uchar        unsigned char
#define uint        unsigned int
#define BIT(x)        (1<<(x)) s
#define NOP()        asm("nop")
#define WDR()         asm("wdr")

//一般说来,volatile用在如下的几个地方:
//1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
//2、多任务环境下各任务间共享的标志应该加volatile;
//3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
volatile uint data0;           //前16个脉冲存放地址
volatile uint data1;           //后16个脉冲存放地址
volatile uint Flag=0;          //接收完成一帧标志位
volatile float oldFall=0,newFall=0;  //时间的先后纪录
volatile uint bitcnt=0;        //脉冲个数纪录

//端口初始化
void port_init(void)
{
        PORTD |= (1<<6);
        DDRD  = 0x00;
}

//定时T1初始化
//系统时钟为8M内频,64分频,最大定时时长524.228MS
void timer1_init(void)
{
        TCCR1B = 0x00;//停止定时器
        TIMSK |= 0x20;//中断允许
        ICR1H  = 0xFF;
        ICR1L  = 0xFF;//输入捕捉匹配值
        TCCR1A = 0x00;
        TCCR1B = 0x83;//启动定时器
}


void init_devices(void)
{
        cli(); //禁止所有中断
        MCUCR  = 0x00;
        MCUCSR = 0x80;//禁止JTAG
        GICR   = 0x00;
        port_init();
        timer1_init();
        sei();//开全局中断
}
//主函数
int main(void)
{
        init_devices(); //端口初始化
        uart_init();    //串口初始化  
        //在这继续添加你的代码
        while(1)
        {
                if(0)
            {
              Flag=0;  //清除标志位
                  bitcnt=0;   //计数标志位清0
                  _delay_ms(5);
                  put_char((uchar)((data0&0xff00)>>8));//机器码
                  _delay_ms(5);
                  put_char((uchar)(data0&0x00ff));//机器反码
                  _delay_ms(5);
                  put_char((uchar)((data1&0xff00)>>8));//用户码
                  _delay_ms(5);
                  put_char((uchar)(data1&0x00ff));//用户反码
                  _delay_ms(5);
            }
        }
        return 0;
}


//数据头的时间:Th=9+4.5=13.5ms
//数据“0”的时间:T0=0.565+0.56=1.125ms
//数据“1”的时间:T1=1.685+0.56=2.245ms
//定时器T1输入捕捉中断服务程序
//#pragma interrupt_handler timer1_capt_isr:6
//void timer1_capt_isr(void)
SIGNAL(SIG_INPUT_CAPTURE1)
{
   //  
        //timer 1 input capture event, read (int)value in ICR1 using;
        // value=ICR1L;            //Read low byte first (important)
        // value|=(int)ICR1H << 8; //Read high byte and shift into top byte
        // TIFR|=BIT(ICF1);//软件写1清中断标志
        float time=0;
        unsigned int temp=0;
        newFall=ICR1;         //读取当前时间
        time=newFall-oldFall; //计算脉冲加间隔的时间
                put_char(time);
        oldFall=newFall;      //存放上一次的时间
        if(time<0)  time=newFall-oldFall+0xffff;  //定时周期交叉的情况
    temp=(unsigned int)time; //取整
        //T0的8分频,即(1.125*1000)/8 = 140.625us ;正负20宽范围判断
        if((temp>160) && (temp<205)) // "0"信号
        {
            temp=0;
        }
        //T1的8分频为280.625us
        else if((temp>330) && (temp<420)) //“1”信号
        {
            temp=1;
        }
        //Th的8分频为1687.5us
        else if((temp>2120) && (temp<2170)) //header头信号
        {
            bitcnt=0;
                data0=0;
                data1=0;
                return; //返回,等待下次开始接收
        }
        else //干扰信号
        {
            bitcnt=0;
                data0=0;
                data1=0;
            return;
        }
        bitcnt++;
        if(bitcnt<16) //开始接收前16位
        {
            data0=data0|temp;
                data0=data0<<1;
        }
        else if(bitcnt==16)
        {
            data0=data0|temp;
        }
        else if(bitcnt<32) //开始接收后16位
        {
            data1=data1|temp;
            data1=data1<<1;
        }
        else if(bitcnt==32) //接收完最后一位
        {
           data1=data1|temp;
           Flag=1;       //接收完一帧,标志位置1
        }
}



头文件

/*头文件中的串口通讯子程序chuankou.h*/
#include <avr/io.h>

#define fosc 11059200
#define baud 9600

/*字符串输出函数*/  
void put_char(unsigned char c)  
{           
       while (!(UCSRA&(1<<UDRE)));  
       UDR=c;      
}  

/*字符输入函数*/         
unsigned char getchar(void)  
{  
       while(!(UCSRA& (1<<RXC)));  
       return UDR;  
}  

/*字符串输出函数*/  
void put_s(unsigned char *s)  
{
      while (*s)  
      {  
           put_char(*s);  
           s++;  
       }         
       // put_char(0x0a);//回车换行  
       // put_char(0x0d);  
               
}

/*UART初始化*/         
void uart_init(void)  
{  
       UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收  
       UBRRL=(fosc/16/baud-1)%256;  
       UBRRH=(fosc/16/baud-1)/256;  
       UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位  
}

出0入0汤圆

发表于 2008-3-1 21:28:03 | 显示全部楼层
网上有一个“红外逻辑分析仪V3.30”简易版的,有编码分析功能!你可以试试!

出0入0汤圆

发表于 2008-3-2 22:05:55 | 显示全部楼层
你试这个吧,我自己做了一个感觉顶好用的
点击此处下载ourdev_223116.rar(文件大小:140K)

出0入0汤圆

 楼主| 发表于 2008-3-4 21:30:57 | 显示全部楼层
谢谢热情的兄弟们,
今天开始有进展了,已经正常解码,非常感谢!

出0入0汤圆

发表于 2008-4-10 19:20:04 | 显示全部楼层
不错,谢谢

出0入0汤圆

发表于 2008-4-10 20:51:12 | 显示全部楼层
还不如看看我的帖子,看如何解码,使用EXCEL解码即可,保证比你看波形快。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 20:36

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

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