找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红外遥控键值读取器程序

[复制链接]
跳转到指定楼层
楼主
ID:41347 发表于 2021-2-3 17:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /********************************************************************************
  2. *  描述:                                                                       *
  3. *         数码管显示 遥控键值读取器                                            *
  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;         //继电器驱动线
  17. sbit RELAY1= P2^1;         //继电器驱动线
  18. sbit RELAY2= P2^5;         //继电器驱动线
  19. sbit RELAY3= P2^6;         //继电器驱动线
  20. sbit RELAY4= P2^7;         //继电器驱动线

  21. unsigned char Y0;


  22. //此表为 LED 的字模, 共阴数码管 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);      //函数声名
  27. void display(unsigned char Key_Val);
  28. extern void IRInit();    //extern 是引用IR.C中的函数


  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数码管显示*************/
  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];    //个位
  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;//打开继电器
  93.         else RELAY=1;
  94.         if(Y0==0x02)RELAY1=0;
  95.         else RELAY1=1; //关闭继电器
  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. }
复制代码


  1. /********************************************************************************
  2. *  描述:                                                                        *
  3. *         数码管显示 遥控键值读取器                                             *
  4. *          遥控器接p3.2                                                         *
  5. *  现象:当按遥控器时,按下事 数码管会有闪烁,为什么会闪烁呢                    *
  6. *                                                                               *
  7. *         连接方法:使用红外功能时 J1跳线短接                                   *
  8. *****************************************************************************8**/

  9. #include <reg51.h>

  10. sbit IRIN = P3^2;         //红外接收器数据线


  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;               //触发方式为脉冲负边沿触发
  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.                            //确认IR信号出现
  36.   while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
  37.   {IRdelay(1);}

  38. for (j=0;j<4;j++)         //收集四组数据
  39. {
  40.   for (k=0;k<8;k++)        //每组数据有8位
  41.   {
  42.    while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  43.      {IRdelay(1);}
  44.     while (!IRIN)          //等 IR 变为高电平
  45.      {IRdelay(1);}
  46.      while (IRIN)           //计算IR高电平时长
  47.       {
  48.     IRdelay(1);
  49.     N++;           
  50.     if (N>=30)
  51.          { EX0=1;
  52.          return;}                  //0.14ms计数过长自动离开。
  53.       }                        //高电平计数完毕               
  54.      IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
  55.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“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. }




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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