回答

收藏

[求助] 红外解码程序,只能执行一次

51单片机 51单片机 2489 人阅读 | 0 人回复 | 2015-07-21

红外解码程序,只能执行一次,再按其它按键就没用了,请教
/*************************************************
引导码:9ms低电平,4.5ms高电平
频宽0.56ms周期1.12ms表示0
频宽1.68ms周期2.24ms表示1
晶振11.059MHz*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//sbit D=P2^6;
//sbit W=P2^7;
sbit IR=P3^2;//红外接口
uchar IR_OK=0,IRdata[4];
uint time_H,time_L;

//uchar table[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};        //0-9

void Init()
{
           TMOD=0x01;//0000 0001定时器T0工作方式1
        TH0=0x00;
        TL0=0x00;//定时器T0赋初值
        EX0=1;//INTO中断允许
        IT0=1;//INTO中断下降沿触发
        EA=1;//开启总中断
}

void main()
{
   Init();
   while(1)
   {
    if(IR_OK==1)
        {
       
       
     switch(IRdata[2])
         {
            case 0x0c1=0xfe;break;
            case 0x181=0xfd;break;
            case 0x5e1=0xfb;break;
                case 0x081=0xf7;break;
                case 0x1c1=0xef;break;
                case 0x5a1=0xdf;break;
            case 0x421=0xbf;break;
            case 0x521=0x7f;break;
                case 0x4a1=0x00;break;
                case 0x161=0xff;break;
                default:break;
         }
         IR_OK=0;
   }
}
}

/********************************************
9.5ms=8755,8.5ms=7833
5ms=5608,4ms=3686
0.5ms=460,0.7ms=645
1.5ms=1383,1.75ms=1612
********************************************/
void IR_INT0() interrupt 0
{
    uchar IR_tmp=0,i,j;
        EX0=0;//关闭INT0中断,只解析当前发过来的码
        TH0=0;
        TL0=0;
        TR0=1;
    while(IR==0);
        TR0=0;
        time_L=TH0*256+TL0;//计算引导码低电平时间

        TH0=0;
        TL0=0;
        TR0=1;
        while(IR==1);
        TR0=0;
        time_H=TH0*256+TL0;//计算引导码高电平时间
        if(time_L>7833&&time_L<8755&&time_H>3686&&time_H<5608)
        {
            for(i=0;i<4;i++)
                {
                   for(j=0;j<8;j++)
                   {
                       while(IR==0);//只检测高电平时间即可,滤掉低电平
                           TH0=0;
                           TL0=0;
                           TR0=1;
                           while(IR==1);
                           TR0=0;
                           time_H=TH0*256+TL0;
                           IR_tmp=IR_tmp>>1;
                           if(time_H>645&&time_H<1612)
                           {
                              IR_tmp|=0x80;
                           }
                   }
                   IRdata[i]=IR_tmp;
                }
           if(IRdata[2]!=~IRdata[3])
           {
              EX0=1;
                  return;
           }
           else
           {
              IR_OK=1;
                  EX0=1;
           }
        }
}


评分

参与人数 1与非币 +5 收起 理由
loveeeboard + 5 三周年铜板双倍!

查看全部评分

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条