找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3360|回复: 1
打印 上一主题 下一主题
收起左侧

[讨论]请大虾看看我的红外解码程序有什么错误啊

[复制链接]
跳转到指定楼层
楼主
ID:37810 发表于 2012-4-13 13:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

我的数码管位和断码都为低电平时才亮(有点儿特殊)

红外接收的头接到INT0引脚

#include<reg52.h>

uchar irtime;
uchar startflag;
uchar irdata[33];
uchar bitnum;
uchar irreceok;
uchar ircode[4];
//uchar irprosok;
uchar disp[8];

uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};


void delay_50ms(uint t)
{
 uint j;
 for(;t>0;t--)
  for(j=6245;j>0;j--);
}

void delay_50us(uint t)
{
 uchar j;
 for(;t>0;t--)
  for(j=19;j>0;j--);
 
}

void timer0init(void)
{
 TMOD=0x02;
 TH0=0;
 TL0=0;
 ET0=1;
 EA=1;
 TR0=1;
}

void int0init(void)
{
 IT0=1;
 EX0=1;
 EA=1;
}

void irpros(void)  //解码
{
 uchar k,i,j,value;
 k=1;
 for(j=0;j<4;j++)
 {
  for(i=0;i<8;i++)
  {
   value=value>>1;    //相当于7次
   if(irdata[k]>6)
   {       //8次
    value=value  | 0x80;
   }
   k++;
  }
  ircode[j]=value;
 }
 //irprosok=1;
}

void irwork(void)
{
 disp[0]=ircode[0]/16;
 disp[1]=ircode[0]%16;
 disp[2]=ircode[1]/16;
 disp[3]=ircode[1]%16;
 disp[4]=ircode[2]/16;
 disp[5]=ircode[2]%16;
 disp[6]=ircode[3]/16;
 disp[7]=ircode[4]%16;
}

void display(void)
{
 uchar i;
 for(i=0;i<8;i++)
 {
   P1=duan[disp];
   P2=wei;
   delay_50us(20);
 }
}

void main()
{
 timer0init();
 int0init();
 while(1)
 {
    if(irreceok)
    {
      irpros();
   irreceok=0;
    }
    //if(irprosok)
    //{
      irwork();
  // irprosok=0;
    //}
  display();

 }
}

void timer0() interrupt 1
{
 irtime++;    // 最大255,等自加到255,又变0
}

void int0() interrupt 0
{
  startflag=0;
 if(startflag)
 {
  if(irtime>32) //检测引导码
  {
   bitnum=0; 
  }
  irdata[bitnum++]=irtime;
  irtime=0;

  if(bitnum==33)
  {
   bitnum=0;
   irreceok=1;
  }
 }
 else
 {
  startflag=1;
  irtime=0;
 }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:39750 发表于 2012-5-5 16:19 | 只看该作者

我设计成功的红外解码程序,你对照一下吧。

 

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

unsigned char smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char smg_we[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};

uchar irtime;
uchar startflag;
uchar irdata[33];
uchar bitnum;
uchar irreceok;
uchar ircode[4];
uchar irprosok;
uchar disp[8];


void delay_50us(uint t)
{
    uchar j;
 for(;t>0;t--)
   for(j=19;j>0;j--);
}

void delay_50ms(uint t)
{
    uint j;
 for(;t>0;t--)
 for(j=6245;j>0;j--);
}

void timer0init(void)
{
  TMOD=0x02;
  TH0=0x00;
  TL0=0x00;
  ET0=1;
  EA=1;
  TR0=1;
  }

void int0init(void)
{
 IT0=1;
 EX0=1;
 EA=1;
}

void irwork(void)
{
   disp[0]=ircode[0]/16;
   disp[1]=ircode[0]%16;
   disp[2]=ircode[1]/16;
   disp[3]=ircode[1]%16;
   disp[4]=ircode[2]/16;
   disp[5]=ircode[2]%16;
   disp[6]=ircode[3]/16;
   disp[7]=ircode[3]%16;


}

void display(void)
{
    uchar i;
 for(i=0;i<8;i++)
 {
 P1=smg_we;
 P2=smg_du[disp];

 delay_50us(20);
 }
}


void irpros(void)
{
    uchar k,i,j;
 uchar value;
 k=1;
 for(j=0;j<4;j++)
 {
  for(i=0;i<8;i++)
  {
   value=value>>1;
     if(irdata[k]>6)
     {
      value=value|0x80;    
     }
     k++;
     }
     ircode[j]=value;
   }

   irprosok=1;

}

 

void main()
{
    timer0init();
 int0init();
 while(1)
 {
    if(irreceok)
    {
       irpros();
    irreceok=0;
  }
  if(irprosok)
  {
       irwork();
    irprosok=0;
  }
  display();
  
 }
}

void timer0 () interrupt 1
{
  irtime++;
}

void int0 () interrupt 0
{
    if(startflag)
 {
    if(irtime>32) //检测引导码
    {
    bitnum=0;

    }
    irdata[bitnum]=irtime;
    irtime=0;
    bitnum++;
    if(bitnum==33)
    {
      bitnum=0;
   irreceok=1;

    }


 }
 else
 {
     startflag=1;
  irtime=0;

 }

}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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