搜索
bottom↓
回复: 38

红外线发射和接收

[复制链接]

出0入0汤圆

发表于 2013-4-16 12:30:30 | 显示全部楼层 |阅读模式
红外线发射与接收基础实验
这个实验是红外发射和接收的一个基础实验。该实验讲了如何用红外线发射管发射38K红外线信号,然后让38K的红外线一体化接收头接收所发送的红外线信号。用示波器来查看红外发射端和接收端的电平信号。实验目的是让接收头收到一个10毫秒的低电平,接着10毫秒高电平,最后依次是8个脉宽为5毫秒周期的高低电平。
(1)实验电路图
  电路图如下图21-3所示。左边①部分是红外线信号发射部分,LED1是红外线发射管。通过单片机的P1.0端口去控制NPN三极管的基极。当P1.0端口为高电平时,三极管的发射极和集电极导通,红外线发射管就会导通,发射红外信号。三极管集电极和发射极的电压为0.3V,D1压降为1.4V,那么通过D1的电流为:I=U/R=(5-0.3-1.4)/150=0.022A。
  图21-3中的②部分是红外线芯片的接收部分。红外线接收部分用的是红外线一体化接收头PC838作的接收电路。PC838的1端是红外线信号接收和处理后,得出的红外线数据输出端和单片机的P3.2端口相连。2端是接的电源地。3端接的是电源正极,我们从+5V串联了一个330欧姆的电阻到VCC,并且在VCC端并联了0.1UF和22UF的电容,这样可以降低电源的干扰。
               
             ①红外线发射电路                   ②红外线接收电路
图21-3 红外线发射和接收电路图
(2)实验原理分析:
  红外线发射电路中,我们让单片机的P1.0端口输出一个38K的占空比为1/2的方波信号。1秒等于1000000微秒,那么方波的高低电平的时间t=1000000/38000/2≈13微秒。如果要用单片机来产生13微秒的高低电平信号,最好是用单片机的定时器来处理,定时器的方式2适合用于这样比较精确的脉冲信号发生器。
   方式2计算初值X:
X=256-t*fosc/12(或6)
   12和6是分频,我们这里选择12;t为所设计时时间单位为26微秒;fosc为晶振单位为11.0592MHz。
X=256-0.000013*11059200/12≈244
  我们已经算出了要得到13微秒的方波,我们给定时器方式2的初始为244(F4H),下面我们写要满足实验目的的代码就很简单了。
(3)实验程序代码
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit IR_TX = P1^0;          //红外信号发射端
sbit IR_OUT = P3^2;          //红外信号接收端
/*********************************
函数:Delay_1ms()
参数:t
返回:无
功能:延时子程序,延时时间为 1ms * del。
          使用晶振是11.0592M。
**********************************/
void Delay_1ms(uint t)
{
        uint i,j;
        for(i=0;i<t;i++)
        {
                for(j=0;j<=100;j++)
                {
                        _nop_();
                }
        }       
}
/*********************************
函数:Time0Init
参数:无
返回:无
功能:定时器的初始化,11.0592MZ晶振,
      定时器0设置为方式2,定时溢出时间为13微秒
**********************************/
void Time0Init()
{
        TMOD = 0x02;        //设置定时器0为方式2
        TH0  = 0xF4;    //设置定时时间
        TL0  = 0xF4;
        ET0 = 0;        //打开定时器0中断
        EA = 1;                        //打开总中断
}
/*********************************
函数:Time0Int
参数:无
返回:无
功能:定时器0中断,让IR_TX变量高低电平转换
**********************************/                                                                                 
void Time0Int() interrupt 1
{
        IR_TX = !IR_TX;
}
/*********************************
函数:Main
参数:无
返回:无
功能:主函数
**********************************/       
void Main()
{
        uchar i;
        Time0Init();   //初始化定时器0
        TR0 = 1;       //打开定时器0
        Delay_1ms(10);
        TR0 = 0;       //关闭定时器0
        Delay_1ms(10);

        for(i=0;i<8;i++)
        {
                TR0 = 1;   //打开定时器0
                Delay_1ms(5);  
                TR0 = 0;   //关闭定时器0
                Delay_1ms(5);
        }
        while(1)
        {
        }
}
(4)实验现象
    单片机通过定时器0的方式2产生了一个38K的方波信号,从P1.0端口输出。通过图21-4所示,方波的脉宽约为13微秒。

