单片机/MCU论坛
直播中

Liqipeng

8年用户 264经验值
擅长:可编程逻辑 处理器/DSP
私信 关注
[问答]

关于单片机红外解码问题求教

我用51单片机尝试了红外解码,可以在1602上显示编码,但是有几个问题还是不能搞明白,希望大神们能够帮助一下:(1)在红外解码初始化的程序中:TR0=1;//开启了定时器。但是在外部中断函数里直接读取定时器的值作为起始码的时间,如果运行很长时间才按下按键,这个时候外部中断函数里得到的定时器时间根本就不是起始码的时间,怎么能判断是这个是起始码呢?

QQ截图20180302193510.png QQ截图20180302193452.png

(2)在运行过程中,发现一个问题:第一次按键需要按两次才能够正常工作,请问这是什么原因呢?

下面附上我的程序,希望大神们能够帮忙解答一下,不胜感激。(因为字符限制,就把1602显示函数给删了)
#include
#include
#include
#include


#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long




#define Imax  14000  //15.19 ms   
#define Imin  8000   //8.68  ms   
#define Inum1 1450   //1.57  ms         
#define Inum2 700    //0.75  ms
#define Inum3 3000   //3.25  ms


unsigned char Im[4]={0x00,0x00,0x00,0x00};


uchar INT0_Step;   
ulong m,Tc;
uchar IrOK;


uchar num;  
uchar a,b,c,d;


***it INT00 =P3^2;     
***it led0  =P1^0;
***it led1  =P1^1;
***it led2  =P1^2;
***it led3  =P1^3;
//LCD
sfr DBPort  = 0x80;
***it rs = P2^0;            
***it rw = P2^1;
***it en = P2^2;


uchar code table1[ ] = " Red    Control ";
uchar code table2[ ] = " IR-CODE: -----H";


void delay(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
     for(y=110;y>0;y--);
}



void lcd_display()
{
  lcd_init();
       
  lcd_wcmd(0x80);
       
  for(num=0;num<16;num++)
  {
  lcd_wdat(table1[num]);
        delay(5);
  }       


  lcd_wcmd(0xc0);
  for(num=0;num<16;num++)
  {
  lcd_wdat(table2[num]);
        delay(5);
  }


}

void Hongwai_INT0_SET()
{
        IT0=1;   
        EX0=1;  


        TMOD|=0x01;
        TH0=0;
        TL0=0;
        TR0=1;   
        EA=1;   
}




void display()
{
    switch(Im[2])
                        {
                                case 0x64:
                                {
                                          led0=0;       
                                          led1=1;
                                          led2=1;
                                          led3=1;
                                }
                                break;
                               
                                case 0x54:
                                {
                                          led0=1;       
                                          led1=0;
                                          led2=1;
                                          led3=1;       
                                }
                                break;
                               
                                case 0x74:
                                {
                                          led0=1;       
                                          led1=1;
                                          led2=0;
                                          led3=1;       
                                }
                                break;
                               
                                case 0x44:
                                {
                                          led0=1;       
                                          led1=1;
                                          led2=1;
                                          led3=0;       
                                }
                                break;
                        }


}
void intersvr1() interrupt 0
{
       
        Tc=TH0*256+TL0;
        TH0=0;
        TL0=0;         
       
        if(INT0_Step==0)
        {       
           if((Tc>Imin)&&(Tc
           {
                    m=0;
                    INT0_Step=1;
           }      
                else
                {
                INT0_Step=0;
                }
        }
if(INT0_Step==1)   
        {
                if(Tc>Inum1&&Tc
                {
                                Im[m/8]=Im[m/8]>>1|0x80;
                        m++;
                }
                else if(Tc>Inum2&&Tc
                {
                        Im[m/8]=Im[m/8]>>1;
                        m++;
                }
               
                if(m>=32)
                {
                        m=0;  
                        INT0_Step=0;
                        if(Im[2]==~Im[3])
                        {
                                IrOK=1;
                        }
                        else
                        {
                                IrOK=0;   
                        }
                }
        }
        else
        {
        INT0_Step=0;
        }
        if(IrOK)
                {
                        IrOK=0;
                       
                        a=Im[2]>>4;  
                        b=Im[2]&0x0F;                    
                        lcd_wcmd(0xca);
                        lcd_wdat(a+0x30);
                        lcd_wcmd(0xcb);
                        lcd_wdat(b+0x30);
                }
               
        display();               
}


void timer0_isr() interrupt 3       
{
       TH0=0;
        TL0=0;      
}
void main()
{
   INT0_Step=0;
        m=0;
        //Tc=0;
        led0=1;
        led1=1;
        led2=1;
        led3=1;
        lcd_display();
        delay(5);
        Hongwai_INT0_SET();
   delay(5);
       
                while (1);
       
       
}



已退回5积分

回帖(2)

Liqipeng

2018-3-3 09:40:51
麻烦大神们帮忙求解一下!谢谢啦。
举报

覃广明

2018-3-3 11:51:27
代码好长啊,看得眼花~~~~~~~~~~~~~~~~~~~~~
举报

更多回帖

发帖
×
20
完善资料,
赚取积分