找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2142|回复: 0
收起左侧

这是我做的一个单片机万能红外解码器PCB+源程序

[复制链接]
ID:452570 发表于 2018-12-23 13:26 | 显示全部楼层 |阅读模式
出于兴趣做的万能红外解码器,请大家多多指教。
本设计基于51单片机设计
主要功能可以解读红外的用户码和地址码
可以通过不同按键控制同一继电器并且保存按键值
0.png

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png

单片机源程序如下:
  1.                
  2. #include<reg52.h>
  3. #include"bst_car.h"
  4. #include"led.h"  
  5. #include "uart.h"
  6. #define uchar  unsigned char
  7. #define uint  unsigned int
  8. #define Imax 14000    //此处为晶振为11.0592时的取值,
  9. #define Imin 8000    //如用其它频率的晶振时,
  10. #define Inum1 1450    //要改变相应的取值。
  11. #define Inum2 700
  12. #define Inum3 3000
  13. sbit s1=P2^1;
  14. sbit s2=P2^4;
  15. sbit s3=P2^3;
  16. sbit s4=P2^2;
  17. sbit fmq=P2^0;

  18. sbit s11=P3^7;
  19. sbit s12=P3^6;
  20. sbit s13=P3^5;
  21. sbit s14=P3^4;
  22. unsigned char flag_REC;
  23. unsigned char buff[20]=0;

  24. unsigned char f=0,aa,zz,cc,cc1,dd;
  25. unsigned char Im[4]={0x00,0x00,0x00,0x00};
  26. unsigned char show[2]={0,0};
  27. unsigned long m,Tc;
  28. unsigned char IrOK;
  29. uchar code Tab1[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//"0123456789ABCDEF";
  30. uchar Tab2[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  31. /************************************************************************/        

  32.   void delayms(uchar x)
  33.   {
  34.     unsigned int i,j;
  35.     for(i=0;i<x;i++)
  36.      for(j=0;j<110;j++)
  37.          ;
  38.    }
  39.          
  40. /*--主函数--*/
  41. void jieshou()
  42. {
  43.           if(Im[2]==Tab2[1])
  44.                    {
  45.                      aa=aa;
  46.                         }
  47.                         else
  48.                         if(Im[2]==Tab2[2])
  49.                    {
  50.                      aa=aa;
  51.                    }
  52.                    else
  53.                    if(Im[2]==Tab2[3])
  54.                    {
  55.                      aa=aa;
  56.                         }
  57.                         else
  58.                         if(Im[2]==Tab2[4])
  59.                    {
  60.                      aa=aa;
  61.                    }
  62.                    else
  63.                     if(Im[2]==Tab2[5])
  64.                    {
  65.                      aa=aa;
  66.                         }
  67.                         else
  68.                         if(Im[2]==Tab2[6])
  69.                    {
  70.                      aa=aa;
  71.                    }
  72.                    else
  73.                    if(Im[2]==Tab2[7])
  74.                    {
  75.                      aa=aa;
  76.                         }
  77.                         else
  78.                         if(Im[2]==Tab2[8])
  79.                    {
  80.                      aa=aa;
  81.                    }
  82.                            else
  83.                    if(Im[2]==Tab2[9])
  84.                    {
  85.                      aa=aa;
  86.                         }
  87.                         else
  88.                         if(Im[2]==Tab2[10])
  89.                    {
  90.                      aa=aa;
  91.                    }
  92.                    else
  93.                    if(Im[2]==Tab2[11])
  94.                    {
  95.                      aa=aa;
  96.                         }
  97.                         else
  98.                         if(Im[2]==Tab2[12])
  99.                    {
  100.                      aa=aa;
  101.                    }
  102.                    else
  103.                     if(Im[2]==Tab2[13])
  104.                    {
  105.                      aa=aa;
  106.                         }
  107.                         else
  108.                         if(Im[2]==Tab2[14])
  109.                    {
  110.                      aa=aa;
  111.                    }
  112.                    else
  113.                    if(Im[2]==Tab2[15])
  114.                    {
  115.                      aa=aa;
  116.                         }
  117.                         else
  118.                         if(Im[2]==Tab2[16])
  119.                    {
  120.                      aa=aa;
  121.                    }
  122.                            else
  123.                         if(Im[2]==Tab2[17])
  124.                    {
  125.                      aa=aa;
  126.                         }
  127.                         else
  128.                         if(Im[2]==Tab2[18])
  129.                    {
  130.                      aa=aa;
  131.                    }
  132.                    else
  133.                    if(Im[2]==Tab2[19])
  134.                    {
  135.                      aa=aa;
  136.                         }
  137.                         else
  138.                         if(Im[2]==Tab2[20])
  139.                    {
  140.                      aa=aa;
  141.                    }
  142.                    else
  143.                     if(Im[2]==Tab2[21])
  144.                    {
  145.                      aa=aa;
  146.                         }
  147.                         else
  148.                         if(Im[2]==Tab2[22])
  149.                    {
  150.                      aa=aa;
  151.                    }
  152.                    else
  153.                    if(Im[2]==Tab2[23])
  154.                    {
  155.                      aa=aa;
  156.                         }
  157.                         else
  158.                         if(Im[2]==Tab2[24])
  159.                    {
  160.                      aa=aa;
  161.                    }
  162.                            else
  163.                         {aa=aa+1;}
  164. }
  165. void shuju()
  166. {
  167.    Tab2[aa]=Im[2];
  168.                
  169.                         if(Im[2]==Tab2[1])
  170.                         {
  171.                           
  172.                            s1=~s1;
  173.                            LcdWriteCom(0x84);
  174.                            LcdWriteData('0'+0);
  175.                            LcdWriteData('0'+1);
  176.                            
  177.                         }
  178.                         else
  179.                         if(Im[2]==Tab2[2])
  180.                         {
  181.                         
  182.                             LcdWriteCom(0x84);
  183.                                 LcdWriteData('0'+0);
  184.                            LcdWriteData('0'+2);
  185.                            s2=~s2;
  186.                         }
  187.                         else
  188.                          if(Im[2]==Tab2[3])
  189.                         
  190.                         {
  191.                         
  192.                                  s3=~s3;
  193.                                  LcdWriteCom(0x84);
  194.                                  LcdWriteData('0'+0);
  195.                                    LcdWriteData('0'+3);
  196.                         
  197.                         }
  198.                         else
  199.                         if(Im[2]==Tab2[4])
  200.                         {
  201.                         
  202.                                 s4=~s4;
  203.                             LcdWriteCom(0x84);
  204.                                 LcdWriteData('0'+0);
  205.                            LcdWriteData('0'+4);
  206.                            
  207.                         }
  208.                         else
  209.                         
  210.                         
  211. //                        {        dd=1;
  212. //                                   TMOD= 0X20;
  213.                          if(Im[2]==Tab2[5])
  214.             {
  215.                                 dd=dd+1;
  216.                             LcdWriteCom(0x84);
  217.                                 LcdWriteData('0'+0);
  218.                            LcdWriteData('0'+5);
  219.                         }
  220.                         else
  221.                         if(Im[2]==Tab2[6])
  222.                         {
  223.                           //  dd=0;
  224.                           //  TMOD= 0X11;
  225.                                  
  226.                             LcdWriteCom(0x84);
  227.                                 LcdWriteData('0'+0);
  228.                            LcdWriteData('0'+6);
  229.                         }
  230.                         else
  231.                          if(Im[2]==Tab2[7])
  232.                         
  233.                         {
  234.                         
  235.                             LcdWriteCom(0x84);
  236.                                 LcdWriteData('0'+0);
  237.                            LcdWriteData('0'+7);
  238.                         }
  239.                         else
  240.                         if(Im[2]==Tab2[8])
  241.                         {
  242.                            
  243.                             LcdWriteCom(0x84);
  244.                                 LcdWriteData('0'+0);
  245.                            LcdWriteData('0'+8);
  246.                         }
  247.                         else
  248.                         if(Im[2]==Tab2[9])
  249.                         {
  250.                         
  251.                             LcdWriteCom(0x84);
  252.                                 LcdWriteData('0'+0);
  253.                            LcdWriteData('0'+9);
  254.                         }
  255.                         else
  256.                         if(Im[2]==Tab2[10])
  257.                         {
  258.                         
  259.                             LcdWriteCom(0x84);
  260.                                 LcdWriteData('0'+1);
  261.                            LcdWriteData('0'+0);
  262.                         }
  263.                         else
  264.                         if(Im[2]==Tab2[11])
  265.                         {
  266.                         
  267.                             LcdWriteCom(0x84);
  268.                                 LcdWriteData('0'+1);
  269.                            LcdWriteData('0'+1);
  270.                         }
  271.                         else
  272.                         if(Im[2]==Tab2[12])
  273.                         {
  274.                         
  275.                             LcdWriteCom(0x84);
  276.                                 LcdWriteData('0'+1);
  277.                            LcdWriteData('0'+2);
  278.                         }
  279.                         else
  280.                         if(Im[2]==Tab2[13])
  281.                         {
  282.                         
  283.                             LcdWriteCom(0x84);
  284.                                 LcdWriteData('0'+1);
  285.                            LcdWriteData('0'+3);
  286.                         }          else
  287.                         if(Im[2]==Tab2[14])
  288.                         {
  289.                         
  290.                             LcdWriteCom(0x84);
  291.                                 LcdWriteData('0'+1);
  292.                            LcdWriteData('0'+4);
  293.                         }
  294.                         else
  295.                         if(Im[2]==Tab2[15])
  296.                         {
  297.                         
  298.                             LcdWriteCom(0x84);
  299.                                 LcdWriteData('0'+1);
  300.                            LcdWriteData('0'+5);
  301.                         }
  302.                         else
  303.                         if(Im[2]==Tab2[16])
  304.                         {
  305.                         
  306.                             LcdWriteCom(0x84);
  307.                                 LcdWriteData('0'+1);
  308.                            LcdWriteData('0'+6);
  309.                         }
  310.                         else
  311.                         if(Im[2]==Tab2[17])
  312.                         {
  313.                         
  314.                             LcdWriteCom(0x84);
  315.                                 LcdWriteData('0'+1);
  316.                            LcdWriteData('0'+7);
  317.                         }
  318.                                 else
  319.                         if(Im[2]==Tab2[18])
  320.                         {
  321.                         
  322.                             LcdWriteCom(0x84);
  323.                                 LcdWriteData('0'+1);
  324.                            LcdWriteData('0'+8);
  325.                         }
  326.                         else
  327.                         if(Im[2]==Tab2[19])
  328.                         {                                 
  329.                         
  330.                             LcdWriteCom(0x84);
  331.                                 LcdWriteData('0'+1);
  332.                            LcdWriteData('0'+9);
  333.                         }
  334.                         else
  335.                         if(Im[2]==Tab2[20])
  336.                         {
  337.                         
  338.                             LcdWriteCom(0x84);
  339.                                 LcdWriteData('0'+2);
  340.                            LcdWriteData('0'+0);
  341.                         }
  342.                         else
  343.                         if(Im[2]==Tab2[21])
  344.                         {
  345.                         
  346.                             LcdWriteCom(0x84);
  347.                                 LcdWriteData('0'+2);
  348.                            LcdWriteData('0'+1);
  349.                         }                else
  350.                         if(Im[2]==Tab2[22])
  351.                         {
  352.                         
  353.                             LcdWriteCom(0x84);
  354.                                 LcdWriteData('0'+2);
  355.                            LcdWriteData('0'+2);
  356.                         }
  357.                         else
  358.                         if(Im[2]==Tab2[23])
  359.                         {
  360.                         
  361.                             LcdWriteCom(0x84);
  362.                                 LcdWriteData('0'+2);
  363.                            LcdWriteData('0'+3);
  364.                         }
  365.                         else
  366.                         if(Im[2]==Tab2[24])
  367.                         {
  368.                         
  369.                             LcdWriteCom(0x84);
  370.                                 LcdWriteData('0'+2);
  371.                            LcdWriteData('0'+4);
  372.                         }
  373.                         else
  374.                         if(Im[2]==Tab2[25])
  375.                         {
  376.                         
  377.                             LcdWriteCom(0x84);
  378.                                 LcdWriteData('0'+2);
  379.                            LcdWriteData('0'+5);
  380.                         }
  381. }
  382. void xianshi()
  383.   {
  384.            
  385.                         LcdWriteCom(0x8A);
  386.                            if(cc==0xa)
  387.                                 {
  388.                              LcdWriteData('A');
  389.                                 }
  390.                                  else
  391.                                  if(cc==0xb)
  392.                                 {
  393.                              LcdWriteData('B');
  394.                                 }
  395.                                 else
  396.                                  if(cc==0xc)
  397.                                 {
  398.                              LcdWriteData('C');
  399.                                 }else
  400.                                  if(cc==0xd)
  401.                                 {
  402.                              LcdWriteData('D');
  403.                                 }else
  404.                                  if(cc==0xe)
  405.                                 {
  406.                              LcdWriteData('E');
  407.                                 }else
  408.                                  if(cc==0xf)
  409.                                 {
  410.                              LcdWriteData('F');
  411.                                 }
  412.                                 else
  413.                             LcdWriteData('0'+Tab1[cc]);

  414.                         
  415.                             if(cc1==0xa)
  416.                                 {
  417.                              LcdWriteData('A');
  418.                                 }
  419.                                  else
  420.                                  if(cc1==0xb)
  421.                                 {
  422.                              LcdWriteData('B');
  423.                                 }
  424.                                 else
  425.                                  if(cc1==0xc)
  426.                                 {
  427.                              LcdWriteData('C');
  428.                                 }else
  429.                                  if(cc1==0xd)
  430.                                 {
  431.                              LcdWriteData('D');
  432.                                 }else
  433.                                  if(cc1==0xe)
  434.                                 {
  435.                              LcdWriteData('E');
  436.                                 }else
  437.                                  if(cc1==0xf)
  438.                                 {
  439.                              LcdWriteData('F');
  440.                                 }
  441.                            else
  442.                            LcdWriteData('0'+Tab1[cc1]);


  443.   }        
  444. void lanya()
  445. {
  446.   if(flag_REC==1)                                    //
  447.              {
  448.                      flag_REC=0;
  449.                     if(buff[0]=='o')        //第一个字节为O,第二个字节为N,第三个字节为控制码
  450.                         
  451.                             switch(buff[1])
  452.                         {
  453.                               case '1' :                                                
  454.                                    if(buff[2]=='0')
  455.                                   s1=1;
  456.                                   else
  457.                                   s1=0;
  458.                                   break;
  459.                               case '2':                                         
  460.                                    if(buff[2]=='0')
  461.                                   s2=1;
  462.                                   else
  463.                                   s2=0;
  464.                                   break;                                   
  465.                               case '3':                                         
  466.                                    if(buff[2]=='0')
  467.                                   s3=1;
  468.                                   else
  469.                                   s3=0;
  470.                                   break;
  471.                               case '4':                                 
  472.                                    if(buff[2]=='0')
  473.                                   s4=1;
  474.                                   else
  475.                                   s4=0;
  476.                                   break;
  477.                                   case '5':                                 
  478.                                    if(buff[2]=='0')
  479.                                   dd=1;
  480.                                   else
  481.                                   dd=0;
  482.                                   break;                        
  483.                           }        
  484.                          LcdWriteCom(0xC7);
  485.                         LcdWriteData('O');
  486.                         LcdWriteData('0'+buff[1]);
  487.                         LcdWriteData('0'+buff[2]);                                   
  488.               }
  489.                
  490. }
  491. void hwint()
  492. {
  493.     s11=s12=s13=s14=0;
  494.            m=0;
  495.     f=1;
  496.     IT0=1;
  497.     EX0=1;
  498.     TMOD=0x11;  
  499.     TH0=0;
  500.         TL0=0;
  501.     TR0=1;
  502.         EA=1;
  503. }
  504. void main(void)
  505. {
  506.         LcdInit();
  507.          hwint();
  508.            
  509.           aa=0;
  510.          LcdWriteCom(0x80);
  511.                         LcdWriteData('H');
  512.                         LcdWriteData('W');
  513.                 LcdWriteCom(0xC0);
  514.                         LcdWriteData('L');
  515.                         LcdWriteData('A');
  516.                         LcdWriteData('N');
  517.                         LcdWriteData('Y');
  518.                         LcdWriteData('A');
  519.                         LcdWriteCom(0x88);
  520.                         LcdWriteData('0');
  521.                         LcdWriteData('X');
  522.         while(1)                                                        /*无限循环*/
  523.         {  
  524.                   
  525.                
  526.             if(IrOK==1)                           //如果处理好后进行红外处理
  527.         {        
  528.                   
  529.                     shuju();
  530.                         xianshi();
  531.             IrOK=0;
  532.                         LcdWriteCom(0x8e);
  533.                         LcdWriteData('0'+dd);
  534.                          delayms(1000);
  535.                         EA=1;
  536.         }
  537.          if(dd==3)
  538.           {
  539.             dd=0;
  540.                 Uart_init();
  541.                 while(1)
  542.                  {
  543.                    lanya();
  544.                    LcdWriteCom(0x8e);
  545.                    LcdWriteData('0'+dd);
  546.                    if(dd==1)
  547.                     {
  548.                           dd=0;
  549.                           hwint();
  550.                           break;
  551.                         }
  552.                  }
  553.           }
  554.           if(s11==1)
  555.            {
  556.              s1=~s1;
  557.                  while(!s11);
  558.            }
  559.            if(s12==1)
  560.            {
  561.              s2=~s2;
  562.                  while(!s12);
  563.            }
  564.            if(s13==1)
  565.            {
  566.              s3=~s3;
  567.                  while(!s13);
  568.            }
  569.            if(s14==1)
  570.            {
  571.              s4=~s4;
  572.                  while(!s14);
  573.            }

  574.          }
  575. }
  576. /************************************************************************/        
  577. //外部中断解码程序
  578. void intersvr0(void) interrupt 1 using 1
  579. {
  580.     Tc=TH0*256+TL0;      //提取中断时间间隔时长
  581.     TH0=0;
  582.     TL0=0;              //定时中断重新置零
  583.     if((Tc>Imin)&&(Tc<Imax))
  584.     {
  585.         m=0;
  586.         f=1;
  587.         return;
  588.     }       //找到启始码

  589.     if(f==1)
  590.     {
  591.         if(Tc>Inum1&&Tc<Inum3)
  592.         {
  593.             Im[m/8]=Im[m/8]>>1|0x80; m++;
  594.         }
  595.         if(Tc>Inum2&&Tc<Inum1)
  596.         {
  597.          Im[m/8]=Im[m/8]>>1; m++; //取码
  598.         }
  599.         if(m==32)
  600.         {
  601.          m=0;  
  602.          f=0;
  603.          if(Im[2]==~Im[3])
  604.         {
  605.            IrOK=1;
  606.                    jieshou();
  607.                    cc=Im[2]/0x10;
  608.                         cc1=Im[2]%0x10;
  609.                         fmq=0;
  610.                         delayms(100);
  611.                         fmq=1;
  612.                         delayms(100);
  613.                         EA=0;
  614.                         if(Im[2]==Tab2[aa])
  615.                           {
  616.                             delayms(200);
  617.                                  {
  618.                                   if(Im[2]==Tab2[aa])
  619.                                     {
  620.                                           delayms(2100);
  621.                                         }
  622.                                  }
  623.                           }
  624.         }
  625.         else IrOK=0;   //取码完成后判断读码是否正确
  626.         }
  627.                //准备读下一码
  628.    }

  629. }
  630. void uart_rx(void)  interrupt 4        using 3          //放在这里 和放在main()里面是一样的
  631. {

  632.            unsigned char i;
  633.         unsigned char flag;
  634.         unsigned char dat;
  635.     if(RI)                         //是否接收中断
  636.     {
  637.        RI=0;
  638.        dat=SBUF;
  639.        if(dat=='o'&&(i==0)) //接收数据第一帧
  640.        {
  641.             buff[i]=dat;
  642.             flag=1;        //开始接收数据
  643.        }
  644.        else
  645.               if(flag==1)
  646.               {
  647.                       i++;
  648.                       buff[i]=dat;
  649.                       if(i>=2)
  650.                   {
  651.                            i=0;
  652.                            flag=0;
  653.                            flag_REC=1 ;
  654.                       }  // 停止接收
  655.               }
  656.          }

  657. }
  658.                
复制代码

所有资料51hei提供下载:
程序PCB.7z (1.23 MB, 下载次数: 45)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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