图21-4 红外线发射控制端P1.0端口发送的38K红外线信号
    图21-5是红外线发射管所发射的红外线信号波形。在定时器0运行期间,P1.0口会一直产生38K的方波信号。在定时器1停止期间,P1.0端口则不会产生38K方波信号。在前面的程序代码中,我们可以看到我们让定时器工作10毫秒,然后停10毫秒,最后再依次每隔5毫秒让定时器工作和停止。但是我们可以看到在前面我们让定时器工作10毫秒的地方,实际工作时间在15毫秒左右。造成时间不准的原因是定时器在工作的时候,每个13微秒进行一次中断,主函数的那个延时函数在工作的过程中被定时器打算了。这里,我们不对延时不准的情况进行深究,我们这里主要来分析红外线的工作原理。
图21-5 红外线发射管发射的红外线信号
  图21-6是在单片机的P3.3端口测得的经过红外线一体化接收头处理后的红外线信号图。图21-6和图21-5进行对比,可以得出这样的结果:当红外线发射管发出38K的红外线信号时,红外线一体化接收头为低电平;而红外线发射管没有发送红外线信号时,红外线一体化接收头为高电平。

图21-6 经过红外线一体化接收头处理后的红外信号
    经过这一节的学习可以让大家对红外线的发射和接收基础有一定的了解。在这一节讲了38K的红外线信号该如何产生,红外线信号要如何进行发射和接收等等。另外,红外线信号的发送是必要要有间隔的,每一组红外线信号最好要间隔100毫秒以上再发送一次,否则红外线一体化接收头会接受不了红外线信号。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-4-16 12:34:14 | 显示全部楼层
求大侠指导

出0入0汤圆

 楼主| 发表于 2013-4-16 12:39:33 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-5-21 22:34:44 | 显示全部楼层
谢谢!下载学习,学习。

出0入0汤圆

发表于 2013-6-18 19:44:51 | 显示全部楼层
每一组红外发射信号最好隔100ms发射一次


那么每一次发射红外信号的时间最大值是多少呢    有没有试过

出0入0汤圆

 楼主| 发表于 2013-6-19 00:19:58 | 显示全部楼层
number007cool 发表于 2013-6-18 19:44
每一组红外发射信号最好隔100ms发射一次

这个早都做完了,需要的话我可以给你所有的文档.

出0入0汤圆

 楼主| 发表于 2013-6-19 00:20:43 | 显示全部楼层
没有仔细看过这个时间。

出0入0汤圆

发表于 2013-6-19 06:16:47 | 显示全部楼层
谢谢楼主, 资料能不能共享下, 我准备用STM32做个红外接收, 正在找资料.

出0入0汤圆

发表于 2013-6-19 10:41:23 | 显示全部楼层
andy520 发表于 2013-6-19 00:19
这个早都做完了,需要的话我可以给你所有的文档.

好啊  哪谢谢你了

number007cool@163.com

出0入0汤圆

发表于 2013-6-19 11:14:21 | 显示全部楼层
学习了     

出0入0汤圆

 楼主| 发表于 2013-6-25 09:05:06 | 显示全部楼层
最终版的红外发射与接收

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-6-25 09:07:24 | 显示全部楼层
number007cool 发表于 2013-6-19 10:41
好啊  哪谢谢你了

不好意思,最经没时间来看。刚刚发给你了。有什么问题给我发邮件.

出0入0汤圆

发表于 2013-6-25 12:48:35 | 显示全部楼层
andy520 发表于 2013-6-25 09:07
不好意思,最经没时间来看。刚刚发给你了。有什么问题给我发邮件.

多谢你了   我回去看看

出0入0汤圆

发表于 2013-6-28 08:52:50 | 显示全部楼层
正在学习红外遥控的东西,感谢楼主了。。

出0入0汤圆

发表于 2013-6-28 09:59:32 来自手机 | 显示全部楼层
楼主分享的好东西,讲的简单易懂

出0入0汤圆

 楼主| 发表于 2013-6-29 00:26:41 | 显示全部楼层
qq511153186 发表于 2013-6-28 09:59
楼主分享的好东西,讲的简单易懂

呵呵,有吗?
这个是我实际做过的东西,有亲身体会的。

出0入0汤圆

发表于 2013-6-29 00:55:06 来自手机 | 显示全部楼层
很好的资料,下载学习。

出0入0汤圆

发表于 2013-7-4 09:48:19 | 显示全部楼层
学习啦  谢谢LZ共享                  

出0入0汤圆

发表于 2013-7-4 11:09:50 | 显示全部楼层
这个不难,时间算的准就可以了

出0入0汤圆

