首页->【AVR从入门到精通】

2053 19

1384199214546.rar

/***********************************************
             主程序函数
***********************************************/
int main(void)           

  init_devices();
  while(1)
  {
    if(flag==0)      //接收完成标志为0  表示没收到
    {
      PORTA=0x0a;
    }
    if(flag==1)     //接收完成标志置1  接收成功
    {
      PORTA=addr[2];   //把接收到值显示在LED上
    }
  }
}
/*当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,
这108ms发射代码由一个低电平引导码(9ms),一个高电平结果码(4.5ms),
低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)
和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,接下
来发射的代码(连发码)将仅由起始码(9ms)和结束码(2.25ms)组成。 */
/***********************************************
             外中断0服务程序
***********************************************/
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
  uchar i,j,k = 0;
  flag=1;
  GICR = 0x00;                       //禁止外部中断   关闭外部中断,开始接受数据
  addr[0]=0;
  addr[1]=0;
  addr[2]=0;
  addr[3]=0;                         //全部数据清零
  for(i = 0;i < 18;i++)              //低电平引导码9ms
  {
 delay_nus(480);
 if(PIND & (1 << PD2))            //9MS内有高电平,则判断为干扰,退出处理程序
 {
   GICR |= (1 << INT0);           //使能外部中断4
   return;                        //返回主函数
 }
  }
  while(!(PIND & (1 << PD2)));       //等待9ms低电平过去
  while(PIND & (1 << PD2));          //等待4.5ms高电平过去
  for(i = 0;i < 4;i++)               //32位二进制码
  {
    for(j = 0;j < 8;j++)             //8位二进制码
 {
      while(!(PIND & (1 << PD2)));   //等待变高电平,因为主要是判断高电平的长度
   while(PIND & (1 << PD2))       //计算高电平时间
   {
     delay_nus(100);              //0.1ms
  k++;                         //计算有多少个0.1ms
  if(k >= 30)                  //高电平时间过长,则退出处理程序
  {
    GICR |= (1 << INT0);       //使能外部中断
    return;                    //返回主函数
  } 
   }
   addr[i] = addr[i] >> 1;        //接受一位数据
   if(k >= 8)
   {
     addr[i] = addr[i] | 0x80;    //高电平时间大于0.56,则为数据1,一般取0.8ms
   }
   k = 0;                         //计时清零
 }
  }
  if((addr[1]!=0xff) && (addr[2]!=(~addr[3])))//数据验证,判断addr[2]是不是addr[3]的反码
  {
   GICR |= (1 << INT0);              //使能外部中断
    return;                           //返回主函数
  }
  send_char(addr[0]);                 //把接收到的数据通过串口发送到电脑
  delay_nms(5);                       //延时一下,可以减少误码率
  send_char(addr[1]);
  delay_nms(5);
  send_char(addr[2]);
  delay_nms(5);
  send_char(addr[3]);
  delay_nms(5);
  GICR |= (1 << INT0);                //使能外部中断
}

楼主可见

  1. asdfghj 19#
    很好很强大
  2. rocyang 18#

    一直在找

  3. kanejiang 17#

    我试一下

  4. a511054269 16#

    很强大啊,顶一个

  5. lanyu1988227 15#

    ha很好的程序

  6. benben91 14#

    很好的程序

  7. irtry 13#

    好东东收藏了

  8. hl0716 12#

    红外解码程序(测试成功,解释详细!!!)

     

    不错,不知道有没有扑捉方式的版本

  9. ctstt 11#

    谢谢 楼主神人也!

  10. hetq99 10#

    不错

  11. zlzhou 9#

    支持楼主!!谢谢了!

  12. bangzhu05 8#

    好东西

  13. 7#

    很好

  14. avr8 6#

  15. sunq 5#

    谢谢