找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8978|回复: 11
收起左侧

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

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

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

使用道具 举报

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 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:239143 发表于 2017-10-13 14:11 | 显示全部楼层
666 谢谢分享
回复

使用道具 举报

ID:267435 发表于 2018-7-18 21:23 | 显示全部楼层
谢谢分享啊
回复

使用道具 举报

ID:379996 发表于 2018-8-15 13:45 | 显示全部楼层

谢谢分享啊
回复

使用道具 举报

ID:303735 发表于 2018-9-29 11:57 | 显示全部楼层
谢谢。
回复

使用道具 举报

ID:469791 发表于 2019-1-17 17:40 | 显示全部楼层
6666很棒
回复

使用道具 举报

ID:603753 发表于 2022-4-6 08:17 | 显示全部楼层
谢谢分享,非常有用
回复

使用道具 举报

ID:1019111 发表于 2022-4-18 13:20 | 显示全部楼层
请问这个程序可以改为2*2的矩阵键盘嘛?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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