打印

急求高手帮我看看这问题(红外解码)

[复制链接]
1581|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhang5805350|  楼主 | 2011-11-29 14:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#define uchar unsigned char
//sbit dula=P2^6;
//sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar f;
#define Imax 14000     
#define Imin 8000   
#define Inum1 1450   
#define Inum2 500
#define Inum3 3000
unsigned char Im[4];
uchar show[2];
unsigned long m,Tc;
unsigned char IrOK;
void delay(uchar i)
{
  uchar j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
void display()
{  
   P2=0xf8;
   //dula=0;
   P0=table[show[0]];
   //dula=1;
   //dula=0;
   
   //wela=0;
   
   //wela=1;
   //wela=0;
   delay(5);
   P2=0xf9;
   P0=table[show[1]];
   //dula=1;
   //dula=0;
   
   
   //wela=1;
  // wela=0;
   delay(5);
}
//外部中断解码程序
void intersvr1(void) interrupt 2 using 1
{
    Tc=TH0*256+TL0;                              
    TH0=0;
    TL0=0;            
   if((Tc>Imin)&&(Tc<Imax))
      {
      m=0;
        f=1;
     // return;
      }    //找到启始码
   if(f==1)
      {
        if(Tc>Inum1&&Tc<Inum3)
      {
       Im[m/8]=Im[m/8]>>1|0x80; m++;
       }
      if(Tc>Inum2&&Tc<Inum1)
         {
          Im[m/8]=Im[m/8]>>1; m++; //取码
         }
  if(m==32)
   {
         m=0;  
         f=0;
         if(Im[2]==~Im[3])
      {
           IrOK=1;
      }
        else IrOK=0;   //取码完成后判断读码是否正确
     }
               //准备读下一码
   }

}
/*演示主程序*/
void main(void)
{
    unsigned int  a;
   
     m=0;
    f=0;
   
  
    IT1=1;
    EX1=1;

  TMOD=0x01;  
  TH0=0;
  TL0=0;
  EA=1;
  //ET0=1;
   //??????
  TR0=1;     
   
while(1)
{

       if(IrOK==1)
  {
      show[1]=Im[2] & 0x0F;  //取键码的低四位
           show[0]=Im[2] >> 4;  
           IrOK=0;
     
  }
           for(a=100;a>0;a--)
          {
      display();
    }

}

}


该程序T0中断ET0一打开红外解码显示就变得很不稳定,只有把它屏蔽了才可正常显示。
       请问下着是什么原因???

相关帖子

沙发
hificwc| | 2011-11-29 20:30 | 只看该作者
是不是遥控没有按下的时候“显示就变得很不稳定”?

使用特权

评论回复
板凳
hificwc| | 2011-11-29 20:37 | 只看该作者
遥控没有按下的时候,T0一直记数,你开了T0中断后,它溢出后就中断,而你又没写T0的中断程序,它就跑飞了。要是开了T0中断后,就要加这句:
void timer0(void) interrupt 1
{
}让它中断后进来可以退出。
其时你不用开T0中断ET0的,你只是用来记遥控的高低电平的时间而已

使用特权

评论回复
地板
zhang5805350|  楼主 | 2011-11-30 16:54 | 只看该作者
恩,刚试了,加中断服务程序后果然正常了,太感谢啦!!!:)

使用特权

评论回复
5
zhang5805350|  楼主 | 2011-11-30 18:47 | 只看该作者
再请问下

在中断服务程序里当Tc加到满足 if((Tc>Imin)&&(Tc<Imax))时候,f置1,当进入 if(f==1)子程序时,Tc的值已经不能满足 if(Tc>Inum1&&Tc<Inum3) ,不能进入取码,这样此时程序怎么运行的???

使用特权

评论回复
6
hificwc| | 2011-11-30 20:14 | 只看该作者
退出了中断程序了

使用特权

评论回复
7
zhang5805350|  楼主 | 2011-12-1 12:25 | 只看该作者
它是找到起始码之后就退出中断了,然后后面的判断,Tc就重新计数了???

使用特权

评论回复
8
huzaizai007| | 2011-12-1 13:40 | 只看该作者
呃,你这程序跟我一开发板带的程序一模一样啊……

使用特权

评论回复
9
hificwc| | 2011-12-4 15:30 | 只看该作者
它是找到起始码之后就退出中断了,然后后面的判断,Tc就重新计数了???
zhang5805350 发表于 2011-12-1 12:25
TR0=1; Tc是一直记数的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

65

帖子

1

粉丝