找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外遥控程序源码

[复制链接]
跳转到指定楼层
楼主
ID:263709 发表于 2017-12-19 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
红外遥控程序源码

单片机源程序如下:
  1. /**********************************************黎明途电子************************************************************/       
  2. /**********************************************红外遥控器测试程序*******************************************/
  3. /*拨轮按键左显示心形 拨轮按键中全亮显示 拨轮按键右单层向上动态*/
  4. #include <STC12C5A60S2.H>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. char data menu,out,amenu,bb,num,cheng; //menu按键左,     out按键右,    amenu按键中,  bb延时变量,   num频谱显示,cheng行扫描变量,
  8. uchar data buffer[8]; //光立方显示一层的数据暂存数组
  9. /*定义管脚定义单片机用于发送数据给74HC595引脚和数据移位控制*/
  10. sbit SH_CP = P3^4; //SCK
  11. sbit ST_CP = P3^3;//RCK
  12. sbit DS    = P3^5;//SER
  13. sbit CH340 = P0^3;//SE
  14. sbit SH_CP2 = P2^6; //SCK2
  15. sbit ST_CP2 = P2^5;//RCK2
  16. sbit DS2    = P2^3;//SER2
  17. sbit RR=P3^6;//红
  18. sbit GG=P2^2;//绿
  19. sbit BB=P2^4;//蓝
  20. sbit ABL=P4^3;//亮度
  21. sbit k1=P0^4;//播放、暂停
  22. sbit k2=P0^5;//音量减
  23. sbit k3=P0^6;//音量加
  24. bit receive_sta=0;        //接受状态,表示数据是否接受完成
  25. sbit IRIN = P3^2;         //红外接收器数据线
  26. void IRdelay(char x);     //x*0.14MS
  27. unsigned char  IRCOM[7];

  28. /*******************************************************************/
  29. /**************************************************************************************************************************************/

  30. uchar code display1[8][8]={                 //图形1 全亮模式
  31. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第1层
  32. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第2层
  33. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第3层
  34. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第4层
  35. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第5层
  36. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第6层
  37. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第7层
  38. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第8层
  39. };
  40. uchar code display2[8][8]={                 //图形2 心形模式
  41. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第1层
  42. 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第2层
  43. 0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第3层
  44. 0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第4层
  45. 0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第5层
  46. 0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第6层
  47. 0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第7层
  48. 0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第8层
  49. };
  50. uchar code display3[8][8]={                 //图形3 每次亮一层动态模式
  51. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第1层
  52. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第2层
  53. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第3层
  54. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第4层
  55. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第5层
  56. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第6层
  57. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第7层
  58. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第8层
  59. };
  60. /*---------------   初始化   --------------*/
  61. void timer0init(void)
  62.         {       
  63.                                 TMOD=0X12;       
  64.                                 EX0=1;
  65.                                 ET0=1;                                 
  66.                                 EX1=0;
  67.                                 ET1=1;//定时器1开中断                               
  68.                                 EA=1;               
  69.                                 TH1=0xc0;
  70.                                 TL1=0;       
  71.                                 IPH|=0X01;
  72.                                 PX0=1;
  73.                                 IT0=1;
  74.                         P1M0=0X7F;
  75.                                 P1M1=0X80;
  76.                             P0M0=0xf8;        //P0口开漏输出
  77.                                 P0M1=0xf0;       
  78.                             P3M0=0x00;        //P3口准双向输出
  79.                                 P3M1=0X00;
  80.                                 P2M0=0x00;        //P2口准双向输出
  81.                                 P2M1=0X00;                       
  82.     }                        
  83. void initial595()         //列驱动初始化
  84. {
  85.                 SH_CP = 0;
  86.                 ST_CP = 0;
  87.                 DS = 0;
  88. }
  89.   void initial5952() //行驱动初始化
  90. {
  91.                 SH_CP2 = 0;
  92.                 ST_CP2 = 0;
  93.                 DS2 = 0;
  94. }
  95. /************************************延时函数**************************************************************/  
  96. void IRdelay(unsigned char x)//延时子程序
  97. {
  98.    unsigned char a,b;
  99.    while(x--)
  100.    {
  101.      for(b=6;b>0;b--)
  102.         for(a=127;a>0;a--);
  103.    }
  104. }                                                                                                                                                                                                                                                    //cheng行扫描变量,yanse颜色控制, liangdu亮度控制
  105. void delay(uint i)
  106. {                                                                                       
  107.         char b;
  108.         while (i--)
  109.         {
  110.            b=bb;
  111.                 while(b--);
  112.         }
  113. }
  114. void delay2(uint t)
  115. {
  116.         int i;
  117.         while(t--)
  118.         for(i=0;i<5;i++);
  119. }
  120. /************************************ 发送数据 ***************************************************************/
  121. void send_data(unsigned char d)//发送一层当中的一行显示数据,8位
  122. {
  123.                 unsigned char i;
  124.                 for(i=0;i<8;i++)
  125.                 {
  126.                         DS = d&0x80;//发送最低位
  127.                         SH_CP = 1;
  128.                         SH_CP = 0; //移位寄存器移位
  129.                         d = d<<1; //数据移位f
  130.                 }
  131. }

  132. void xiansi1()                              //一次发送1层,8行的显示数据,64位
  133. {       
  134.                 send_data(buffer[0]);          //u9
  135.                 send_data(buffer[1]);          //u8
  136.                 send_data(buffer[2]);          //u7
  137.                 send_data(buffer[3]);          //u6
  138.                 send_data(buffer[4]);          //u5
  139.                 send_data(buffer[5]);          //u4
  140.                 send_data(buffer[6]);          //u3
  141.                 send_data(buffer[7]);          //u2

  142. }
  143. /*************************************************主函数*******************************************************************/
  144. void main()
  145. {            
  146.            uchar d,dd,i,j,cheng;
  147.            timer0init();          
  148.            initial595();
  149.            initial5952();
  150.            ABL=0;
  151.            menu=1;
  152.            out=0;
  153.            bb=0;
  154.            RR=1;  //红色控制
  155.            GG=1;  //绿色控制
  156.            BB=0;  //蓝色控制
  157.            d=60000;
  158.            dd=60000;
  159.           
  160.   while(menu==1)                                         //显示全亮
  161.   {
  162.            static uchar layer=0;       
  163.           for(j=0;j<8;j++)                                 //LED正极驱动循环扫描8层
  164.           {                                       
  165.        for (i=0;i<8;i++)                         //循环8次,每一次将光立方的一层动画数据装入buffer[]数组
  166.        {
  167.         buffer[i]=display1[layer][i]; //调用层暂存数组将用于光立方显示的二维数组里的一层显示数据装入其中
  168.        }                                       
  169.                         xiansi1();                                 //单片机发送数据给74HC595                          
  170.                          cheng=0x01<<layer;                 //行移位,
  171.             DS2 = ~cheng&0x01;                 //发送层扫描数据
  172.                 SH_CP2 = 1;
  173.                 SH_CP2 = 0;                             //移位寄存器移位
  174.                 ST_CP=1;       
  175.             ST_CP=0;                                         //控制显示列
  176.                 ST_CP2=1;       
  177.             ST_CP2=0;                                         //控制显示层
  178.                 if (layer<7)
  179.                         layer++;             //为扫面上一层 做准备(光立方一个静止图形是从最底层开始扫描)
  180.                 else
  181.                         layer=0;      
  182.                                         delay(2);
  183.                                
  184.                 }
  185.              

  186.            }
  187.           while(amenu==1)                                         //显示心形
  188.   {
  189.            static uchar layer=0;       
  190.           for(j=0;j<8;j++)                                 //LED正极驱动循环扫描8层
  191.           {                                       
  192.        for (i=0;i<8;i++)                         //循环8次,每一次将光立方的一层动画数据装入buffer[]数组
  193.        {
  194.         buffer[i]=~display2[layer][i]; //调用层暂存数组将用于光立方显示的二维数组里的一层显示数据装入其中
  195.        }                                       
  196.                         xiansi1();                                 //单片机发送数据给74HC595                          
  197.                          cheng=0x01<<layer;                 //行移位,
  198.             DS2 = ~cheng&0x01;                 //发送层扫描数据
  199.                 SH_CP2 = 1;
  200.                 SH_CP2 = 0;                             //移位寄存器移位
  201.                 ST_CP=1;       
  202.             ST_CP=0;                                         //控制显示列
  203.                 ST_CP2=1;       
  204.             ST_CP2=0;                                         //控制显示层
  205.                 if (layer<7)
  206.                         layer++;             //为扫面上一层 做准备(光立方一个静止图形是从最底层开始扫描)
  207.                 else
  208.                         layer=0;      
  209.                                         delay(2);
  210.                    
  211.                 }
  212.              

  213.            }
  214.            while(out==1)                                 //一层一层的动态显示
  215.   {
  216.            static uchar layer=0;       
  217.           for(j=0;j<8;j++)                                 //LED正极驱动循环扫描8层
  218.           {                                       
  219.        for (i=0;i<8;i++)                         //循环8次,每一次将光立方的一层动画数据装入buffer[]数组
  220.        {
  221.         buffer[i]=display3[layer][i]; //调用层暂存数组将用于光立方显示的二维数组里的一层显示数据装入其中
  222.        }                                       
  223.                         xiansi1();                                 //单片机发送数据给74HC595                          
  224.                          cheng=0x01<<layer;                 //行移位,
  225.             DS2 = ~cheng&0x01;                 //发送层扫描数据
  226.                 SH_CP2 = 1;
  227.                 SH_CP2 = 0;                             //移位寄存器移位
  228.                 ST_CP=1;       
  229.             ST_CP=0;                                         //控制显示列
  230.                 ST_CP2=1;       
  231.             ST_CP2=0;                                         //控制显示层
  232.                 if (layer<7)
  233.                         layer++;             //为扫面上一层 做准备(光立方一个静止图形是从最底层开始扫描)
  234.                 else
  235.                         layer=0;
  236.                        
  237.                         if(out==0)
  238.                                {       
  239.                                     break;
  240.                                }      
  241.                                         delay(65535);
  242.                                         delay(65535);
  243.                                         delay(65535);
  244.                                         delay(65535);
  245.                 }
  246.              

  247.            }


  248. }

  249. void IR_IN(void) interrupt 0
  250. {
  251.   unsigned char j,k,N=0;
  252.      EX0 = 0;  
  253.           
  254.          IRdelay(15);
  255.          if (IRIN==1)
  256.      { EX0 =1;          
  257.            return;
  258.           }
  259.                            //确认IR信号出现
  260.   while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
  261.   {IRdelay(1);}

  262. for (j=0;j<4;j++)         //收集四组数据
  263. {
  264.   for (k=0;k<8;k++)        //每组数据有8位
  265.   {
  266.    while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  267.      {IRdelay(1);}
  268.     while (!IRIN)          //等 IR 变为高电平
  269.      {IRdelay(1);}
  270.      while (IRIN)           //计算IR高电平时长
  271.       {
  272.     IRdelay(1);
  273.     N++;           
  274.     if (N>=30)
  275.          { EX0=1;
  276.           
  277.          return;}                  //0.14ms计数过长自动离开。
  278.       }                        //高电平计数完毕               
  279.      IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
  280.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
  281.      N=0;
  282.   }//end for k
  283.           
  284. }//end for j
  285.    
  286.    if (IRCOM[2]!=~IRCOM[3])
  287.    { EX0=1;
  288.      return;          
  289.         }
  290.    
  291.                 if(IRCOM[2]==0x0c) //1键
  292.                         {                            //复位-音频
  293.                                      
  294.                                                 menu=1;
  295.                                                 out=0;
  296.                                                 amenu=0;                                                                        
  297.                                                 }                   
  298.                         if(IRCOM[2]==0x18 ) //2键
  299.                         {                                 //上位机
  300.                                                 menu=0;
  301.                                                 out=0;
  302.                                                 amenu=1;                                                                                         
  303.                                                 }
  304.                         if(IRCOM[2]==0x5e)        //3键
  305.                         {                                 // 脱机动画
  306.                                                 menu=0;
  307.                                                 out=1;
  308.                                            amenu=0;
  309.                                                 }
  310.                     if(IRCOM[2]==0x4a)         //9键
  311.                         {                                  
  312.                                        
  313.                                                 }
  314.                         if(IRCOM[2]==0x09)        //EQ键
  315.                         {                                 
  316.                                        
  317.                                             
  318.                                                 }
  319.                          if(IRCOM[2]==0x44) //<<键
  320.                         {                                //上一曲
  321.                                                 k3=0;
  322.                                                 delay2(20000);
  323.                                                 k3=1;
  324.                                                
  325.                                                 }
  326.                            if(IRCOM[2]==0x40) //>>键
  327.                         {                                 //下一曲
  328.                                                 k2=0;
  329.                                                 delay2(20000);
  330.                                                 k2=1;
  331. ……………………

  332. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
红外遥控程序源码.zip (39.92 KB, 下载次数: 17)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-12-19 16:45 | 只看该作者
楼主能附个原理图文件吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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