搜索
bottom↓
回复: 23

51红外解码程序 编译通不过,看不出原因.

[复制链接]

出0入0汤圆

发表于 2010-8-5 16:47:38 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_0()
uchar temp,numa,numb,flag,a,b,c;
sbit b0=B^0;

void delay(uchar x)
{
           uchar i,j;
           for(i=x;i>0;i--)
                     for(j=205;j>0;j--);
}
delay1()
{
       uchar i;
     for(i=75;i>0;i--);
}
void main()
{
      P0=0xff;
      P1=0x00;
      P2=0xff;
      P3=0xff;
      EA=1;
      IT0=1;
      EX0=1;

      while(1)
      {
           do{}
            while(flag==0);
            flag=0;
            P1=numa;
      }
}

void int0() interrupt0
{

      flag=1;
      EA=0;

      for(a=10;a>0;a--)
      {
            delay(2);
            fi(P3^2==1)
            goto out;
      }
      do{}
      while(P3^2==0);
      nop();
      delay(10);

      for(b=26;b>0;b--)
      {
            do{}
                  while(P3^2==0);
            delay(2);
            CY=P3^2;
            if(CY=1)
            {
                  delay(2);
                  delay1();
                  do{}
                        while(P3^2==1);
            }
            else{}
      }
      B=0;
      for(c=8;c>0;c--)
      {
            do{}
                  while(P3^2==0);
                  delay(2);
                  B<<=1;
                  b0=P3^2;
                  if(P3^2==1)
            {
                        delay(2);
                        delay1();
                        do{}
                        while(P3^2==1);

                  }
                  else{}
      }
      numa=B;
      B=0;

      for(c=8;c>0;c--)
      {
            do{}
                  while(P3^2==0);
                  delay(2);
                  B<<=1;
                  b0=P3^2;
                  if(P3^2==1)
                  {
                        delay(2);
                        delay1();
                        do{}
                              while(P3^2==1);
                  }
                  else{}
      }
      numb=B;
      B=0;

      temp=numa+numb;
      if(temp!=0xff)
      {
            numa=numb=0x00;
      }
      else{}
      out:nop();
      EA=1;
}



(原文件名:未命名1.jpg)

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-8-5 17:07:53 | 显示全部楼层
给你一个。。。。/。。。,
//************函数申明*********************
void delay882us(void);        //精确延时882us     7.3728m
void delay1000us(void);        //精确延时1000us
void delay520us(void);        //精确延时500us


void delay16(unsigned int i)
{
while(--i);
}
//******************************************
void delay882us(void)
{
delay16(458);
}
//******************************************
void delay1000us(void)
{
delay16(518);
}
//******************************************
void delay520us(void)
{
delay16(269);
}

//*************用到的I/O口定义**************

sbit P32=P3^2;        //INT0,红外信号输入



//*******************外部中断0 红外解码程序****************************************
decode(void) interrupt 0
{
        unsigned char count0,count1,count2;
        EX0 = 0; //外部中断0关闭
        for(count0=0;count0<10;count0++)        //起始码前9ms的低电平
                {
                        delay882us();
                        if(P32) goto exit;        //9ms没完就出来高电平则为干扰信号,跳出中断(退出解码)
                }
        if(!P32)        //低电平没完
                {
                        for(count0=0;count0<5;count0++)  //        连续5次 520US必须是1
                                {
                                        delay520us();
                                        if(!P32) goto exit;            // 2.5MS 内必须是1 否则就是连码 退出解码
                                }
                        delay520us();delay520us();delay520us();delay520us();        //9ms没结束再延时4740us,加上前面的8820us,已跳过起始码的13.5ms
                        for(count1=0;count1<4;count1++)        //开始读数据,4个字节,32位
                        {
                                for(count2=0;count2<8;count2++)        //每个字节8位
                                {
                                        while(!P32);        //等待高电平到来
                                        delay882us();
                                        if(P32)        //延时882us后,若P32还是高电平,则为 位1
                                                {
                                                        IRCode[count1]=IRCode[count1]>>1;
                                                        IRCode[count1]=IRCode[count1]|0x80;
                                                        delay1000us();        //延时1000us,结束高电平
                                                }
                                        else        //延时882us后,若P32为低电平,则为 位0
                                        {
                                                IRCode[count1]=IRCode[count1]>>1;
                                                IRCode[count1]=IRCode[count1]|0x00;
                                        }
                                }
                        }        //到这里已读完所有32位数据
                        if(IRCode[2]=~IRCode[3])    //效验 数据和数据 反码
                                {
                                        RFDATA=IRCode[2];
                                }                                         
                }
        exit:
        EX0 = 1;       
}

出0入0汤圆

发表于 2010-8-5 17:09:24 | 显示全部楼层
interrupt与0之间是有空格的

出0入0汤圆

发表于 2010-8-5 18:13:33 | 显示全部楼层

(原文件名:未命名图片.png)
fi??

出0入0汤圆

 楼主| 发表于 2010-8-5 18:48:25 | 显示全部楼层
太感谢了。原来就是这里出的问题。把这里加了空格后程序就通过了。。。说来见笑, 这个程序我想了好几天。。。就是找不到原因。

出0入0汤圆

 楼主| 发表于 2010-8-5 18:58:58 | 显示全部楼层
