jianhong_wu 发表于 2015-2-3 12:15:43

谁有红外接收和发射的原理图和源代码全套资料?已解答。

蜗牛-重庆:
请问红外接收和发射用哪种管子?

鸿哥-深圳:
淘宝“红外接收管”,三个腿的,外观像直插三极管那种。


鸿哥-深圳:
这是红外发射管:


蜗牛-重庆:
我看红外遥控,需要38K的载波,请问我如果直接给发射管一个电压,接收管能能到信号吗?

鸿哥-深圳:
不能。必须要载波,两个io口控制,一个是PWM输出38K载波,一个是产生数据信号。以下是红外发射的原理图:



蜗牛-重庆:
DATA接口我是不是可以直接连接其它设备的TTL信号就可以呢?

鸿哥-深圳:
对。但是要产生脉冲发送数据。我再给你发一段参考源码,我当时是用PIC单片机做的,是6个通道,你只参考时序脉冲那部分:

void ir_send_data(unsigned char ir_ch,unsigned char ir_key_code,unsigned int ir_user_code)
{
      unsigned charir_key_code_temp;
      unsigned int   ir_user_code_temp;
      unsigned charir_send_for;

      CCP2CON=CCP2CON|0x0f;   //开PWM

      if(ir_ch==1)//通道
      {
          cd4051_C_dr=1;   //最高位
          cd4051_B_dr=0;
          cd4051_A_dr=1;   //最低位
      }
      else if(ir_ch==2)//通道
      {
          cd4051_C_dr=1;   //最高位
          cd4051_B_dr=1;
          cd4051_A_dr=0;   //最低位
      }
      else if(ir_ch==3)//通道
      {
          cd4051_C_dr=1;   //最高位
          cd4051_B_dr=0;
          cd4051_A_dr=0;   //最低位
      }
      else if(ir_ch==4)//通道
      {
          cd4051_C_dr=0;   //最高位
          cd4051_B_dr=1;
          cd4051_A_dr=0;   //最低位
      }
      else if(ir_ch==5)//通道
      {
          cd4051_C_dr=0;   //最高位
          cd4051_B_dr=0;
          cd4051_A_dr=1;   //最低位
      }
      else if(ir_ch==6)//通道
      {
          cd4051_C_dr=0;   //最高位
          cd4051_B_dr=0;
          cd4051_A_dr=0;   //最低位
      }

      GIE=0;

      ir_send_dr=1;
      delay_ir(cnt_delay_9ms);
      ir_send_dr=0;
      delay_ir(cnt_delay_4_5ms);//引导码





      ir_user_code_temp=ir_user_code;
      ir_user_code_temp=ir_user_code_temp>>8;
      ir_key_code_temp=ir_user_code_temp;       //发用户码      低8位         
      for(ir_send_for=0;ir_send_for<8;ir_send_for++)
      {
         ir_send_dr=1;
         delay_ir(cnt_delay_0_56ms);
         if((ir_key_code_temp&0x01)==0x01)//1
         {
             ir_send_dr=0;
             delay_ir(cnt_delay_1_69ms);
         }
         else                     //0
         {
             ir_send_dr=0;
             delay_ir(cnt_delay_0_565ms);
         }
         ir_key_code_temp=ir_key_code_temp>>1;
      }

      ir_user_code_temp=ir_user_code;
      ir_user_code_temp=ir_user_code_temp&0x00ff;
      ir_key_code_temp=ir_user_code_temp;       //发用户码      高8位         
      for(ir_send_for=0;ir_send_for<8;ir_send_for++)
      {
         ir_send_dr=1;
         delay_ir(cnt_delay_0_56ms);
         if((ir_key_code_temp&0x01)==0x01)//1
         {
             ir_send_dr=0;
             delay_ir(cnt_delay_1_69ms);
         }
         else                     //0
         {
             ir_send_dr=0;
             delay_ir(cnt_delay_0_565ms);
         }
         ir_key_code_temp=ir_key_code_temp>>1;
      }


      ir_key_code_temp=ir_key_code;       //发按键码
      for(ir_send_for=0;ir_send_for<8;ir_send_for++)
      {
         ir_send_dr=1;
         delay_ir(cnt_delay_0_56ms);
         if((ir_key_code_temp&0x01)==0x01)//1
         {
             ir_send_dr=0;
             delay_ir(cnt_delay_1_69ms);
         }
         else                     //0
         {
             ir_send_dr=0;
             delay_ir(cnt_delay_0_565ms);
         }
         ir_key_code_temp=ir_key_code_temp>>1;
      }


      ir_key_code_temp=ir_key_code;    //发按键的反码
      ir_key_code_temp=~ir_key_code_temp;
      for(ir_send_for=0;ir_send_for<8;ir_send_for++)
      {
         ir_send_dr=1;
         delay_ir(cnt_delay_0_56ms);
         if((ir_key_code_temp&0x01)==0x01)//1
         {
             ir_send_dr=0;
             delay_ir(cnt_delay_1_69ms);
         }
         else                     //0
         {
             ir_send_dr=0;
             delay_ir(cnt_delay_0_565ms);
         }
         ir_key_code_temp=ir_key_code_temp>>1;
      }


      ir_send_dr=1;       //结束位
      delay_ir(cnt_delay_0_56ms);
      ir_send_dr=0;
      delay_ir(cnt_delay_0_565ms);

      GIE=1;   
      CCP2CON=CCP2CON&0xf0;    //关PWM模式
      cd4051_C_dr=1;   //最高位
      cd4051_B_dr=1;
      cd4051_A_dr=1;   //最低位
      ir_send_dr=0;
      RC1=0;

}

