久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8945|回復: 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 踩
回復

使用道具 舉報

來自 2#
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#
ID:469791 發表于 2019-1-17 17:40 | 只看該作者
6666很棒
回復

使用道具 舉報

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

使用道具 舉報

11#
ID:1019111 發表于 2022-4-18 13:20 | 只看該作者
請問這個程序可以改為2*2的矩陣鍵盤嘛?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 69福利影院 | 人人玩人人干 | 久久精品中文字幕 | 欧美成人一区二免费视频软件 | 久久美女网| 欧美在线不卡 | 能看的av网站 | 久久一区二区精品 | 欧美日韩综合一区 | 日本视频在线 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 狠狠干在线 | 在线啊v| 91久久久久久久久久久久久 | 人人99 | 国产精品视频导航 | 久久网亚洲 | 日韩激情一区 | 99re6在线视频精品免费 | 国产女人与拘做受免费视频 | 91 久久 | 国产91黄色| 精品国产伦一区二区三区观看方式 | 久久久久久久久91 | 亚洲 欧美 日韩 在线 | 中文字幕视频在线观看 | 91在线视频播放 | 国产亚洲精品久久久久动 | 国产一区二 | 99pao成人国产永久免费视频 | 国产成人精品久久 | 国产美女网站 | 欧美在线观看免费观看视频 | 欧日韩在线 | 国产福利视频网站 | www.久草| 在线免费观看a级片 | 久久成人精品视频 | 欧美一级高潮片免费的 | 天天影视亚洲综合网 | 国产精品欧美一区二区 |