sn516952 发表于 2010-8-5 16:47:38

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

#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;
}


http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_573113.jpg
(原文件名:未命名1.jpg)

chen1986sl 发表于 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=IRCode>>1;
                                                        IRCode=IRCode|0x80;
                                                        delay1000us();        //延时1000us,结束高电平
                                                }
                                        else        //延时882us后,若P32为低电平,则为 位0
                                        {
                                                IRCode=IRCode>>1;
                                                IRCode=IRCode|0x00;
                                        }
                                }
                        }        //到这里已读完所有32位数据
                        if(IRCode=~IRCode)    //效验 数据和数据 反码
                                {
                                        RFDATA=IRCode;
                                }                                       
                }
        exit:
        EX0 = 1;       
}

chess01 发表于 2010-8-5 17:09:24

interrupt与0之间是有空格的

safan 发表于 2010-8-5 18:13:33

http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_573120.png
(原文件名:未命名图片.png)
fi??

sn516952 发表于 2010-8-5 18:48:25

太感谢了。原来就是这里出的问题。把这里加了空格后程序就通过了。。。说来见笑, 这个程序我想了好几天。。。就是找不到原因。

sn516952 发表于 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......
-----------------------------------------------------------------------

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

sn516952 发表于 2010-8-5 19:02:53

哪位朋友有完整的编译通过的解玛程序吗? 我这个还是不能用哦。虽然经过楼上各位的指点,编译是通过了。可是哪里还有问题。。。一加载,P1口灯全亮,遥控器按着没反应。

chenchuan 发表于 2010-8-5 21:31:35

软件和硬件需要配套的

eduhf_123 发表于 2010-8-5 21:55:05

“interrupt”和“0”之间要加空格、“fi”应该为“if”。

lyk07351 发表于 2010-8-7 21:04:15

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

jrcsh 发表于 2010-8-13 02:28:06

谢了楼上的 正好在找这东西玩一下

jrcsh 发表于 2010-8-18 05:06:26

向【9楼】 lyk07351 报告   红外信号 要接收的已经接收到   要丢出去的也丢出去了哈哈东西学到手了

liusoldier 发表于 2010-8-18 07:29:27

mark

sn516952 发表于 2010-8-27 18:11:51

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

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

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

yulri 发表于 2010-9-30 11:20:43

mark!!

yulri 发表于 2010-9-30 11:52:47

呵呵
一楼的程序只是解码过程,不是完整的程序,楼主!

sn516952 发表于 2010-10-2 14:32:34

回复【15楼】yulri
呵呵
一楼的程序只是解码过程,不是完整的程序,楼主!
-----------------------------------------------------------------------

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

biaoge 发表于 2010-10-13 21:39:49

路过

afei8856 发表于 2011-11-7 17:48:00

mark

depv 发表于 2012-10-22 15:24:51

Thanks for sharing!

huazhongwang 发表于 2013-3-24 17:58:56

果断 mark 一下

qq511153186 发表于 2013-4-29 20:14:09

好东西,正好要用,参考一下

qq511153186 发表于 2013-4-30 17:03:33

用到了GOTO要写什么头文件?

qq511153186 发表于 2013-4-30 17:09:24

chen1986sl 发表于 2010-8-5 17:07 static/image/common/back.gif
给你一个。。。。/。。。,
//************函数申明*********************
void delay882us(void);        //精确 ...

请问一下,用了GOTO语句,出现了红色字体的警告,报这个错undefined label,是怎么个一回事?
页: [1]
查看完整版本: 51红外解码程序 编译通不过,看不出原因.