找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机解码的红外遥控一个led灯亮和灭,遥控器键码有,可是不会程序,求大神

  [复制链接]
跳转到指定楼层
楼主
ID:82852 发表于 2015-6-12 22:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想制作一个用单片机解码的红外遥控开关,只需要控制一个led灯的亮和灭就可以了,各位大神谁有程序呢?下面是遥控器的键码,和实物图,只需要第一个键控制第一个等就可以,谢谢



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

使用道具 举报

沙发
ID:81118 发表于 2015-6-13 21:19 | 只看该作者
判断接受到在键码 跟 你所按的键相同 点亮LED灯就可以了

LCD1602显示红外值.rar

40.72 KB, 下载次数: 552

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:82852 发表于 2015-6-13 23:11 | 只看该作者
欢腾智能科技 发表于 2015-6-13 21:19
判断接受到在键码 跟 你所按的键相同 点亮LED灯就可以了

我也有这个,我一开始就拿这个改的,一直改不对,不知道怎么改。。。。
回复

使用道具 举报

地板
ID:82852 发表于 2015-6-13 23:18 | 只看该作者
欢腾智能科技 发表于 2015-6-13 21:19
判断接受到在键码 跟 你所按的键相同 点亮LED灯就可以了

恩,你发的和我的是一个程序,可是我改了好多次,没改对,要是你的话你会怎么改呢,大神?
回复

使用道具 举报

5#
ID:72947 发表于 2015-6-15 17:43 来自手机 | 只看该作者
喔哎呀呀 发表于 2015-6-13 23:18
恩,你发的和我的是一个程序,可是我改了好多次,没改对,要是你的话你会怎么改呢,大神?

这个很好改嘛,他提供的程序应该是接收到键值之后在1602液晶上显示出来,你只要把他的显示部分程序去掉,改成判断键值的程序,按你的要求,判断接收到的键值等于0x45就点亮第一个灯,不等就忽略!这样改成功一路之后,就可以多加几路判断,实现控制8个灯了!

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:72947 发表于 2015-6-15 19:56 来自手机 | 只看该作者
这是我做的红外遥控项目,你可以参考一下!http://www.51hei.com/bbs/forum.php?mod=viewthread&tid=34267&mobile=2
回复

使用道具 举报

7#
ID:78515 发表于 2015-6-16 16:19 | 只看该作者
个人认为要看你的遥控器用的是什么通讯协议的。其实对于你这个控制用户码并不太重要,重要的是键码。
现市场上的红外遥控器多部分用的小日本NEC通讯协议的,你可以参考一下。希望能帮到你

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:81118 发表于 2015-6-22 21:56 | 只看该作者
喔哎呀呀 发表于 2015-6-13 23:11
我也有这个,我一开始就拿这个改的,一直改不对,不知道怎么改。。。。

下面是我改的 没试过  不懂行不行!
如果你已经解决就好,没解决的话下面可以参考




#include<reg51.h>

sbit IRIN=P3^2;

sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;

unsigned char IrValue[6];
unsigned char Time;
void IrInit();
void DelayMs(unsigned int );
/*******************************************************************************
* oˉêyÃû         : main
* oˉêy1|Äü                   : Ö÷oˉêy
* êäèë           : ÎT
* êä3ö                  : ÎT
*******************************************************************************/

void main()
{
        IrInit();       
        while(1)
        {
//                IrValue[5]=IrValue[2]>>4;                          //¸ßλ
//                IrValue[6]=IrValue[2]&0x0f;                //μíλ       
                if( IrValue[2] == 0x45 ) LED1 = 0; // áá
                if( IrValue[2] == 0x46 ) LED2 = 0; // áá               
                if( IrValue[2] == 0x47 ) LED3 = 0; // áá
        }
}                                                                         
/*******************************************************************************
* oˉêyÃû         : DelayMs()
* oˉêy1|Äü                   : Ñóê±
* êäèë           : x
* êä3ö                  : ÎT
*******************************************************************************/

