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

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)紅外遙控鍵值讀取器程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:41347 發(fā)表于 2021-2-3 17:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. /********************************************************************************
  2. *  描述:                                                                       *
  3. *         數(shù)碼管顯示 遙控鍵值讀取器                                            *
  4. *         遙控器接p3.2                                                         *
  5. *                                                                              *
  6. *                                                                              *
  7. *                                                                              *
  8. *******************************************************************************/
  9. #include <reg51.h>
  10. #include <intrins.h>
  11. #define  NOP() _nop_()  /* 定義空指令 */

  12. //譯碼器管腳定義
  13. sbit    LS138A=P2^2;       //管腳定義
  14. sbit    LS138B=P2^3;
  15. sbit    LS138C=P2^4;

  16. sbit RELAY= P2^0;         //繼電器驅(qū)動(dòng)線
  17. sbit RELAY1= P2^1;         //繼電器驅(qū)動(dòng)線
  18. sbit RELAY2= P2^5;         //繼電器驅(qū)動(dòng)線
  19. sbit RELAY3= P2^6;         //繼電器驅(qū)動(dòng)線
  20. sbit RELAY4= P2^7;         //繼電器驅(qū)動(dòng)線

  21. unsigned char Y0;


  22. //此表為 LED 的字模, 共陰數(shù)碼管 0-9  -
  23. unsigned char code Disp_Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

  24. unsigned long  LedOut[5],LedNumVal;
  25. extern  unsigned char  IRCOM[7];

  26. void delay(unsigned int i);      //函數(shù)聲名
  27. void display(unsigned char Key_Val);
  28. extern void IRInit();    //extern 是引用IR.C中的函數(shù)


  29. main()
  30. {
  31.           IRInit();
  32.         while(1)
  33.         {
  34.     //顯示紅外鍵碼
  35.         display(IRCOM[2]);

  36.    }
  37.             
  38. }

  39. void delay(unsigned int i)
  40. {
  41.     char j;
  42.     for(i; i > 0; i--)
  43.         for(j = 200; j > 0; j--);
  44. }


  45. void display(unsigned char Key_Val)
  46. {  
  47.    unsigned char i;
  48.    /********以下將鍵值送到LED數(shù)碼管顯示*************/
  49.       LedNumVal=Key_Val;      //把鍵值送到LedNumVal變量中
  50.           LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
  51.       LedOut[1]=Disp_Tab[LedNumVal%1000/100];
  52.       LedOut[2]=Disp_Tab[LedNumVal%100/10];         //十位
  53.       LedOut[3]=Disp_Tab[LedNumVal%10];    //個(gè)位
  54.             
  55.     for(i=0; i<4; i++)
  56.          
  57.             
  58.          
  59.           {               
  60.                  P0 = LedOut[i] ;
  61.                                                               
  62.                 switch(i)                                          
  63.          {                      //138譯碼
  64.                         case 3:LS138A=0; LS138B=0; LS138C=0; break;         
  65.             case 2:LS138A=1; LS138B=0; LS138C=0; break;                     
  66.             case 1:LS138A=0; LS138B=1; LS138C=0; break;
  67.             case 0:LS138A=1; LS138B=1; LS138C=0; break;
  68.          }
  69.                  
  70.                 delay(100);
  71.           }

  72.           P0 = 0;  


  73.   Y0=0;
  74.          switch(IRCOM[2])
  75.          {
  76.            case 0x16: Y0=0x01; break;
  77.            case 0x0c: Y0=0x02; break;
  78.            case 0x08: Y0=0x03; break;
  79.            case 0x42: Y0=0x04; break;
  80.            case 0x18: Y0=0x05; break;
  81.            case 0x1B: Y0=0x06; break;
  82.            case 0x11: Y0=0x07; break;
  83.            case 0x15: Y0=0x08; break;
  84.            case 0x17: Y0=0x09; break;

  85.           case 0x13: RELAY=1; break;
  86.           case 0x14: RELAY=1; break;
  87.           case 0x51: RELAY=0; break;
  88.          }

  89.         
  90.         
  91.         
  92.         if(Y0==0x01)RELAY=0;//打開(kāi)繼電器
  93.         else RELAY=1;
  94.         if(Y0==0x02)RELAY1=0;
  95.         else RELAY1=1; //關(guān)閉繼電器
  96.         if(Y0==0x03)RELAY2=0;
  97.         else RELAY2=1;
  98.         if(Y0==0x04)RELAY3=0;
  99.         else RELAY3=1;
  100.         if(Y0==0x05)RELAY4=0;
  101.         else RELAY4=1;




  102. }