发表于 2013-7-4 23:25:21 | 显示全部楼层
  1. #ifndef                 ______IRSEND_H_______
  2. #define                 ______IRSEND_H_______

  3. #include "Typedef.h"

  4. #define IRSENDPORT P0

  5. #define TIMER9000US            (65536-8294)                   //9mS
  6. #define TIMER4500US          (65536-4147)                   //4.5mS
  7. #define TIMER1650US          (65536-1520)                   //1.65mS
  8. #define TIMER0560US          (65536-516)                   //0.56mS
  9. #define TIMER40000US           (65536-36863)               //40mS
  10. #define TIMER56000US           (65536-51609)               //56mS


  11. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  12. * Function          :       
  13. * Description         :        函数功能、性能描述
  14. * Calls                 :        被本函数调用的函数清单
  15. * Called By         :        调用本函数的函数清单
  16. * Table accessed:        被访问的表(数据库操作用)
  17. * Tabled Updated:        被修改的表(数据库操作用)
  18. * Input                 :        输入参数、取值说明与关系
  19. * Output                 :        输出参数、类型说明
  20. * Return                 :        函数返回值说明
  21. * Others                 :        (Screen sequence)  
  22. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  23. void IrUserTimerConfiguration(void)
  24. {
  25.         TMOD |= 0x01;
  26.         IRSENDPORT = 0XFF;
  27. }


  28. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  29. * Function          :       
  30. * Description         :        函数功能、性能描述
  31. * Calls                 :        被本函数调用的函数清单
  32. * Called By         :        调用本函数的函数清单
  33. * Table accessed:        被访问的表(数据库操作用)
  34. * Tabled Updated:        被修改的表(数据库操作用)
  35. * Input                 :        输入参数、取值说明与关系
  36. * Output                 :        输出参数、类型说明
  37. * Return                 :        函数返回值说明
  38. * Others                 :        (Screen sequence)  
  39. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  40. void IRWriteOneBit(BIT send_Mode,unsigned int TimerInitValue,unsigned char PassageNumer)
  41. {
  42.         unsigned char NumBer = 1 << PassageNumer;
  43.         unsigned char onlyOnePassageorAllChang = 20;
  44.        
  45.         if (PassageNumer < 8 && PassageNumer >= 0)        onlyOnePassageorAllChang = 0;                //单独通道发送
  46.         else if (255 == PassageNumer)                            onlyOnePassageorAllChang = 1;                //所有通道都发送
  47.         TH0 = TimerInitValue >> 8;                                                                       
  48.         TL0 = TimerInitValue;
  49.         TF0 = 0;                                //清TF0
  50.         TR0 = 1;                                 //启动定时器0
  51.         if (send_Mode == 0)        while(!TF0);
  52.         else while(1)
  53.         {
  54.                 if (0 == onlyOnePassageorAllChang)            IRSENDPORT &= ~NumBer;        //置位相应的通道
  55.                 else if (1 == onlyOnePassageorAllChang)        IRSENDPORT = 0xff;
  56.                
  57.                 if (TF0) break; if (TF0) break;
  58.                
  59.                 if (0 == onlyOnePassageorAllChang)                IRSENDPORT |= NumBer;        //CLR相应通道
  60.                 else if (1 == onlyOnePassageorAllChang)        IRSENDPORT = 0x00;
  61.                
  62.                 if (TF0) break; if (TF0) break; if (TF0) break; if (TF0) break; if (TF0) break;
  63.                 if (TF0) break; if (TF0) break; if (TF0) break; if (TF0) break; if (TF0) break;                
  64.         }
  65.         TR0 = 0;
  66.     if (0 == onlyOnePassageorAllChang)            IRSENDPORT |=  NumBer;
  67.         else if (1 == onlyOnePassageorAllChang)        IRSENDPORT = 0xff;
  68. }


  69. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  70. * Function          :       
  71. * Description         :        函数功能、性能描述
  72. * Calls                 :        被本函数调用的函数清单
  73. * Called By         :        调用本函数的函数清单
  74. * Table accessed:        被访问的表(数据库操作用)
  75. * Tabled Updated:        被修改的表(数据库操作用)
  76. * Input                 :        输入参数、取值说明与关系
  77. * Output                 :        输出参数、类型说明
  78. * Return                 :        函数返回值说明
  79. * Others                 :        (Screen sequence)  
  80. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  81. void IRWriteOneChar(unsigned char ircode,unsigned char PassageNumer)
  82. {
  83.         unsigned char I = 0x00;
  84.         for (I = 0;I < 8;I++)
  85.         {
  86.                 IRWriteOneBit(1,TIMER0560US,PassageNumer);
  87.                 if (ircode & 0x01)       
  88.                         {
  89.                                 IRWriteOneBit(0,TIMER1650US,PassageNumer);
  90.                         }
  91.                 else
  92.                         {
  93.                                 IRWriteOneBit(0,TIMER0560US,PassageNumer);
  94.                         }
  95.                 ircode >>= 1;
  96.         }       
  97. }

  98. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  99. * Function          :       
  100. * Description         :        函数功能、性能描述
  101. * Calls                 :        被本函数调用的函数清单
  102. * Called By         :        调用本函数的函数清单
  103. * Table accessed:        被访问的表(数据库操作用)
  104. * Tabled Updated:        被修改的表(数据库操作用)
  105. * Input                 :        输入参数、取值说明与关系
  106. * Output                 :        输出参数、类型说明
  107. * Return                 :        函数返回值说明
  108. * Others                 :        (Screen sequence)  
  109. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  110. void IrPortWriteIrcode(unsigned char *Ir_Point,unsigned char PassageNumer)
  111. {
  112.         IRWriteOneBit(1,TIMER9000US,PassageNumer);
  113.         IRWriteOneBit(0,TIMER4500US,PassageNumer);

  114.     IRWriteOneChar(*(Ir_Point+0),PassageNumer);       
  115.         IRWriteOneChar(*(Ir_Point+1),PassageNumer);
  116.         IRWriteOneChar(*(Ir_Point+2),PassageNumer);
  117.         IRWriteOneChar(*(Ir_Point+3),PassageNumer);

  118.         IRWriteOneBit(1,TIMER0560US ,PassageNumer);
  119.         IRWriteOneBit(0,TIMER40000US,PassageNumer);
  120. }
  121. #endif