void DelayMs(unsigned int x)   //0.14msÎó2î 0us
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++)
{}
}
}
/*******************************************************************************
* oˉêyÃû         : IrInit()
* oˉêy1|Äü                   : 3õê¼»ˉoìíaÏß½óêÕ
* êäèë           : ÎT
* êä3ö                  : ÎT
*******************************************************************************/

void IrInit()
{
        IT0=1;//ϽμÑØ′¥·¢
        EX0=1;//′ò¿aÖD¶Ï0ÔêDí
        EA=1;        //′ò¿a×üÖD¶Ï

        IRIN=1;//3õê¼»ˉ¶Ë¿ú
}
/*******************************************************************************
* oˉêyÃû         : ReadIr()
* oˉêy1|Äü                   : ¶áè¡oìíaêyÖμμÄÖD¶Ïoˉêy
* êäèë           : ÎT
* êä3ö                  : ÎT
*******************************************************************************/

void ReadIr() interrupt 0
{
        unsigned char j,k;
        unsigned int err;
        Time=0;                                         
        DelayMs(70);

        if(IRIN==0)                //è·èÏêÇ·ñÕæμĽóêÕμ½Õyè·μÄDÅoÅ
        {         
               
                err=1000;                                //1000*10us=10ms,3¬1yËμÃ÷½óêÕμ½′íÎóμÄDÅoÅ
                /*μ±á½¸öìõ¼t¶¼ÎaÕæêÇÑ-»·£¬èç1ûóDò»¸öìõ¼tÎa¼ùμÄê±oòìø3öÑ-»·£¬ÃaμÃ3ìDò3ö′íμÄê±
                o3ìDòËàÔúÕaàï*/       
                while((IRIN==0)&&(err>0))        //μè′yÇ°Ãæ9msμÄμíμçÆ½1y襠                
                {                       
                        DelayMs(1);
                        err--;
                }
                if(IRIN==1)                        //èç1ûÕyè·μèμ½9msμíμçÆ½
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 //μè′y4.5msμÄÆe꼸ßμçÆ½1yè¥
                        {
                                DelayMs(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //12óD4×éêy¾Y
                        {                               
                                for(j=0;j<8;j++)        //½óêÕò»×éêy¾Y
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//μè′yDÅoÅÇ°ÃæμÄ560usμíμçÆ½1yè¥
//                                        while (!IRIN)
                                        {
                                                DelayMs(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //¼ÆËã¸ßμçÆ½μÄê±¼ä3¤¶è¡£
                                        {
                                                DelayMs(1);//0.14ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        EX0=1;
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;         //k±íê¾μú¼¸×éêy¾Y
                                        if(Time>=8)                        //èç1û¸ßμçÆ½3öÏÖ′óóú565us£¬ÄÇÃ′êÇ1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //óÃíêê±¼äòaÖØD¸3Öμ                                                       
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                       
}

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:88498 发表于 2015-8-17 21:58 | 只看该作者
kan kan!!!!!!!!!
回复

使用道具 举报

10#
ID:79544 发表于 2015-8-23 22:49 | 只看该作者
在主函数里换成switch

  1. switch(IrValue[2])
  2.                 {
  3.                 //        case 0x45: LED=0 ;break;
  4.                 //        case 0x46:LED1=0;break;
  5.                 //        case 0x47: KED2=0;break;
  6.                 //        case 0x08: YOUZHUAN;break;
  7.                 //        case 0x04: STOP ;   break;

  8.                         case 0x02: xzqianjin(); break;//电视遥控器键值
  9.                         case 0x0a: xzhoutui()  ;break;//电视遥控器键值
  10.                         case 0x07: xzzuozhuan();break;//电视遥控器键值
  11.                         case 0x05: xzyouzhuan(); break;//电视遥控器键值
  12.                         case 0x06: tingsha();  break;//电视遥控器键值
  13.                         case 0x18: tingsha();  break;

  14.                         case 0x17: shoushen(); break;
  15.                         case 0x14: shouzhua(); break;

  16.                         case 0x16: wanzuo();   break;
  17.                         case 0x13: wanyou();   break;

  18.                         case 0x15: zhoushang();break;
  19.                         case 0x12: zhouxia();  break;

  20.                         case 0x11: zhouzuo();  break;
  21.                         case 0x1a: zhouyou();  break;

  22.                         case 0x10: jianqian(); break;
  23.                         case 0x0e: jianhou();  break;

  24.                         case 0x0f: jianshang();break;
  25.                         case 0x19: jianxia();  break;

  26.                

  27.                
  28.                         default:break;
  29.                 }       
复制代码
回复

使用道具 举报

11#
ID:92810 发表于 2015-10-21 20:19 | 只看该作者
学习了,,谢谢大家的分享和意见了。。。
回复

使用道具 举报

12#
ID:93339 发表于 2015-10-23 17:00 | 只看该作者
#在这里快速回复##include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit ir=P3^2; //红外线一体接收器的接口 sbit led=P2^1;//此处写led灯的连接IO口 unsigned int timer1;  uchar irtime; uchar irdata[33]; uchar bitnum; uchar startflag; uchar irok; uchar ircode[4]; uchar irprosok; void delay(uchar x); void timer0init(void) //256*(1/12m)*12=0.256ms {         TMOD=0x02;          TH0=0x00;          TL0=0x00;         ET0=1;         EA=1;         TR0=1; } void irpros(void) // 红外码值处理 {         uchar mun,k,i,j;         k=1;         for(j=0;j<4;j++)         {                 for(i=0;i<8;i++)                 {                         mun=mun>>1;                         if(irdata[k]>6)                         {                                 mun=mun | 0x80;                         }                                 k++;                 }                 ircode[j]=mun;         }         irprosok=1; } void delay(uchar x) {         uchar a,b;         for(a=x;a>0;a--)                 for(b=200;b>0;b--); } void int0init(void) {  IT0=1;  EX0=1;  EA=1; } void main() {         timer0init();         int0init();         while(1)         {                 if(irok==1)                 {                         irpros();                         irok=0;                 }                  if(ircode[2]==0x08)                  {                     led=!led;                 }                  }                 } void int0 () interrupt 0  { if(startflag)  {   if(irtime>32&&irtime<63)           {            bitnum=0;         }         irdata[bitnum]=irtime;         irtime=0;         bitnum++;         if(bitnum==33)           {            bitnum=0;            irok=1;           }  } else  {  irtime=0;  startflag=1;  } }  void timer0 () interrupt 1 {         irtime++; }
回复

使用道具 举报

13#
ID:86421 发表于 2015-11-7 07:38 | 只看该作者
  1. /*-----------------------------------------------
  2.   名称:遥控器红外控制继电器

  3.   内容:三种遥控器控制两个继电器
  4. ------------------------------------------------*/
  5. #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  6. sbit IR=P3^2;  //红外接口标志
  7. sbit jd1=P1^0;
  8. sbit jd2=P1^1;

  9. /*----------------------------------------------
  10.                 全局变量声明
  11. ------------------------------------------------*/

  12. unsigned char  irtime;//红外用全局变量

  13. bit irpro_ok,irok;
  14. unsigned char IRcord[4];
  15. unsigned char irdata[33];

  16. /*------------------------------------------------
  17.                   函数声明
  18. ------------------------------------------------*/

  19. void Ir_work(void);
  20. void Ircordpro(void);

  21. /*------------------------------------------------
  22.                   定时器0中断处理
  23. ------------------------------------------------*/

  24. void tim0_isr (void) interrupt 1 using 1
  25. {
  26.   irtime++;  //用于计数2个下降沿之间的时间
  27. }

  28. /*------------------------------------------------
  29.                   外部中断0中断处理
  30. ------------------------------------------------*/
  31. void EX0_ISR (void) interrupt 0 //外部中断0服务函数
  32. {
  33.   static unsigned char  i;             //接收红外信号处理
  34.   static bit startflag;                //是否开始处理标志位

  35. if(startflag)                        
  36.    {
  37.     if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
  38.                         i=0;
  39.                     irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
  40.                     irtime=0;
  41.                     i++;
  42.                             if(i==33)
  43.                               {
  44.                                    irok=1;
  45.                                  i=0;
  46.                                   }
  47.           }
  48.            else
  49.                 {
  50.                 irtime=0;
  51.                 startflag=1;
  52.                 }

  53. }

  54. /*------------------------------------------------
  55.                 定时器0初始化
  56. ------------------------------------------------*/
  57. void TIM0init(void)//定时器0初始化
  58. {

  59.   TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  60.   TH0=0x00; //重载值
  61.   TL0=0x00; //初始化值
  62.   ET0=1;    //开中断
  63.   TR0=1;   
  64. }
  65. /*------------------------------------------------
  66.                   外部中断0初始化
  67. ------------------------------------------------*/
  68. void EX0init(void)
  69. {
  70. IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
  71. EX0 = 1;   //使能外部中断
  72. EA = 1;    //开总中断
  73. }
  74. /*------------------------------------------------
  75.                   键值处理
  76. ------------------------------------------------*/

  77. void Ir_work(void)//红外键值散转程序
  78. {
  79.        switch(IRcord[3])//判断第三个数码值
  80.                  {


  81.                          case 0x53:jd1=0;break;
  82.                          case 0x5f:jd1=1;break;
  83.                          case 0x4b:jd2=0;break;
  84.                          case 0x4f:jd2=1;break;

  85.                          case 0x9c:jd1=0;break;
  86.                          case 0x9d:jd1=1;break;
  87.                          case 0x9a:jd2=0;break;
  88.                          case 0x98:jd2=1;break;

  89.                          case 0xbb:jd1=0;break;
  90.                          case 0xbf:jd1=1;break;
  91.                          case 0xf8:jd2=0;break;
  92.                          case 0xea:jd2=1;break;



  93.              default:break;
  94.                          }

  95.                   irpro_ok=0;//处理完成标志

  96.   }
  97. /*------------------------------------------------
  98.                 红外码值处理
  99. ------------------------------------------------*/
  100. void Ircordpro(void)//红外码值处理函数
  101. {
  102.   unsigned char i, j, k;
  103.   unsigned char cord,value;

  104.   k=1;
  105.   for(i=0;i<4;i++)      //处理4个字节
  106.      {
  107.       for(j=1;j<=8;j++) //处理1个字节8位
  108.          {
  109.           cord=irdata[k];
  110.           if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
  111.              value|=0x80;
  112.           if(j<8)
  113.                     {
  114.                          value>>=1;
  115.                         }
  116.            k++;
  117.          }
  118.      IRcord[i]=value;
  119.      value=0;     
  120.      }
  121.          irpro_ok=1;//处理完毕标志位置1
  122. }

  123. /*------------------------------------------------
  124.                     主函数
  125. ------------------------------------------------*/
  126. void main(void)
  127. {
  128. EX0init(); //初始化外部中断
  129. TIM0init();//初始化定时器


  130. while(1)//主循环
  131.    {
  132.     if(irok)                        //如果接收好了进行红外处理
  133.           {   
  134.            Ircordpro();
  135.            irok=0;
  136.           }

  137.     if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
  138.           {
  139.            Ir_work();
  140.             }
  141.    }
  142. }
  143.   
  144.   这是我用来控制继电器的,你可以改成控制LED灯。这个程序可以用三种遥控器。你可以用来参考。
复制代码
回复

使用道具 举报

14#
ID:95022 发表于 2015-11-7 20:27 | 只看该作者
你在KEIL里面仿真时就可以看到按键的值了
回复

使用道具 举报

15#
ID:138233 发表于 2016-9-2 09:28 | 只看该作者
程序方面测试可以,前提是12M的晶振,我现在用要的到24M的晶振,请否问下需要如何修改,谢谢
回复

使用道具 举报

16#
ID:194896 发表于 2017-4-29 23:23 | 只看该作者
uestchina 发表于 2015-6-25 16:47
红外解码出来,改一下主程序
void main()
{

试了,不行
回复

使用道具 举报

17#
ID:194896 发表于 2017-4-29 23:28 | 只看该作者
腾飞的龙 发表于 2015-8-23 22:49
在主函数里换成switch

试了,不行
回复

使用道具 举报

18#
ID:79544 发表于 2017-4-30 11:07 | 只看该作者
延时和定时器的值修改一下试试。
回复

使用道具 举报

19#
ID:195270 发表于 2017-5-1 15:58 | 只看该作者
网上示例程序 很多的,并且都是有源码
回复

使用道具 举报

20#
ID:222772 发表于 2017-8-1 11:27 | 只看该作者
参考一下。不知道用在stc15f104w怎么样
回复

使用道具 举报

21#
ID:241659 发表于 2017-10-21 20:17 | 只看该作者
                                  /**************************************************************************************
*                              红外通信实验                                                                                                  *
实现现象:        具体接线操作请参考视频
                        下载程序后,数码管显示红外遥控键值数据
注意事项:        红外遥控模块的短接片J1短接,
                        红外遥控器内的电池绝缘片一定要抽掉                                                                                                                                                          
***************************************************************************************/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
       
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

u16 Time;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit led6=P0^5;
sbit led7=P0^6;
sbit led8=P0^7;

sbit IRIN=P3^2;

u8 IrValue[6];

/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}


/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能                 :数码管显示函数
*******************************************************************************/
void DigDisplay()
{
        u8 i;
        for(i=0;i<8;i++)
        {
                switch(IrValue[2])         //位选,选择点亮的led,
                {
                        case(0x16):
                                LSA=0;LSB=0;LSC=0;
                                led1=0;
                                 break;//显示第0位
                        case(0x0c):
                                LSA=1;LSB=0;LSC=0;
                                led2=0;
                                 break;//显示第1位
                        case(0x18):
                                LSA=0;LSB=1;LSC=0;
                                led3=0;
                                 break;//显示第2位
                        case(0x5e):
                                LSA=1;LSB=1;LSC=0;
                                led4=0;
                                break;//显示第3位;
                        case(0x08):
                                LSA=0;LSB=0;LSC=1;
                                led5=0;
                                 break;//显示第四位;
                        case(0x1c):
                                LSA=1;LSB=0;LSC=1;
                                led6=0;
                                 break;//显示第五位;
                        case(0x5a):
                                LSA=0;LSB=1;LSC=1;
                                led7=0;
                                break;//显示第六位;
                        case(0x42):
                                LSA=1;LSB=1;LSC=1;
                                led8=0;
                                 break;//显示第七位
                }
                delay(100); //间隔一段时间扫描       
        }               
}
/*******************************************************************************
* 函数名         : IrInit()
* 函数功能                   : 初始化红外线接收
*/
void IrInit()
{
        IT0=1;//下降沿触发
        EX0=1;//打开中断0允许
        EA=1;        //打开总中断

        IRIN=1;//初始化端口
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
*******************************************************************************/
void main()
{       
        IrInit();
        while(1)
        {       
            DigDisplay();//利用人眼的视觉暂留效应,其实是动态显示,只不过刷新时间太快               
        }               
}

/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能                   : 读取红外数值的中断函数
*******************************************************************************/

void ReadIr() interrupt 0
{
        u8 j,k;
        u16 err;
        Time=0;                                         
        delay(700);        //7ms
        if(IRIN==0)                //确认是否真的接收到正确的信号
        {         
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/       
                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                 
                {                       
                        delay(1);
                        err--;
                }
                if(IRIN==1)                        //如果正确等到9ms低电平
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
                        {
                                delay(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                               
                                for(j=0;j<8;j++)        //接收一组数据//总共32位数据4个字节
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
                                        {
                                                delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。//重点
                                        {
                                                delay(10);         //0.1ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;//是或的关系,数据从高位到低位读取和0或完成保存在数组里面
                                        }                                     //  1000 0000  比如和1010 1000或完保存      
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                       
}
修改的不完美,但是基本可以用,就是只能按一下,灭一个led,按完led全灭了,不能实现按两下led重新亮
回复

使用道具 举报

22#
ID:558248 发表于 2019-7-18 17:14 | 只看该作者
仿真图有吗
回复

使用道具 举报

23#
ID:558248 发表于 2019-7-18 17:19 | 只看该作者
仿真图有吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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