蜗牛-重庆:
谢谢大家。

鸿哥-深圳:
我还有红外接收的参考代码,要不要?是利用外部中断接收的。

蜗牛-重庆:
能给我我一律接收哈,我慢慢消化!


鸿哥-深圳:
这是红外接收图,一个引脚接单片机的外部中断:


鸿哥-深圳:
这是我用PIC单片机做的红外接收代码,你可以参考:
//扫描遥控器数据

void IR_scan()
{
    if(RB0==0)
    {

      pulse_cnt=0;                         //脉冲计数清零
      while(RB0==0)                        //9ms低电平引导码
      {
         CLRWDT();
         pulse_cnt=pulse_cnt+1;
         
         if(pulse_cnt>cnt_over_9ms)      //超出9ms
         {
            INT0IE=1;
            return;
         }
      }


      pulse_cnt=0;                        //脉冲计数清零
      while(RB0==1)                     //4.5ms高电平引导码
      {
         CLRWDT();
         pulse_cnt=pulse_cnt+1;
         
         if(pulse_cnt>cnt_over_4_5ms)   //超出4.5ms
         {
            INT0IE=1;
            return;
         }
      }

      if(pulse_cnt<cnt_4_5ms)             //不够4.5ms
      {
         INT0IE=1;
         return;
      }
                                           //以上表示通过引导码

      beep_dr=0;                         //关掉蜂鸣器声音,避免出现声音突然加长的偶然现象
      voice_time=0;

      int_cnt=0;
      while(1)
      {
         CLRWDT();
         pulse_cnt=0;                  //脉冲计数清零
         while(RB0==0)                   //9ms低电平引导码
         {
            CLRWDT();
            pulse_cnt=pulse_cnt+1;
         
            if(pulse_cnt>cnt_over_each)//超出数据间隔
            {
               INT0IE=1;
               return;
            }
         }

         if(pulse_cnt<cnt_each)          //不够0.56ms
         {
            INT0IE=1;
            return;
         }
                                           //以上表示通过一个数据间隔
         
         pulse_cnt=0;                  //脉冲计数清零
         while(RB0==1)                   //数据位判断
         {
            CLRWDT();
            pulse_cnt=pulse_cnt+1;
         
            if(pulse_cnt>cnt_over_data)//超出1.69ms
            {
                  INT0IE=1;
                  return;
            }
         }
         
         IR_buf=IR_buf>>1;
         if(pulse_cnt>cnt_data)          //表示是数据1,否则为0
         {
               
               IR_buf=IR_buf|0x80000000;
         }
         else
         {
               IR_buf=IR_buf&0x7fffffff;
         }
         int_cnt=int_cnt+1;
         if(int_cnt>=32)
         {
                break;
         }
      
      }


       IR_buf_update=1;                     //遥控器有新数据更新

   
    }


}


kacanmmx2 发表于 2015-2-3 12:20:03

:):):):):)

whoyzf 发表于 2015-2-3 13:01:31

鸿哥,你这个的6个通道,是为了只使用一个IO口,来控制6个红外发送头吗?

jianhong_wu 发表于 2015-2-3 16:24:36

whoyzf 发表于 2015-2-3 13:01
鸿哥,你这个的6个通道,是为了只使用一个IO口,来控制6个红外发送头吗?

对。我项目中是用了好像是模拟开关进行通道切换的。

whoyzf 发表于 2015-2-3 17:57:10

jianhong_wu 发表于 2015-2-3 16:24
对。我项目中是用了好像是模拟开关进行通道切换的。

嗯。一般哪有一次用这么多发送头啊,
页: [1]
查看完整版本: 谁有红外接收和发射的原理图和源代码全套资料?已解答。