找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9159|回复: 11
打印 上一主题 下一主题
收起左侧

红外遥控器+红外一体化接收头部分的仿真

  [复制链接]
跳转到指定楼层
楼主
     红外线编码是数据传输和家用电器遥控常用的一种通讯方法,其实质是一种脉宽调制的串行通讯。家电遥控
中常用的红外线编码电路有μPD6121G型HT622型和7461型等。
    这里就以这些电路的编码格式来仿真怎样使用单片机的捕获中断功能来实现其解码。    红外线通讯的发送部
分主要是把待发送的数据转换成一定格式的脉冲,然后驱动红外发光管向外发送数据。接收部分则是完成红外
线的接收、放大、解调,还原成同步发射格式相同(但高、低电位刚好相反的脉冲信号)。这些工作通常由一体
化的接收头来完成,主要输出TTL兼容电平。最后通过解码把脉冲信号转换成数据,从而实现数据的传输。
   本单元就是来完成一体化接收头接受到的红外遥控器编码后的输出数据,所以只要单片机完成本单元的解码任
务,并成功实现之后,只要将IR引脚接上红外接收头之后就可以实现红外遥控的功能了。
  这是我积累前人经验和自己实践的成果,并且已经有硬件的成功案例,并非只是理论.


所有资料下载: 红外遥控模拟.rar (88.78 KB, 下载次数: 107)

