打印

提问:有几处红外遥控程序语句不理解,请前辈们帮忙看看

[复制链接]
1424|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梦那些年|  楼主 | 2013-10-12 12:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

这条程序是在网上找的,经测试可以用,看了好久了,有几处不明白。

/*51单片机红外遥控解码程序*/
////用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
#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    //此处为晶振为11.0592时的取值,
#define Imin 8000    //如用其它频率的晶振时,
#define Inum1 1450    //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar show[2]={0,0};
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()
{
   dula=0;
   P0=table[show[0]];
   dula=1;
   dula=0;
   
   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[show[1]];
   dula=1;
   dula=0;
   
   P0=0xfd;
   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)
{   
m=0;
f=0;
EA=1;
IT0=1;
EX0=1;
TMOD=0x11;  
TH0=0;
TL0=0;
TR0=1;
ET0=1;
while(1)
{   
       if(IrOK==1)
  {
     show[1]=Im[2] & 0x0F;     //取键码的低四位
     show[0]=Im[2] >> 4;  
     IrOK=0;
     
  }
      
        
  display();
  
}
}

1:不知道
#define Imax 14000    //此处为晶振为11.0592时的取值,
#define Imin 8000    //如用其它频率的晶振时,
#define Inum1 1450    //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
这几个数是怎么计算来的
2:
      if(Tc>Inum1&&Tc<Inum3)
    {
     Im[m/8]=Im[m/8]>>1|0x80; m++;
       }
为什么 [m/8]这里面是8呢,是别的数为什么就不可以了?还有为什么还要>>1才|上0x80呢?

3:  if(m==32)
m==32;这条语句有什么用呢,是判断什么的?

新人在此先谢谢了

相关帖子

沙发
liang5319| | 2013-10-12 13:40 | 只看该作者
我没看懂你的程序,但是大致说一下
1、对于红外脉冲解码,为了精确计算时间,晶振需要12M的、、、
2、  你的问题3,因为他每接到一个数据就会把计数器加1,如果m=32了,说明,已经将红外数据接收完毕了,然后就可以讲数据解析了

那几个不太懂。。每深研究

使用特权

评论回复
板凳
梦那些年|  楼主 | 2013-10-12 14:03 | 只看该作者
liang5319 发表于 2013-10-12 13:40
我没看懂你的程序,但是大致说一下
1、对于红外脉冲解码,为了精确计算时间,晶振需要12M的、、、
2、  你 ...

恩,谢谢哥,我在看看

使用特权

评论回复
地板
liang5319| | 2013-10-12 17:40 | 只看该作者
我有写好的程序哦~

使用特权

评论回复
5
很忙| | 2013-10-12 18:02 | 只看该作者
liang5319 发表于 2013-10-12 13:40
我没看懂你的程序,但是大致说一下
1、对于红外脉冲解码,为了精确计算时间,晶振需要12M的、、、
2、  你 ...

晶振需要12M的这个有点牵强了。什么频率都可以,有些MCU是可以分频的。但是最好在选的时候主要一下,遥控的启动是先9MS后是一个4.5MS,所以你的时钟计数器的周期要计算好。

使用特权

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

本版积分规则

10

主题

88

帖子

0

粉丝