打印

囧!红外解码有问题,向大家求救中。。。。。。

[复制链接]
2286|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
万山21|  楼主 | 2011-8-2 11:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
知道大家时间宝贵,我就只把确定有误的一小部分程序贴出来了,希望朋友们帮忙看下,找找是哪错了,我改两天了,真纠结!。。。。解码后读出来的数据为00000000或o8o9oaob(十六进制),而且按哪个键解出来的码都不变。希望大家给解下或者传点经验,谢了。。。。。
其中遥控器的芯片是6122的,接头是HS0038的。P3.3接红外接收头
void jiema2()              //解引导码后的32位编码
{       
        unsigned char i,j,temp;
        void chuli();
        temp=0;
        for(i=0;i<4;i++)
        {
        for(j=0;j<8;j++)
       
                {       
                        temp=temp>>1;
                        while(!P3_3);
                        delay(2);         //延时约0.84ms,时间是我用keil编译器得到了
                        if(P3_3==1)
                        {
                                temp=temp|0x80;
                                while(P3_3);
                        }
                        else temp=temp|0;
                       
                }
                dat[i]=temp;
        }
        if (dat[2]!=~dat[3])
        return;
        else
        chuli();

}

相关帖子

沙发
万山21|  楼主 | 2011-8-3 09:15 | 只看该作者
咋没人回呢?:(给帮忙看下嘛!

使用特权

评论回复
板凳
yewuyi| | 2011-8-3 09:39 | 只看该作者
请使用定时器计时,切勿使用delay(2); 这样的代码来做那个0.84MS的延迟,否则。。。。。。

使用特权

评论回复
地板
jrcsh| | 2011-8-3 11:51 | 只看该作者
另类方法

if(rf==1)
{
aaa=0;
   while (rf==1)
    {
     aaa++;
    }

rfcom[bbb]=aaa;
bbb++;
aaa=0;
while (rf==0)
    {
     aaa++;
    }

rfcom[bbb]=aaa;
bbb++;

}


还能在省下来一小半的代码

因为 只要采集高电平的时间就行了 低电平的时间可以扔了



在加点


晚上回来接着玩红外解码,发现这个遥控器发射的红外信号接收到后误码率挺高的
00000000001111111101111000100001254061  
10000000000111111110111100010000252123  
10000000000111111110111100010000252123  
10000000000111111110111100010000252123  
10000000000111111110111100010000252123  
00000000001111111101111000100001254061  
00000000001111111101111000100001254061  
00000000001111111101111000100001254061  
10000000000111111110111100010000252123  
00000000001111111101111000100001254061  
00000000001111111101111000100001254061  
10000000000111111110111100010000252123  
00000000001111111101111000100001254061  
00000000001111111101111000100001254061  
00000000001111111101111000100001254061  
00000000001111111101111000100001254061

还原成解出来的原始码后发现是 导前码部分处理得不理想,在前码部分也没什么作用~~~于是~~通通清除 ~~~这样就提升了解码的成功率

处理后

1111111101111000100001254061  
111111110111100010000252123  
111111110111100010000252123  
111111110111100010000252123  
111111110111100010000252123  
1111111101111000100001254061  
1111111101111000100001254061  
1111111101111000100001254061  
111111110111100010000252123  
1111111101111000100001254061  
1111111101111000100001254061  
111111110111100010000252123  
1111111101111000100001254061  
1111111101111000100001254061  
1111111101111000100001254061  
1111111101111000100001254061  
111111110111100010000252123  
111111110111100010000252123  
1111111101111000100001254061  
111111110111100010000252123  
1111111101111000100001254061


为了省点字节~~~我只好在同一个数组内 拼命移数据了
aaa=6;
bbb=0;
for(x;x;x)
{
if(aaa>3)//等待连续出现 多个1
{
if(数组[x]==1)
{
aaa--;
}
else
{
aaa++;
}
if(aaa==8)
{
aaa==7;
}
if(aaa==3)
{
数组[bbb]=数组[x]
bbb++;
}
}
}

好了 一个不定目前查找数据 在从新定位组合的思路就这样了

别人是在扔弃不完整的码~~~我是在修复。。。。

22000000001111111101111000100001   21111101111000101101111000100001163061  
20000000011111111011110001000011   21111101111000100011110001000011035030

在把尾巴裁一下就对上了

使用特权

评论回复
5
老鱼探戈| | 2011-8-3 14:01 | 只看该作者
这种原地等待的解码方式不可取,牺牲CPU资源。
可采用定时器计数,在有电平变化的时候保存计数值即可。

使用特权

评论回复
6
万山21|  楼主 | 2011-8-3 15:42 | 只看该作者
3# yewuyi
知道了!就需要有前辈跟我说声“这种方法不行”,虽然不知道原因吧,但这样我就可以不再这个错程序上“死循环”了,就可以另谋新出路了。但如果不难接受的话,我还是想知道是为什么不行,毕竟吃一堑得长一智嘛!

使用特权

评论回复
7
万山21|  楼主 | 2011-8-3 15:45 | 只看该作者
5# 老鱼探戈
能追问一句“为什么不行”么?当然你也可以说“这个你没必要知道”,如果不好理解的话。

使用特权

评论回复
8
万山21|  楼主 | 2011-8-3 15:46 | 只看该作者
4# jrcsh
:L 这是什么东东啊?

使用特权

评论回复
9
老鱼探戈| | 2011-8-3 15:49 | 只看该作者
TO 7L:
没有说不行,只是不可取。意思是说有比这跟好的解码方法。
因为:
延时等待影响其他函数的实时性。
如果一帧数据长度达到几十个ms,你不要等到几十个ms之后才能执行其他程序?

使用特权

评论回复
10
万山21|  楼主 | 2011-8-3 16:09 | 只看该作者
9# 老鱼探戈
ET0=1;
TMOD=0x01;
TH0=0;
TL0=0;
TR0=1;
while(!P3_3);
TR0=0;
temp1h=TH0;
temp1l=TL0;
。。。。。。
这个是用定时器。可中间while语句循环判断时不是也等于延时么?不也得等过多少毫秒后P3_3为高了才能解决其他函数么?想不通啊!

使用特权

评论回复
11
万山21|  楼主 | 2011-8-3 16:10 | 只看该作者
10# 万山21
或者说还有其他方法么?

使用特权

评论回复
12
caner_hn| | 2011-8-3 16:20 | 只看该作者
采用定时器+IO中断的程序
//  IR:
//  S:    H    =9.00ms:4.50ms           270
//  1:    HH+L)=0.56ms:2.25ms           45
//  0:    HH+L)=0.56ms:1.125ms          22

const UI08 POS2HEX[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

UI08 GnIRUC1=0;         //  用户码
UI08 GnIRUC2=0;         //  用户码
UI08 GnIRKC1=0;         //  按键码
UI08 GnIRKC2=0;         //  按键码
UI08 GnPOS=0;

UI08 GnIRKEY=KEY_NONE;
//   IO中断处理函数
void INT_PROC(void)
{
//  int im;
    UI08 nTime;
    nTime=GvTime4Cnt;           //  50us定时计数器
    GvTime4Cnt=0;
    if(nTime>100)
    {
        GnPOS=0;
        GnIRUC1=0;
        GnIRUC2=0;
        GnIRKC1=0;
        GnIRKC2=0;
    }
    else if(nTime>16)
    {
        if((GnPOS&0x18)==0x00)
        {
            GnIRUC1|=POS2HEX[GnPOS&0x07];
        }
        else if((GnPOS&0x18)==0x08)
        {
            GnIRUC2|=POS2HEX[GnPOS&0x07];
        }
        else if((GnPOS&0x18)==0x10)
        {
            GnIRKC1|=POS2HEX[GnPOS&0x07];
        }
        else if((GnPOS&0x18)==0x18)
        {
            GnIRKC2|=POS2HEX[GnPOS&0x07];
        }
        GnPOS++;
    }
    else
    {
        GnPOS++;
    }
    if(GnPOS==0x20)
    {
        if(GnIRUC1==0x40 && GnIRUC2==0xBF && (GnIRKC1^GnIRKC2)==0xFF)
        {
            GnIRKEY=GnIRKC1;
        }
        else
        {
            GnIRKEY=KEY_NONE;
        }
        GnPOS=0;
    }
}
//   定时中断处理函数
//   50us计数一次.
void TIMER_PROC (void)
{
    if(GvTime4Cnt<250)  GvTime4Cnt++;
}

使用特权

评论回复
13
万山21|  楼主 | 2011-8-3 16:34 | 只看该作者
12# caner_hn
:L 这是c语言么?

使用特权

评论回复
14
caner_hn| | 2011-8-5 12:35 | 只看该作者
那你认为是啥语言?

使用特权

评论回复
15
万山21|  楼主 | 2011-8-7 13:47 | 只看该作者
那我怎么看不懂啊?是不是c++?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

267

帖子

1

粉丝