源程序:
  1. #include "At89x51.h"
  2. #include "stdio.h"
  3. #include "stdlib.h"
  4. #include "string.h"

  5. #define JINGZHEN 48
  6. #define TIME0TH ((65536-100*JINGZHEN/12)&0xff00)>>8   //time0,100us,红外遥控
  7. #define TIME0TL ((65536-100*JINGZHEN/12)&0xff)
  8. #define TIME1TH ((65536-5000*JINGZHEN/12)&0xff00)>>8   
  9. #define TIME1TL ((65536-5000*JINGZHEN/12)&0xff)
  10. #define uchar unsigned char
  11. #define uint  unsigned int

  12. code uchar  BitMsk[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};

  13. uint IrCount=0,Show=0,Cont=0;
  14. uchar IRDATBUF[32],s[20];
  15. uchar IrDat[5]={0,0,0,0,0};
  16. uchar IrStart=0,IrDatCount=0;
  17. extern void initLCM( void);                                                                                                       //LCD初始化子程序
  18. extern void DisplayListChar(uchar X,uchar Y, unsigned char *DData);                    //显示指定坐标的一串字符子函数

  19. void timer1int (void)  interrupt 3  using 3{         //定时器1
  20. EA=0;
  21. TH1 = TIME1TH;  
  22. TL1 = TIME1TL;
  23. Cont++;
  24. if(Cont>10)Show=1;
  25. EA=1;
  26. }
  27. void timer0int (void)  interrupt 1  using 1{         //定时器0
  28.         uchar i,a,b,c,d;
  29.         EA=0;
  30.         TH0 = TIME0TH;  
  31.         TL0 = TIME0TL;
  32.         if(IrCount>500)IrCount=0;
  33.         if(IrCount>300&&IrStart>0){IrStart=0;IrDatCount=0;IrDat[0]=IrDat[1]=IrDat[2]=IrDat[3]=0;IrCount=0;}
  34.         if(IrStart==2)
  35.         {
  36.                 IrStart=3;
  37.                 for(i=0;i<IrDatCount;i++)
  38.                 {
  39.                         if(i<32)
  40.                         {
  41.                                 a=i/8;

  42.                                 b=IRDATBUF[i];
  43.                                 c=IrDat[a];
  44.                                 d=BitMsk[i%8];
  45.                                 if(b>5&&b<14)c|=d;
  46.                                 if(b>16&&b<25)c&=~d;
  47.                                 IrDat[a]=c;
  48.                         }
  49.                 }
  50.                 if(IrDat[2]!=~IrDat[3])
  51.                 {
  52.                  IrStart=0;IrDatCount=0;IrDat[0]=IrDat[1]=IrDat[2]=IrDat[3]=0;IrCount=0;
  53.                  
  54.                 }
  55.                 EA=1;
  56.                 return;
  57.         }
  58.         IrCount++;
  59.         EA=1;
  60. }
  61. void int0() interrupt 0  using 0  {
  62.         EA=0;
  63.         if(IrStart==0)
  64.         {
  65.           IrStart=1;IrCount=0;TH0 = TIME0TH;TL0 = TIME0TL;
  66.           IrDatCount=0;EA=1;
  67.           return;
  68.         }
  69.         if(IrStart==1)
  70.         {
  71.          if(IrDatCount>0&&IrDatCount<33)
  72.                  IRDATBUF[IrDatCount-1]=IrCount;
  73.          if(IrDatCount>31)
  74.                  {IrStart=2;TH0 = TIME0TH;TL0 = TIME0TL;EA=1;return;}
  75.          if(IrCount>114&&IrCount<133&&IrDatCount==0)
  76.                  {IrDatCount=1;}else if(IrDatCount>0)IrDatCount++;
  77.         }                        
  78.         IrCount=0;TH0 = TIME0TH;TL0 = TIME0TL;
  79.         EA=1;
  80. }

  81. main()
  82. {
  83.         uchar *a,n;
  84.         TMOD  |= 0x011;
  85.         TH0 = TIME0TH;
  86.         TL0 = TIME0TL;
  87.         ET0=1;
  88.         TR0=1;                                
  89.         ET1=1;
  90.         TR1=1;                                
  91.         IT0 = 1;                                //下降沿
  92.         EX0 = 1;
  93.         initLCM();
  94.         EA=1;
  95.         for(;;)
  96.         {

  97.                 if(Show==1)
  98.                 {
  99.                         Show=0;
  100.                         Cont=0;
  101.                         DisplayListChar(0,1,"Please keys");
  102.                         a="";
  103.                         switch (IrDat[3])
  104.                         {
  105.                       case 0x12://ON/C
  106.                                     a="ON/C";
  107.                                   break;
  108.                       case 0x0b://±
  109.                                     a="+/-";
  110.                                   break;
  111.                       case 0x1a://+
  112.                                     a="+";
  113.                                   break;
  114.                       case 0x1e://-
  115.                                     a="-";
  116.                                   break;
  117.                       case 0x0e://÷
  118.                                     a="/";
  119.                                   break;
  120.                       case 0x1d://MRC
  121.                                     a="MRC";
  122.                                   break;
  123.                
  124.                       case 0x1f://M-
  125.                                     a="M-";
  126.                                   break;
  127.                       case 0x1b://M+
  128.                                     a="M+";
  129.                                   break;
  130.                       case 0x00://0
  131.                                     if(IrDat[2]==0xff)a="0";
  132.                                   break;
  133.                       case 0x01://1
  134.                                     a="1";
  135.                                   break;
  136.                       case 0x02://2
  137.                                     a="2";
  138.                                   break;
  139.                
  140.                       case 0x03://3
  141.                                     a="3";
  142.                                   break;
  143.                       case 0x04://4
  144.                                     a="4";
  145.                                   break;
  146.                       case 0x05://5
  147.                                     a="5";
  148.                                   break;
  149.                       case 0x06://6
  150.                                     a="6";
  151.                                   break;
  152.                       case 0x07://7
  153.                                     a="7";
  154.                                   break;
  155.                       case 0x08://8
  156.                                     a="8";
  157.                                   break;
  158.                
  159.                       case 0x09://9
  160.                                     a="9";
  161.                                   break;
  162.                       case 0x2A://%
  163.                                     a="%";
  164.                                   break;
  165.                       case 0x2B://X
  166.                                     a="X";
  167.                                   break;
  168.                       case 0x2C://.
  169.                                     a=".";
  170.                                   break;
  171.                       case 0x2D://=
  172.                                     a="=";
  173.                                   break;
  174.                       case 0x2E://□
  175.                                     a=" ";
  176.                                   break;

  177.                         }
  178.                         n=strlen(a);
  179.                         if(n>0)sprintf(s,"Key is [%s]",a);else sprintf(s,"Not Key         ",a);
  180.                         DisplayListChar(0,0,s);
  181.                 }
  182.         }
  183. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

来自 13#
ID:437129 发表于 2024-12-19 14:05 | 只看该作者
感谢楼主无私奉献的分享。
原程序只有LCD屏幕显示遥控器键值,发光二极管没有点亮。
在楼主的基础上增加了点灯功能,分享给大家。
#include "At89x51.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

sbit RELAY1= P1^0;  
sbit RELAY2= P1^1;  
sbit RELAY3= P1^2;  
sbit RELAY4= P1^3;  
sbit RELAY5= P1^4;  
sbit RELAY6= P1^5;  
sbit RELAY7= P1^6;  
sbit RELAY8= P1^7;  
#define JINGZHEN 48
#define TIME0TH ((65536-100*JINGZHEN/12)&0xff00)>>8   
#define TIME0TL ((65536-100*JINGZHEN/12)&0xff)
#define TIME1TH ((65536-5000*JINGZHEN/12)&0xff00)>>8   
#define TIME1TL ((65536-5000*JINGZHEN/12)&0xff)
#define uchar unsigned char
#define uint  unsigned int

code uchar  BitMsk[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};

uint IrCount=0,Show=0,Cont=0;
uchar IRDATBUF[32],s[20];
uchar IrDat[5]={0,0,0,0,0};
uchar IrStart=0,IrDatCount=0;
extern void initLCM( void);                                                                                                      
extern void DisplayListChar(uchar X,uchar Y, unsigned char *DData);                    

void timer1int (void)  interrupt 3  using 3{         
EA=0;
TH1 = TIME1TH;  
TL1 = TIME1TL;
Cont++;
if(Cont>10)Show=1;
EA=1;
}
void timer0int (void)  interrupt 1  using 1{         
        uchar i,a,b,c,d;
        EA=0;
        TH0 = TIME0TH;  
        TL0 = TIME0TL;
        if(IrCount>500)IrCount=0;
        if(IrCount>300&&IrStart>0){IrStart=0;IrDatCount=0;IrDat[0]=IrDat[1]=IrDat[2]=IrDat[3]=0;IrCount=0;}
        if(IrStart==2)
        {
                IrStart=3;
                for(i=0;i<IrDatCount;i++)
                {
                        if(i<32)
                        {
                                a=i/8;

                                b=IRDATBUF[i];
                                c=IrDat[a];
                                d=BitMsk[i%8];
                                if(b>5&&b<14)c|=d;
                                if(b>16&&b<25)c&=~d;
                                IrDat[a]=c;
                        }
                }
                if(IrDat[2]!=~IrDat[3])
                {
                 IrStart=0;IrDatCount=0;IrDat[0]=IrDat[1]=IrDat[2]=IrDat[3]=0;IrCount=0;
                 
                }
                EA=1;
                return;
        }
        IrCount++;
        EA=1;
}
void int0() interrupt 0  using 0  {
        EA=0;
        if(IrStart==0)
        {
          IrStart=1;IrCount=0;TH0 = TIME0TH;TL0 = TIME0TL;
          IrDatCount=0;EA=1;
          return;
        }
        if(IrStart==1)
        {
         if(IrDatCount>0&&IrDatCount<33)
                 IRDATBUF[IrDatCount-1]=IrCount;
         if(IrDatCount>31)
                 {IrStart=2;TH0 = TIME0TH;TL0 = TIME0TL;EA=1;return;}
         if(IrCount>114&&IrCount<133&&IrDatCount==0)
                 {IrDatCount=1;}else if(IrDatCount>0)IrDatCount++;
        }                       
        IrCount=0;TH0 = TIME0TH;TL0 = TIME0TL;
        EA=1;
}

main()
{
        uchar *a,n;
        TMOD  |= 0x011;
        TH0 = TIME0TH;
        TL0 = TIME0TL;
        ET0=1;
        TR0=1;                              
        ET1=1;
        TR1=1;                              
        IT0 = 1;                                
        EX0 = 1;
        initLCM();
        EA=1;
        for(;;)
        {

                if(Show==1)
                {
                        Show=0;
                        Cont=0;
                        DisplayListChar(0,1,"Please keys");
                        a="";
                        switch (IrDat[3])
                        {
                      case 0x12:
                                    a="ON/C";
                                  break;
                      case 0x0b:
                                    a="+/-";
                                  break;
                      case 0x1a:
                                    a="+";
                                  break;
                      case 0x1e:
                                    a="-";
                                  break;
                      case 0x0e:
                                    a="/";
                                  break;
                      case 0x1d:
                                    a="MRC";
                                  break;
               
                      case 0x1f:
                                    a="M-";
                                  break;
                      case 0x1b:
                                    a="M+";
                                  break;
                      case 0x00:
                                    if(IrDat[2]==0xff)a="0";
                                  break;
                      case 0x01:
                                    a="1";
                                        RELAY1=!RELAY1;
                                  break;
                      case 0x02:
                                    a="2";
                                        RELAY2=!RELAY2;
                                  break;
               
                      case 0x03:
                                    a="3";
                                        RELAY3=!RELAY3;
                                  break;
                      case 0x04:
                                    a="4";
                                        RELAY4=!RELAY4;
                                  break;
                      case 0x05:
                                    a="5";
                                        RELAY5=!RELAY5;
                                  break;
                      case 0x06:
                                    a="6";
                                        RELAY6=!RELAY6;
                                  break;
                      case 0x07:
                                    a="7";
                                        RELAY7=!RELAY7;
                                  break;
                      case 0x08:
                                    a="8";
                                        RELAY8=!RELAY8;
                                  break;
               
                      case 0x09:
                                    a="9";
                                  break;
                      case 0x2A:
                                    a="%";
                                  break;
                      case 0x2B:
                                    a="X";
                                  break;
                      case 0x2C:
                                    a=".";
                                  break;
                      case 0x2D:
                                    a="=";
                                  break;
                      case 0x2E:
                                    a=" ";
                                  break;

                        }
                        n=strlen(a);
                        if(n>0)sprintf(s,"Key is [%s]",a);else sprintf(s,"Not Key         ",a);
                        DisplayListChar(0,0,s);
                }
        }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

沙发
ID:82098 发表于 2016-11-15 16:18 | 只看该作者
谢谢分享!
回复

使用道具 举报

板凳
ID:160495 发表于 2017-1-6 18:37 | 只看该作者
谢谢分享
回复

使用道具 举报

无效楼层,该帖已经被删除
5#
ID:239143 发表于 2017-10-13 14:11 | 只看该作者
666 谢谢分享
回复

使用道具 举报

6#
ID:267435 发表于 2018-7-18 21:23 | 只看该作者
谢谢分享啊
回复

使用道具 举报

7#
ID:379996 发表于 2018-8-15 13:45 | 只看该作者

谢谢分享啊
回复

使用道具 举报

8#
ID:303735 发表于 2018-9-29 11:57 | 只看该作者
谢谢。
回复

使用道具 举报

9#
无效楼层,该帖已经被删除
10#
ID:469791 发表于 2019-1-17 17:40 | 只看该作者
6666很棒
回复

使用道具 举报

11#
ID:603753 发表于 2022-4-6 08:17 | 只看该作者
谢谢分享,非常有用
回复

使用道具 举报

12#
ID:1019111 发表于 2022-4-18 13:20 | 只看该作者
请问这个程序可以改为2*2的矩阵键盘嘛?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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