復(fù)制代碼


  1. /********************************************************************************
  2. *  描述:                                                                        *
  3. *         數(shù)碼管顯示 遙控鍵值讀取器                                             *
  4. *          遙控器接p3.2                                                         *
  5. *  現(xiàn)象:當(dāng)按遙控器時(shí),按下事 數(shù)碼管會(huì)有閃爍,為什么會(huì)閃爍呢                    *
  6. *                                                                               *
  7. *         連接方法:使用紅外功能時(shí) J1跳線短接                                   *
  8. *****************************************************************************8**/

  9. #include <reg51.h>

  10. sbit IRIN = P3^2;         //紅外接收器數(shù)據(jù)線


  11. void IRdelay(char x);  //x*0.14MS
  12. void beep();

  13. unsigned char  IRCOM[7];
  14. extern unsigned char Y0;
  15. extern void display(unsigned char Key_Val);
  16. /*******************************************************************/
  17. void IRInit()
  18. {
  19.     IE |= 0x81;                 //允許總中斷中斷,使能 INT0 外部中斷
  20.     TCON |= 0x01;               //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
  21.    
  22.     IRIN=1;                    //I/O口初始化
  23. }

  24. /**********************************************************/
  25. void IR_IN(void) interrupt 0
  26. {
  27.   unsigned char j,k,N=0;
  28.      EX0 = 0;  
  29.           
  30.          IRdelay(5);
  31.          if (IRIN==1)
  32.      { EX0 =1;
  33.            return;
  34.           }
  35.                            //確認(rèn)IR信號(hào)出現(xiàn)
  36.   while (!IRIN)            //等IR變?yōu)楦唠娖,跳過(guò)9ms的前導(dǎo)低電平信號(hào)。
  37.   {IRdelay(1);}

  38. for (j=0;j<4;j++)         //收集四組數(shù)據(jù)
  39. {
  40.   for (k=0;k<8;k++)        //每組數(shù)據(jù)有8位
  41.   {
  42.    while (IRIN)            //等 IR 變?yōu)榈碗娖,跳過(guò)4.5ms的前導(dǎo)高電平信號(hào)。
  43.      {IRdelay(1);}
  44.     while (!IRIN)          //等 IR 變?yōu)楦唠娖?br />
  45.      {IRdelay(1);}
  46.      while (IRIN)           //計(jì)算IR高電平時(shí)長(zhǎng)
  47.       {
  48.     IRdelay(1);
  49.     N++;           
  50.     if (N>=30)
  51.          { EX0=1;
  52.          return;}                  //0.14ms計(jì)數(shù)過(guò)長(zhǎng)自動(dòng)離開(kāi)。
  53.       }                        //高電平計(jì)數(shù)完畢               
  54.      IRCOM[j]=IRCOM[j] >> 1;                  //數(shù)據(jù)最高位補(bǔ)“0”
  55.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數(shù)據(jù)最高位補(bǔ)“1”
  56.      N=0;
  57.   }//end for k
  58.           
  59. }//end for j
  60.    
  61.    if (IRCOM[2]!=~IRCOM[3])
  62.    { EX0=1;
  63.      return;
  64.          
  65.         }

  66.        EX0 = 1;
  67. }


  68. /**********************************************************/
  69. void IRdelay(unsigned char x)    //x*0.14MS
  70. {
  71. unsigned char i;
  72.   while(x--)
  73. {
  74.   for (i = 0; i<13; i++) {}
  75. }
  76. }




復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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