找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3174|回復(fù): 1
收起左側(cè)

紅外遙控程序源碼

[復(fù)制鏈接]
ID:263709 發(fā)表于 2017-12-19 15:42 | 顯示全部樓層 |閱讀模式
紅外遙控程序源碼

單片機(jī)源程序如下:
  1. /**********************************************黎明途電子************************************************************/       
  2. /**********************************************紅外遙控器測試程序*******************************************/
  3. /*撥輪按鍵左顯示心形 撥輪按鍵中全亮顯示 撥輪按鍵右單層向上動(dòng)態(tài)*/
  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延時(shí)變量,   num頻譜顯示,cheng行掃描變量,
  8. uchar data buffer[8]; //光立方顯示一層的數(shù)據(jù)暫存數(shù)組
  9. /*定義管腳定義單片機(jī)用于發(fā)送數(shù)據(jù)給74HC595引腳和數(shù)據(jù)移位控制*/
  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;//藍(lán)
  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;        //接受狀態(tài),表示數(shù)據(jù)是否接受完成
  25. sbit IRIN = P3^2;         //紅外接收器數(shù)據(jù)線
  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 每次亮一層動(dòng)態(tài)模式
  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;//定時(shí)器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口準(zhǔn)雙向輸出
  79.                                 P3M1=0X00;
  80.                                 P2M0=0x00;        //P2口準(zhǔn)雙向輸出
  81.                                 P2M1=0X00;                       
  82.     }                        
  83. void initial595()         //列驅(qū)動(dòng)初始化
  84. {
  85.                 SH_CP = 0;
  86.                 ST_CP = 0;
  87.                 DS = 0;
  88. }
  89.   void initial5952() //行驅(qū)動(dòng)初始化
  90. {
  91.                 SH_CP2 = 0;
  92.                 ST_CP2 = 0;
  93.                 DS2 = 0;
  94. }
  95. /************************************延時(shí)函數(shù)**************************************************************/  
  96. void IRdelay(unsigned char x)//延時(shí)子程序
  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. /************************************ 發(fā)送數(shù)據(jù) ***************************************************************/
  121. void send_data(unsigned char d)//發(fā)送一層當(dāng)中的一行顯示數(shù)據(jù),8位
  122. {
  123.                 unsigned char i;
  124.                 for(i=0;i<8;i++)
  125.                 {
  126.                         DS = d&0x80;//發(fā)送最低位
  127.                         SH_CP = 1;
  128.                         SH_CP = 0; //移位寄存器移位
  129.                         d = d<<1; //數(shù)據(jù)移位f
  130.                 }
  131. }

  132. void xiansi1()                              //一次發(fā)送1層,8行的顯示數(shù)據(jù),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. /*************************************************主函數(shù)*******************************************************************/
  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;  //藍(lán)色控制
  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正極驅(qū)動(dòng)循環(huán)掃描8層
  164.           {                                       
  165.        for (i=0;i<8;i++)                         //循環(huán)8次,每一次將光立方的一層動(dòng)畫數(shù)據(jù)裝入buffer[]數(shù)組
  166.        {
  167.         buffer[i]=display1[layer][i]; //調(diào)用層暫存數(shù)組將用于光立方顯示的二維數(shù)組里的一層顯示數(shù)據(jù)裝入其中
  168.        }                                       
  169.                         xiansi1();                                 //單片機(jī)發(fā)送數(shù)據(jù)給74HC595                          
  170.                          cheng=0x01<<layer;                 //行移位,
  171.             DS2 = ~cheng&0x01;                 //發(fā)送層掃描數(shù)據(jù)
  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++;             //為掃面上一層 做準(zhǔn)備(光立方一個(gè)靜止圖形是從最底層開始掃描)
  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正極驅(qū)動(dòng)循環(huán)掃描8層
  191.           {                                       
  192.        for (i=0;i<8;i++)                         //循環(huán)8次,每一次將光立方的一層動(dòng)畫數(shù)據(jù)裝入buffer[]數(shù)組
  193.        {
  194.         buffer[i]=~display2[layer][i]; //調(diào)用層暫存數(shù)組將用于光立方顯示的二維數(shù)組里的一層顯示數(shù)據(jù)裝入其中
  195.        }                                       
  196.                         xiansi1();                                 //單片機(jī)發(fā)送數(shù)據(jù)給74HC595                          
  197.                          cheng=0x01<<layer;                 //行移位,
  198.             DS2 = ~cheng&0x01;                 //發(fā)送層掃描數(shù)據(jù)
  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++;             //為掃面上一層 做準(zhǔn)備(光立方一個(gè)靜止圖形是從最底層開始掃描)
  207.                 else
  208.                         layer=0;      
  209.                                         delay(2);
  210.                    
  211.                 }
  212.              

  213.            }
  214.            while(out==1)                                 //一層一層的動(dòng)態(tài)顯示
  215.   {
  216.            static uchar layer=0;       
  217.           for(j=0;j<8;j++)                                 //LED正極驅(qū)動(dòng)循環(huán)掃描8層
  218.           {                                       
  219.        for (i=0;i<8;i++)                         //循環(huán)8次,每一次將光立方的一層動(dòng)畫數(shù)據(jù)裝入buffer[]數(shù)組
  220.        {
  221.         buffer[i]=display3[layer][i]; //調(diào)用層暫存數(shù)組將用于光立方顯示的二維數(shù)組里的一層顯示數(shù)據(jù)裝入其中
  222.        }                                       
  223.                         xiansi1();                                 //單片機(jī)發(fā)送數(shù)據(jù)給74HC595                          
  224.                          cheng=0x01<<layer;                 //行移位,
  225.             DS2 = ~cheng&0x01;                 //發(fā)送層掃描數(shù)據(jù)
  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++;             //為掃面上一層 做準(zhǔn)備(光立方一個(gè)靜止圖形是從最底層開始掃描)
  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.                            //確認(rèn)IR信號(hào)出現(xiàn)
  260.   while (!IRIN)            //等IR變?yōu)楦唠娖剑^9ms的前導(dǎo)低電平信號(hào)。
  261.   {IRdelay(1);}

  262. for (j=0;j<4;j++)         //收集四組數(shù)據(jù)
  263. {
  264.   for (k=0;k<8;k++)        //每組數(shù)據(jù)有8位
  265.   {
  266.    while (IRIN)            //等 IR 變?yōu)榈碗娖剑^4.5ms的前導(dǎo)高電平信號(hào)。
  267.      {IRdelay(1);}
  268.     while (!IRIN)          //等 IR 變?yōu)楦唠娖?br />
  269.      {IRdelay(1);}
  270.      while (IRIN)           //計(jì)算IR高電平時(shí)長
  271.       {
  272.     IRdelay(1);
  273.     N++;           
  274.     if (N>=30)
  275.          { EX0=1;
  276.           
  277.          return;}                  //0.14ms計(jì)數(shù)過長自動(dòng)離開。
  278.       }                        //高電平計(jì)數(shù)完畢               
  279.      IRCOM[j]=IRCOM[j] >> 1;                  //數(shù)據(jù)最高位補(bǔ)“0”
  280.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數(shù)據(jù)最高位補(bǔ)“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.                         {                            //復(fù)位-音頻
  293.                                      
  294.                                                 menu=1;
  295.                                                 out=0;
  296.                                                 amenu=0;                                                                        
  297.                                                 }                   
  298.                         if(IRCOM[2]==0x18 ) //2鍵
  299.                         {                                 //上位機(jī)
  300.                                                 menu=0;
  301.                                                 out=0;
  302.                                                 amenu=1;                                                                                         
  303.                                                 }
  304.                         if(IRCOM[2]==0x5e)        //3鍵
  305.                         {                                 // 脫機(jī)動(dòng)畫
  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黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
紅外遙控程序源碼.zip (39.92 KB, 下載次數(shù): 17)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2017-12-19 16:45 | 顯示全部樓層
樓主能附個(gè)原理圖文件嗎?
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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