标题: HX1838红外无线遥控模块51单片机程序 [打印本页]

作者: 阿东哥    时间: 2018-12-3 15:05
标题: HX1838红外无线遥控模块51单片机程序
红外无线模块:
1.硬件:红外接收器+遥控器
2.连接方式:接收器的+、-分别连接在单片机的VCC、GND上面,S为信号输出端连接在单片机的IO口上面(例程里面连接在了P3^2引脚)
3.遥控器上面每一个按键对应的键码值已经在程序中给出,程序的内容是用遥控器控制单片机上面的流水灯

单片机源程序如下:
  1. #include<reg52.h>    //包含单片机寄存器的头文件
  2. #include<intrins.h> //包含_nop_()函数定义的头文件
  3. #define uchar unsigned char
  4. #define uint  unsigned int


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


  6. sbit led1=P1^0;
  7. sbit led2=P1^1;
  8. sbit led3=P1^2;
  9. sbit led4=P1^3;
  10. sbit led5=P1^4;
  11. sbit led6=P1^5;
  12. sbit led7=P1^6;
  13. sbit led8=P1^7;

  14. uchar IRCOM[7];

  15. void delay(unsigned char x) ;

  16. /*******************************************************************/
  17. void main()
  18. {
  19.          unsigned int  a;
  20.    
  21.         IRIN=1;                    //I/O口初始化        
  22.         IE=0x81;                 //允许总中断中断,使能 INT0 外部中断
  23.         TCON=TCON|0x01;               //触发方式为脉冲负边沿触发
  24.         
  25.          while(1)
  26.          {               
  27.             for(a=100;a>0;a--)
  28.    {
  29.      void IR_IN();
  30.    }        
  31.           }
  32. }
  33. /**********************************************************/
  34. void IR_IN() interrupt 0 using 0
  35. {
  36.         unsigned char j,k,N=0;
  37.         unsigned char q=0;
  38.         EX0 = 0;   
  39.         delay(15);
  40.         if (IRIN==1)
  41.         {
  42.                 EX0 =1;
  43.                 return;
  44.         }
  45.                    //确认IR信号出现
  46.         while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
  47.                 delay(1);
  48.         
  49.         for (j=0;j<4;j++)         //收集四组数据
  50.         {
  51.                 for (k=0;k<8;k++)        //每组数据有8位
  52.                 {
  53.                         while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  54.                         {delay(1);}
  55.                         while (!IRIN)          //等 IR 变为高电平
  56.                                 delay(1);
  57.                         while (IRIN)           //计算IR高电平时长
  58.                         {
  59.                                 delay(1);
  60.                                 N++;           
  61.                                 if (N>=30)
  62.                                 {
  63.                                         EX0=1;
  64.                                         return;
  65.                                 }                  //0.14ms计数过长自动离开。
  66.                         }                        //高电平计数完毕               
  67.                         IRCOM[j]=IRCOM[j] >> 1;     //数据最高位补“0”
  68.                         if(N>=8)
  69.                         {
  70.                                 IRCOM[j] = IRCOM[j] | 0x80;                  //数据最高位补“1”
  71.                         }  
  72.                         N=0;
  73.                 }
  74.         }
  75.         
  76.         if(IRCOM[2]!=~IRCOM[3])
  77.         {
  78.                 EX0=1;
  79.                 return;
  80.         }
  81.         
  82.         IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
  83.         IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
  84.         
  85.         if(IRCOM[5]>9)
  86.         {
  87.                 IRCOM[5]=IRCOM[5]+0x37;
  88.         }
  89.         else
  90.         IRCOM[5]=IRCOM[5]+0x30;
  91.         
  92.         if(IRCOM[6]>9)
  93.         {
  94.                 IRCOM[6]=IRCOM[6]+0x37;
  95.         }
  96.         else
  97.         IRCOM[6]=IRCOM[6]+0x30;

  98.         q= (((IRCOM[6]&0x0f)<<4) + (IRCOM[5]&0x0f));
  99.    

  100.         switch(q)    //判断按键键码值
  101.         {
  102.                 case 0x04:led1=1;led2=0;led3=1;led4=0;led5=1;led6=0;led7=1;led8=0;break;  //(#)
  103.                 case 0x19:led1=0;break;  //(0)
  104.                 case 0x40:led5=0;break;  //(5)
  105.                 case 0x43:led6=0;break;  //(6)
  106.                 case 0x44:led4=0;break;  //(4)
  107.                 case 0x45:led1=0;break;  //(1)
  108.                 case 0x46:led2=0;break;  //(2)
  109.                 case 0x47:led3=0;break;  //(3)
  110.                 case 0x07:led7=0;break;  //(7)
  111.                 case 0x18:led1=0;led2=0;led3=1;led4=1;led5=1;led6=1;led7=1;led8=1;break;  //(上)
  112.                 case 0x09:led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;led7=0;led8=0;break;  //(9)
  113.                 case 0x08:led1=1;led2=1;led3=1;led4=1;led5=0;led6=0;led7=1;led8=1;break;  //(左)
  114.                 case 0x13:led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;led8=1;break;  //(ok)
  115.                 case 0x51:led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=0;led8=0;break;  //(右)
  116.                 case 0x15:led8=0;break;  //(8)
  117.                 case 0x52:led1=1;led2=1;led3=0;led4=0;led5=1;led6=1;led7=1;led8=1;break;  //(下)
  118.                 case 0x16:led1=0;led2=1;led3=0;led4=1;led5=0;led6=1;led7=0;led8=1;break;  // (*)
  119.         
  120.                 default :break;
  121.         }

  122.          EX0 = 1;
  123. }


  124. /***************延时函数*****************************/
  125. void delay(unsigned char x)    //x*0.14MS
  126. {
  127.         unsigned char i;
  128.         while(x--)
  129.         {
  130.                 for (i = 0; i<13; i++) {}
  131.         }
  132. }
