独闷闷网

标题: 谁有红外接收和发射的原理图和源代码全套资料?已解答。 [打印本页]

作者: jianhong_wu    时间: 2015-2-3 12:15
标题: 谁有红外接收和发射的原理图和源代码全套资料?已解答。
蜗牛-重庆:
请问红外接收和发射用哪种管子?

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


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


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

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



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

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

  1. void ir_send_data(unsigned char ir_ch,unsigned char ir_key_code,unsigned int ir_user_code)
  2. {
  3.       unsigned char  ir_key_code_temp;
  4.       unsigned int   ir_user_code_temp;
  5.       unsigned char  ir_send_for;

  6.       CCP2CON=CCP2CON|0x0f;   //开PWM

  7.       if(ir_ch==1)  //通道
  8.       {
  9.           cd4051_C_dr=1;   //最高位
  10.           cd4051_B_dr=0;
  11.           cd4051_A_dr=1;   //最低位
  12.       }
  13.       else if(ir_ch==2)  //通道
  14.       {
  15.           cd4051_C_dr=1;   //最高位
  16.           cd4051_B_dr=1;
  17.           cd4051_A_dr=0;   //最低位
  18.       }
  19.       else if(ir_ch==3)  //通道
  20.       {
  21.           cd4051_C_dr=1;   //最高位
  22.           cd4051_B_dr=0;
  23.           cd4051_A_dr=0;   //最低位
  24.       }
  25.       else if(ir_ch==4)  //通道
  26.       {
  27.           cd4051_C_dr=0;   //最高位
  28.           cd4051_B_dr=1;
  29.           cd4051_A_dr=0;   //最低位
  30.       }
  31.       else if(ir_ch==5)  //通道
  32.       {
  33.           cd4051_C_dr=0;   //最高位
  34.           cd4051_B_dr=0;
  35.           cd4051_A_dr=1;   //最低位
  36.       }
  37.       else if(ir_ch==6)  //通道
  38.       {
  39.           cd4051_C_dr=0;   //最高位
  40.           cd4051_B_dr=0;
  41.           cd4051_A_dr=0;   //最低位
  42.       }

  43.       GIE=0;

  44.       ir_send_dr=1;
  45.       delay_ir(cnt_delay_9ms);
  46.       ir_send_dr=0;
  47.       delay_ir(cnt_delay_4_5ms);  //引导码





  48.       ir_user_code_temp=ir_user_code;
  49.       ir_user_code_temp=ir_user_code_temp>>8;
  50.       ir_key_code_temp=ir_user_code_temp;       //发用户码      低8位         
  51.       for(ir_send_for=0;ir_send_for<8;ir_send_for++)
  52.       {
  53.          ir_send_dr=1;
  54.          delay_ir(cnt_delay_0_56ms);
  55.          if((ir_key_code_temp&0x01)==0x01)  //1
  56.          {
  57.              ir_send_dr=0;
  58.              delay_ir(cnt_delay_1_69ms);
  59.          }
  60.          else                       //0
  61.          {
  62.              ir_send_dr=0;
  63.              delay_ir(cnt_delay_0_565ms);
  64.          }
  65.          ir_key_code_temp=ir_key_code_temp>>1;
  66.       }

  67.       ir_user_code_temp=ir_user_code;
  68.       ir_user_code_temp=ir_user_code_temp&0x00ff;
  69.       ir_key_code_temp=ir_user_code_temp;       //发用户码      高8位         
  70.       for(ir_send_for=0;ir_send_for<8;ir_send_for++)
  71.       {
  72.          ir_send_dr=1;
  73.          delay_ir(cnt_delay_0_56ms);
  74.          if((ir_key_code_temp&0x01)==0x01)  //1
  75.          {
  76.              ir_send_dr=0;
  77.              delay_ir(cnt_delay_1_69ms);
  78.          }
  79.          else                       //0
  80.          {
  81.              ir_send_dr=0;
  82.              delay_ir(cnt_delay_0_565ms);
  83.          }
  84.          ir_key_code_temp=ir_key_code_temp>>1;
  85.       }


  86.       ir_key_code_temp=ir_key_code;       //发按键码
  87.       for(ir_send_for=0;ir_send_for<8;ir_send_for++)
  88.       {
  89.          ir_send_dr=1;
  90.          delay_ir(cnt_delay_0_56ms);
  91.          if((ir_key_code_temp&0x01)==0x01)  //1
  92.          {
  93.              ir_send_dr=0;
  94.              delay_ir(cnt_delay_1_69ms);
  95.          }
  96.          else                       //0
  97.          {
  98.              ir_send_dr=0;
  99.              delay_ir(cnt_delay_0_565ms);
  100.          }
  101.          ir_key_code_temp=ir_key_code_temp>>1;
  102.       }


  103.       ir_key_code_temp=ir_key_code;    //发按键的反码
  104.       ir_key_code_temp=~ir_key_code_temp;
  105.       for(ir_send_for=0;ir_send_for<8;ir_send_for++)
  106.       {
  107.          ir_send_dr=1;
  108.          delay_ir(cnt_delay_0_56ms);
  109.          if((ir_key_code_temp&0x01)==0x01)  //1
  110.          {
  111.              ir_send_dr=0;
  112.              delay_ir(cnt_delay_1_69ms);
  113.          }
  114.          else                       //0
  115.          {
  116.              ir_send_dr=0;
  117.              delay_ir(cnt_delay_0_565ms);
  118.          }
  119.          ir_key_code_temp=ir_key_code_temp>>1;
  120.       }


  121.       ir_send_dr=1;       //结束位
  122.       delay_ir(cnt_delay_0_56ms);
  123.       ir_send_dr=0;
  124.       delay_ir(cnt_delay_0_565ms);

  125.       GIE=1;     
  126.       CCP2CON=CCP2CON&0xf0;    //关PWM模式
  127.       cd4051_C_dr=1;   //最高位
  128.       cd4051_B_dr=1;
  129.       cd4051_A_dr=1;   //最低位
  130.       ir_send_dr=0;
  131.       RC1=0;

  132. }
