找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9010|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

紅外遙控器+紅外一體化接收頭部分的仿真

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
     紅外線編碼是數(shù)據(jù)傳輸和家用電器遙控常用的一種通訊方法,其實(shí)質(zhì)是一種脈寬調(diào)制的串行通訊。家電遙控
中常用的紅外線編碼電路有μPD6121G型HT622型和7461型等。
    這里就以這些電路的編碼格式來(lái)仿真怎樣使用單片機(jī)的捕獲中斷功能來(lái)實(shí)現(xiàn)其解碼。    紅外線通訊的發(fā)送部
分主要是把待發(fā)送的數(shù)據(jù)轉(zhuǎn)換成一定格式的脈沖,然后驅(qū)動(dòng)紅外發(fā)光管向外發(fā)送數(shù)據(jù)。接收部分則是完成紅外
線的接收、放大、解調(diào),還原成同步發(fā)射格式相同(但高、低電位剛好相反的脈沖信號(hào))。這些工作通常由一體
化的接收頭來(lái)完成,主要輸出TTL兼容電平。最后通過(guò)解碼把脈沖信號(hào)轉(zhuǎn)換成數(shù)據(jù),從而實(shí)現(xiàn)數(shù)據(jù)的傳輸。
   本單元就是來(lái)完成一體化接收頭接受到的紅外遙控器編碼后的輸出數(shù)據(jù),所以只要單片機(jī)完成本單元的解碼任
務(wù),并成功實(shí)現(xiàn)之后,只要將IR引腳接上紅外接收頭之后就可以實(shí)現(xiàn)紅外遙控的功能了。
  這是我積累前人經(jīng)驗(yàn)和自己實(shí)踐的成果,并且已經(jīng)有硬件的成功案例,并非只是理論.


所有資料下載: 紅外遙控模擬.rar (88.78 KB, 下載次數(shù): 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);                    //顯示指定坐標(biāo)的一串字符子函數(shù)

  19. void timer1int (void)  interrupt 3  using 3{         //定時(shí)器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{         //定時(shí)器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. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

來(lái)自 2#
ID:437129 發(fā)表于 2024-12-19 14:05 | 只看該作者
感謝樓主無(wú)私奉獻(xiàn)的分享。
原程序只有LCD屏幕顯示遙控器鍵值,發(fā)光二極管沒(méi)有點(diǎn)亮。
在樓主的基礎(chǔ)上增加了點(diǎn)燈功能,分享給大家。
#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);
                }
        }
}

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:82098 發(fā)表于 2016-11-15 16:18 | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報(bào)

地板
ID:160495 發(fā)表于 2017-1-6 18:37 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

5#
ID:239143 發(fā)表于 2017-10-13 14:11 | 只看該作者
666 謝謝分享
回復(fù)

使用道具 舉報(bào)

6#
ID:267435 發(fā)表于 2018-7-18 21:23 | 只看該作者
謝謝分享啊
回復(fù)

使用道具 舉報(bào)

7#
ID:379996 發(fā)表于 2018-8-15 13:45 | 只看該作者

謝謝分享啊
回復(fù)

使用道具 舉報(bào)

8#
ID:303735 發(fā)表于 2018-9-29 11:57 | 只看該作者
謝謝。
回復(fù)

使用道具 舉報(bào)

9#
ID:469791 發(fā)表于 2019-1-17 17:40 | 只看該作者
6666很棒
回復(fù)

使用道具 舉報(bào)

10#
ID:603753 發(fā)表于 2022-4-6 08:17 | 只看該作者
謝謝分享,非常有用
回復(fù)

使用道具 舉報(bào)

11#
ID:1019111 發(fā)表于 2022-4-18 13:20 | 只看該作者
請(qǐng)問(wèn)這個(gè)程序可以改為2*2的矩陣鍵盤嘛?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表