复制代码

所有资料51hei提供下载:
CR2025.zip (28.47 KB, 下载次数: 292)



作者: LINKEEE    时间: 2019-2-18 16:26
感谢分享
作者: 杨永超    时间: 2019-3-24 20:37
学习了
作者: aking991    时间: 2019-3-25 09:02
谢谢分享
作者: zpz181818    时间: 2019-3-25 12:08
学习学习。
作者: 160328318    时间: 2019-3-28 16:44
谢谢!
作者: 642242855    时间: 2019-10-21 16:37
tzr448106883 发表于 2019-7-31 18:15
你好啊  我把这个代码写到STC89C52能用但是 写到STC15W401AS就用不了 是什么原因?

15系列的比89系列的速度快,估计是延时时间不一致
作者: czjlovezy    时间: 2019-12-11 10:51
太棒啦!
作者: 891558534    时间: 2020-2-9 15:07
怎么没有看到电源键的作用??
作者: xxpp2011    时间: 2020-3-7 14:29
正好用到这款红外遥控,有了键值就不用自己另外解码了,多谢
作者: wsh791    时间: 2020-3-7 19:59
学习一下
作者: anaaaaaaaaaa    时间: 2020-3-8 09:59
感谢分享
作者: 603547413    时间: 2020-3-8 11:17
感谢分享                              
作者: fy5399    时间: 2020-3-8 18:45
感谢分享
作者: 最高权限    时间: 2020-3-11 13:48
xxpp2011 发表于 2020-3-7 14:29
正好用到这款红外遥控,有了键值就不用自己另外解码了,多谢

请问大佬程序成功了吗?为什么我下进去不行呢?
作者: xxpp2011    时间: 2020-3-24 16:23
最高权限 发表于 2020-3-11 13:48
请问大佬程序成功了吗?为什么我下进去不行呢?

我买的红外遥控看起来是同一款,可能厂家不一样,实际的数据码与楼主发的不一致,所以后来自己解码了。
作者: 我叫小大打    时间: 2020-3-30 17:49
楼主,为什么我烧录你的程序,红外遥控没有反应(和你一样的红外模块),请问是什么原因的呢
作者: 陈帅帅儿    时间: 2020-4-7 13:26
学习了
作者: 18229788530    时间: 2020-4-7 16:32
感谢楼主的分享,对我的课程设计有一定的启发
作者: a2910983970    时间: 2020-4-26 10:23
你好,这个与晶振有没有关系,我用的是12M的,
作者: wbf80    时间: 2021-3-10 16:15
楼主主频晶振设置为多少M?0.14mS的延时程序用了14个循环
作者: 51c_yang    时间: 2021-8-23 21:03
xxpp2011 发表于 2020-3-24 16:23
我买的红外遥控看起来是同一款,可能厂家不一样,实际的数据码与楼主发的不一致,所以后来自己解码了。

你好,这个红外模块的键值码用什么可以测出来呀
作者: 51c_yang    时间: 2021-8-24 10:07
xxpp2011 发表于 2020-3-24 16:23
我买的红外遥控看起来是同一款,可能厂家不一样,实际的数据码与楼主发的不一致,所以后来自己解码了。

大佬,请问这个怎么解码,我 用的也是这款遥控器,发现也不能显示,求解码的程序谢谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1