打印
[STC单片机]

(关于红外解码)请各位帮忙看红色部分程序的具体意思!

[复制链接]
2266|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 单片机学习123 于 2013-10-8 15:02 编辑

红色部分,通过irtime是怎样 具体 判断是0还是1,看不懂,求解!……
/*------------------------------------------------
                  定时器0中断处理
------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1
{
  irtime++;  //用于计数2个下降沿之间的时间
}
        ……
/*------------------------------------------------
                  外部中断0中断处理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
  static unsigned char  i;             //接收红外信号处理
  static bit startflag;                //是否开始处理标志位

if(startflag)                        
   {
    if(irtime<63&&irtime>=33)  //引导码 TC9012的头码,9ms+4.5ms
                        i=0;
      irdata=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
      irtime=0;
      i++;
       if(i==33)
         {
       irok=1;
     i=0;
      }
          }
    else
  {
  irtime=0;
  startflag=1;
  }

}
/*------------------------------------------------
                红外码值处理
------------------------------------------------*/
void Ircordpro(void)//红外码值处理函数
{
  unsigned char i, j, k;
  unsigned char cord,value;
  k=1;
  for(i=0;i<4;i++)      //处理4个字节
     {
      for(j=1;j<=8;j++) //处理1个字节8位
         {
          cord=irdata[k];
          if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
             value|=0x80;
          if(j<8)
      {
    value>>=1;
   }
           k++;
         }
     IRcord=value;
     value=0;     
     }
  irpro_ok=1;//处理完毕标志位置1
}

相关帖子

沙发
samsunghellome| | 2013-10-8 19:29 | 只看该作者
/*------------------------------------------------
    外部中断0中断处理,一个下降沿进入此中断一次
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
  static unsigned char  i;             //接收红外信号处理
  static bit startflag;                //是否开始处理标志位
if(startflag)                        
   {
    if(irtime<63&&irtime>=33)//256*33=8.4 256*63=16 引导码 TC9012的头码,9ms+4.5ms
             i=0;
                    irdata=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
                                                     //头码放在irdata[0]中,随后依次排列
                        irtime=0;//每进来一次,第一个下降沿相当于时间为0,第二次进来把时间给irdata[]
                    i++;
                            if(i==33)//1+32,头码、用户码、数据码传输完毕
                              {
                                   irok=1;
                                 i=0;
                                  }
   }
else
{
irtime=0;
startflag=1;
}

}

使用特权

评论回复
板凳
ZG11211| | 2013-10-8 20:59 | 只看该作者
本帖最后由 ZG11211 于 2013-10-8 21:06 编辑

每个下降沿的时间就决定了最后数据归类,看时间就知道它是码头还是数据,如果是长短合适的码头,计数器就清零,等待装入剩余的32个数据,总数量达到33个(接收到完整的一帧数据),就将后面的32个送去判断处理(0或1),得到4个8位数据。

使用特权

评论回复
地板
lostpod| | 2013-10-9 08:57 | 只看该作者
if(irtime<63&&irtime>=33)//256*33=8.4 256*63=16 引导码 TC9012的头码,9ms+4.5ms

我以前头码都是分开判断高低部分都验证

使用特权

评论回复
5
单片机学习123|  楼主 | 2013-10-9 09:15 | 只看该作者
我自己已经搞明白了,谢谢!

使用特权

评论回复
6
单片机学习123|  楼主 | 2013-10-9 09:16 | 只看该作者
lostpod 发表于 2013-10-9 08:57
if(irtime=33)//256*33=8.4 256*63=16 引导码 TC9012的头码,9ms+4.5ms

我以前头码都是分开判断高低部分都 ...

我自己已经搞明白了,谢谢!

使用特权

评论回复
7
单片机学习123|  楼主 | 2013-10-9 09:17 | 只看该作者
ZG11211 发表于 2013-10-8 20:59
每个下降沿的时间就决定了最后数据归类,看时间就知道它是码头还是数据,如果是长短合适的码头,计数器就清 ...

我自己已经搞明白了,谢谢提醒!

使用特权

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

本版积分规则

17

主题

134

帖子

0

粉丝