回复【1楼】chen1986sl 动感超人
-----------------------------------------------------------------------

回复【1楼】chen1986sl 动感超人
给你一个。。。。/。。。,
//************函数申明*********************
void delay882us(void); //精确延时882us     7.3728m
void delay1000us(void); //精确延时1000us
void delay520us(void); //精确延时500us
void delay16(unsigned int i)
{
while(--i);
}
//******************************************
void delay882us(void)
{
delay16(458);
}
//******************************************
void delay1000us(void)
{
delay16(51......
-----------------------------------------------------------------------

这个程序不完整啊,编译通不过,我加了头文件了,也不行。

出0入0汤圆

 楼主| 发表于 2010-8-5 19:02:53 | 显示全部楼层
哪位朋友有完整的编译通过的解玛程序吗? 我这个还是不能用哦。虽然经过楼上各位的指点,编译是通过了。可是哪里还有问题。。。一加载,P1口灯全亮,遥控器按着没反应。

出0入0汤圆

发表于 2010-8-5 21:31:35 | 显示全部楼层
软件和硬件需要配套的

出0入0汤圆

发表于 2010-8-5 21:55:05 | 显示全部楼层
“interrupt”和“0”之间要加空格、“fi”应该为“if”。

出0入0汤圆

发表于 2010-8-7 21:04:15 | 显示全部楼层
红外解码程序好像不是通用的吧,关键要看遥控发射是哪种编码方式,你可以找个通过不同的方式读出编码方式和编码规格,然后在根据编码类型的不同来解码。
我也在做红外的项目,解码的关键在于延时要精确。下面是我在咱们论坛和别的地方找到资料,希望对你有用!!!
这个读取波形的方法是很好,可是在后面的解码及从图片上读取码字的方式就有点不太赞同了,只想你能学会读取波形的方法行了。ourdev_573554.pdf(文件大小:472K) (原文件名:红外遥控编解码全攻略.pdf)
这个里面有不同编码芯片编码的方式及定义,后面还有解码程序,看看能学点解码的思路。ourdev_573555.pdf(文件大小:1.00M) (原文件名:红外接收.pdf)
这个是我参考别人的程序自己改了点,做的解码,希望对你有用!!!ourdev_573556.rar(文件大小:151K) (原文件名:UPD6121.rar)

出0入0汤圆

发表于 2010-8-13 02:28:06 | 显示全部楼层
谢了楼上的 正好在找这东西玩一下

出0入0汤圆

发表于 2010-8-18 05:06:26 | 显示全部楼层
向【9楼】 lyk07351 报告   红外信号 要接收的已经接收到   要丢出去的也丢出去了  哈哈  东西学到手了

出0入0汤圆

发表于 2010-8-18 07:29:27 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-8-27 18:11:51 | 显示全部楼层
回复【9楼】lyk07351
红外解码程序好像不是通用的吧,关键要看遥控发射是哪种编码方式,你可以找个通过不同的方式读出编码方式和编码规格,然后在根据编码类型的不同来解码。
我也在做红外的项目,解码的关键在于延时要精确。下面是我在咱们论坛和别的地方找到资料,希望对你有用!!!
这个读取波形的方法是很好,可是在后面的解码及从图片上读取码字的方式就有点不太赞同了,只想你能学会读取波形的方法行了。 (原文件名:红外遥控编解码全攻略.pdf)  
这个里面有不同编码芯片编码的方式及定义,后面还有解码程序,看看能学点解码的思路。 (原文件名:红外接收.pdf)  
这个是我参考别人的程序自己改了点,做的解码,希望对你有用!!! (原文件名:upd6121.rar)  

-----------------------------------------------------------------------

谢谢9楼的热心帮助.不过还是有点看不懂

出0入0汤圆

发表于 2010-9-30 11:20:43 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2010-9-30 11:52:47 | 显示全部楼层
呵呵
一楼的程序只是解码过程,不是完整的程序,楼主!

出0入0汤圆

 楼主| 发表于 2010-10-2 14:32:34 | 显示全部楼层
回复【15楼】yulri
呵呵
一楼的程序只是解码过程,不是完整的程序,楼主!
-----------------------------------------------------------------------

嗯。我现在懂了一些。不过还是没有真正的做出个解码的程序来,很失败。继续学习中。。。

出0入0汤圆

发表于 2010-10-13 21:39:49 | 显示全部楼层
路过

出0入0汤圆

发表于 2011-11-7 17:48:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-10-22 15:24:51 | 显示全部楼层
Thanks for sharing!

出0入0汤圆

发表于 2013-3-24 17:58:56 | 显示全部楼层
果断 mark 一下

出0入0汤圆

发表于 2013-4-29 20:14:09 | 显示全部楼层
好东西,正好要用,参考一下

出0入0汤圆

发表于 2013-4-30 17:03:33 | 显示全部楼层
用到了GOTO要写什么头文件?

出0入0汤圆

发表于 2013-4-30 17:09:24 | 显示全部楼层
chen1986sl 发表于 2010-8-5 17:07
给你一个。。。。/。。。,
//************函数申明*********************
void delay882us(void);        //精确 ...

请问一下,用了GOTO语句,出现了红色字体的警告,报这个错undefined label,是怎么个一回事?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 16:12

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

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