复制代码

蜗牛-重庆:
谢谢大家。

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

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


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


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

  3. void IR_scan()
  4. {
  5.     if(RB0==0)
  6.     {

  7.         pulse_cnt=0;                         //脉冲计数清零
  8.         while(RB0==0)                        //9ms低电平引导码
  9.         {
  10.            CLRWDT();
  11.            pulse_cnt=pulse_cnt+1;
  12.            
  13.            if(pulse_cnt>cnt_over_9ms)        //超出9ms
  14.            {
  15.               INT0IE=1;
  16.               return;
  17.            }  
  18.         }


  19.         pulse_cnt=0;                        //脉冲计数清零
  20.         while(RB0==1)                       //4.5ms高电平引导码
  21.         {
  22.            CLRWDT();
  23.            pulse_cnt=pulse_cnt+1;
  24.            
  25.            if(pulse_cnt>cnt_over_4_5ms)     //超出4.5ms
  26.            {
  27.               INT0IE=1;
  28.               return;
  29.            }  
  30.         }

  31.         if(pulse_cnt<cnt_4_5ms)             //不够4.5ms
  32.         {
  33.            INT0IE=1;
  34.            return;
  35.         }
  36.                                            //以上表示通过引导码
  37.   
  38.         beep_dr=0;                         //关掉蜂鸣器声音,避免出现声音突然加长的偶然现象
  39.         voice_time=0;

  40.         int_cnt=0;
  41.         while(1)
  42.         {
  43.            CLRWDT();
  44.            pulse_cnt=0;                    //脉冲计数清零
  45.            while(RB0==0)                   //9ms低电平引导码
  46.            {
  47.               CLRWDT();
  48.               pulse_cnt=pulse_cnt+1;
  49.            
  50.               if(pulse_cnt>cnt_over_each)  //超出数据间隔
  51.               {
  52.                  INT0IE=1;
  53.                  return;
  54.               }  
  55.            }

  56.            if(pulse_cnt<cnt_each)          //不够0.56ms
  57.            {
  58.               INT0IE=1;
  59.               return;
  60.            }
  61.                                            //以上表示通过一个数据间隔
  62.          
  63.            pulse_cnt=0;                    //脉冲计数清零
  64.            while(RB0==1)                   //数据位判断
  65.            {
  66.               CLRWDT();
  67.               pulse_cnt=pulse_cnt+1;
  68.            
  69.               if(pulse_cnt>cnt_over_data)  //超出1.69ms
  70.               {
  71.                   INT0IE=1;
  72.                   return;
  73.               }  
  74.            }
  75.            
  76.            IR_buf=IR_buf>>1;  
  77.            if(pulse_cnt>cnt_data)          //表示是数据1,否则为0
  78.            {
  79.                
  80.                IR_buf=IR_buf|0x80000000;
  81.            }
  82.            else
  83.            {
  84.                IR_buf=IR_buf&0x7fffffff;
  85.            }
  86.            int_cnt=int_cnt+1;
  87.            if(int_cnt>=32)
  88.            {
  89.                 break;
  90.            }
  91.         
  92.         }


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

  94.    
  95.     }


  96. }
复制代码



作者: kacanmmx2    时间: 2015-2-3 12:20

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

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

嗯。一般哪有一次用这么多发送头啊,




欢迎光临 独闷闷网 (http://dumenmen.com/) Powered by Discuz! X3.2