复制代码
哈哈,这个是参照论坛的,比较好理解!

出0入0汤圆

 楼主| 发表于 2013-7-5 10:28:36 | 显示全部楼层
HeP028 发表于 2013-7-4 23:25
哈哈,这个是参照论坛的,比较好理解!

没发现,主函数都没找到??

出0入0汤圆

发表于 2013-7-17 12:33:16 | 显示全部楼层
保存                    

出0入0汤圆

发表于 2013-7-17 12:38:23 | 显示全部楼层
mark!            

出0入0汤圆

发表于 2013-7-17 21:42:09 | 显示全部楼层
之前搞了一下 不太难

出0入0汤圆

 楼主| 发表于 2013-7-17 21:52:25 | 显示全部楼层
WM_CH 发表于 2013-7-17 21:42
之前搞了一下 不太难

搞懂了肯定不难。

出0入0汤圆

发表于 2013-7-18 09:02:54 | 显示全部楼层
采用中断接收方式一类做红外接收,如果你采用4位数码显示(或做别人工作)时,出现程序跑慢显示器出现闪烁等现象。最好采用定时扫描的方式来做,这样MCU的得利用率也高此。只是提个见意,要求不高的方式,楼主这样做也是可以的。红外接收和发射我07年做过,当时也是有闪烁的现象。

出0入0汤圆

发表于 2013-7-18 10:26:43 | 显示全部楼层
忘记买红外线接收了

出0入0汤圆

发表于 2013-7-18 21:06:42 | 显示全部楼层
红外接收不经过三极管放大,单片机能不能识别?

出0入0汤圆

发表于 2013-7-18 21:11:45 来自手机 | 显示全部楼层
手机mark一下。

出0入0汤圆

 楼主| 发表于 2013-7-19 10:03:48 | 显示全部楼层
yy12651 发表于 2013-7-18 21:06
红外接收不经过三极管放大,单片机能不能识别?

如果你购买的接收头是一体化接收头,内部集成有信号放大。不然就要自己放大。我当时买的是一体化的。一体化接收头接收的信号可以直接给单片机,单片机可以识别。

出0入0汤圆

发表于 2013-9-5 19:25:21 | 显示全部楼层
非常支持楼主,这般慷慨开班!

出0入0汤圆

发表于 2014-4-21 20:45:05 | 显示全部楼层
资料收下了

出0入0汤圆

发表于 2014-4-21 20:59:44 | 显示全部楼层
红外的 用了又忘了 mark

出0入0汤圆

发表于 2014-4-27 20:58:32 | 显示全部楼层
路过路过了  顺便看看

出0入0汤圆

发表于 2014-9-6 11:38:54 | 显示全部楼层
非常有用。
多谢了

出0入0汤圆

发表于 2014-9-6 11:51:02 | 显示全部楼层
涨姿势了

出0入0汤圆

发表于 2014-12-1 19:21:18 | 显示全部楼层
很好很强大

出0入0汤圆

发表于 2014-12-2 21:53:26 | 显示全部楼层
迟早能用到的

出0入0汤圆

发表于 2014-12-2 23:01:39 | 显示全部楼层
非常支持楼主,这般慷慨开班!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表