单片机 红外码库 - CSDN
精华内容
参与话题
  • 基于51单片机红外遥控器文件

    千次阅读 2016-11-25 21:12:36
    红外遥控器文件
    #ifndef _IR_H_
    #define _IR_H_


    #include <reg52.h>


    extern bit irpro_ok,irok;
    extern unsigned char IRcord[4];
    extern unsigned char irdata[33];






    void TIM0init2(void)
    {


      TMOD|=0x20;
      TH1=0x00; 
      TL1=0x00; 
      ET1=1;   
      TR1=1;    
    }


    void EX1init(void)
    {
     IT1 = 1;   
     EX1 = 1;  
     EA = 1;   
    }




    unsigned char Ir_work()
    {
        unsigned char key;   
    switch(IRcord[2])
    {
        case 0x40:key=0;break;//ok
    case 0x46:key=1;break;//↑
    case 0x15:key=2;break;//↓
    case 0x44:key=3;break;//←
    case 0x43:key=4;break;//→
    case 0x16:key=5;break;//1
    case 0x19:key=6;break;//2
    case 0x0d:key=7;break;//3
    case 0x0c:key=8;break;//4
    case 0x18:key=9;break;//5
    case 0x5e:key=10;break;//6
    case 0x08:key=11;break;//7
    case 0x1c:key=12;break;//8
    case 0x5a:key=13;break;//9
    case 0x42:key=14;break;//*
    case 0x52:key=15;break;//0
    case 0x4a:key=16;break;//#
    default:break;
    }
        irpro_ok=0;
        return (key);
      }
      
      void Ircordpro()

      unsigned char i, j, k;
      unsigned char cord,value;


      k=1;
      for(i=0;i<4;i++)     
         {
          for(j=1;j<=8;j++) 
             {
              cord=irdata[k];
              if(cord>7)
                 value|=0x80;
              if(j<8)
       {
    value>>=1;
    }
               k++;
             }
         IRcord[i]=value;
         value=0;     
         } 
    irpro_ok=1;
    }


    /*------------------------------------------------
    调用此库需定义
    bit irpro_ok,irok;
    unsigned char IRcord[4];
    unsigned char irdata[33];
    unsigned char key;




    void tim1_isr (void) interrupt 3 //定时1器中断函数,工作方式为2
    {
      irtime++;  
    }


    void EX0_ISR (void) interrupt 2   //外部中断1中断函数,下降沿触发
    {
      static unsigned char  i;             
      static bit startflag;                


      if(startflag)                         
       {
        if(irtime<63&&irtime>=33)
          i=0;   
    irdata[i]=irtime;
    irtime=0;
    i++;
        if(i==33)
    {
      irok=1;
      i=0;
    }
       }
      else
      {
    irtime=0;
    startflag=1;
      }


    }
    ------------------------------------------------*/


    #endif

    以上是库文件全部内容,注释部分是对该库的使用说明,另附红外遥控器键值表

    展开全文
  • 单片机控制的红外库

    2016-09-06 08:23:50
    单片机控制的红外库 http://www.amobbs.com/forum.php?mod=viewthread&tid=5596999&highlight=%E7%BA%A2%E5%A4%96 http://www.mikrocontroller.net/topic/387570#new
    展开全文
  • 51单片机HAL1.0.5,参考例程:基于原有程序,增加了红外遥控功能,红外遥控程序是基于定时器2输入捕获模式实现。
  • Android编程红外编程——红外码详析

    千次阅读 2017-05-28 21:06:24
    近日,为了实现手机个红外功能,学习了Android 4.4以上提供的红外API——ConsumerIrManager。 用以实现遥控器功能。  首先简单介绍一下ConsumerIrManager。  在官方提供的API说明文档中,给ConsumerIrManager...


      

    首先简单介绍一下ConsumerIrManager。 


    在官方提供的API说明文档中,给ConsumerIrManager提供了三个方法:

    1. getCarrierFrequencyRange[] : 此方法返回手机支持的红外信号的频率范围。

    2. hasIrEmitter(): 此方法返回手机是否有红外模块。

    3. transmit(int carrierFrequency, int[] pattern)  :此方法控制手机产生 carrierFrequency为频率的,以pattern为红外开关的时间数组,发送红外信号。(例如:transmit(38000,{100,200,300,400})    将会产生一个频率为38KHz的红外信号,信号的电平高低为 100us高电平,200us低电平,300us高电平,400us低电平。注意pattern的数据个数要为偶数个,不然报错。)。

     


    好了,上面介绍了手机红外API,下面介绍实现手机模拟 车载MP3遥控器,并使用单片机作为接收显示键值


    ANDROID:

    IR=(ConsumerIrManager)getSystemService(CONSUMER_IR_SERVICE);
    此处首先从系统服务中获取到ConsumerIrManager服务。

      pattern = new int[] {9000,4500, 560,560,    560,560,   560,560,   560,560,   560,560,   560,560,   560,560,   560,560, 
    	    		             560,1690,  560,1690,  560,1690,  560,1690, 560,1690, 565,1685, 560,1690, 560,1690, 
    	    		             560,1690,  560,560,  560,1690, 560,560, 560,560, 560,560, 560,1690,   560,560,  
    	    		               560,560 ,560,1690,  560,560,   560,1690, 560,1690, 560,1690,560,560, 560,1690  
    	    		             ,9000,2250,2250,94000  , 9000,2250,2250,94000};
    	    

    设置pattern , pattern要和所用的红外码对应。

    IR.transmit(38000, pattern);}
    发射红外。

    此处解释一下pattern是怎么写出来的



    数据码是由 引导码+用户码+数据码+数据反码构成;

    代码中用到的发送的数据是:引导码(9ms高电平+4.5ms低电平) 9000 4500 

           +用户码 0x00FF = 0000 0000 1111 1111 

    9000,4500, 560,560,    560,560,   560,560,   560,560,   560,560,   560,560,   560,560,   560,560, 
    	    		             560,1690,  560,1690,  560,1690,  560,1690, 560,1690, 565,1685, 560,1690, 560,1690, 

          + 数据码    0X45= 0100 0101      但是注意要反置 1010 0010 (可能是和接收端有关系,只有反置了之后接收正常)

     560,1690,  560,560,  560,1690, 560,560, 560,560, 560,560, 560,1690,   560,560,  
          +数据反码

      560,560 ,560,1690,  560,560,   560,1690, 560,1690, 560,1690,560,560, 560,1690  
    同时在测试中,如果不加连续码。会导致接收不稳定,所以加上连续码

      ,9000,2250,2250,94000  , 9000,2250,2250,94000



    展开全文
  • 单片机实验(十四)红外遥控

    千次阅读 2020-02-14 15:44:37
    80S52:红外遥控模块 功能:显示遥控按键对应用户毫无作用 红外遥控是类似于之前的串口通信但没有波特率的说法,主要就是按照红外遥控器发出信号的时序进行分析。 如我实验使用的DT9122D遥控器可从说明书中查得其...

    80S52:红外遥控模块

    功能:显示遥控按键对应用户码毫无作用

    红外遥控是类似于之前的串口通信但没有波特率的说法,主要就是按照红外遥控器发出信号的时序进行分析。

    如我实验使用的DT9122D遥控器可从说明书中查得其信号时序(如下图)
    信号时序图
    图中的引导码前9ms为高电平后4.5ms为低电平表示红外信号的开始,是用于过滤噪声的。后面的用户码和键位码组成的32位信号才是表征键位的,键数据反码主要起到验证信号真伪的作用。

    而用户编码的组成方式很有意思,图上读入的低(高)八位的用户编码的1、2、3、4…位 是真正的低(高)用户编码的8、7、6、5…位,键位码也一样。

    注意:信号读入后经过接收器处理,高低电平会倒置(如下图)在这里插入图片描述

    其次,信号读入的关键在0、1的判别。0、1在红外遥控信号中用一组高低电平表示,其区别在于“接收解码”中高电平的持续时间(即宽度),在DT9122D遥控器上0持续0.56ms,1持续1.69ms,思路是每次接收完位信号前半段的低电平,并接收的高点平后延时tms(0.56ms<t<1.69ms),之后若信号仍为高电平则该位为1反之为0。

    下面是具体代码实现。

    准备工作

    数码管显示模块我抄我自己

    #define date P0//用于数码管显示
    #define place P2//用于数码管显示
    typedef unsigned int u16;
    typedef unsigned char u8;
    sbit IRIN=P3^2;//红外信号i/o,利用了外部中断
    u8 code number[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1};
    //数码管显示字库
    u8 code where[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
    //数码管显示位库
    u8 k1,k2;//记录用户码
    void delay(u16 num){
    	u16 i,j;
    	for(i=1;i<=num;++i)
    	for(j=110;j>0;--j)
    	;
    }
    
    void display(u16 x,u16 y){//第x个数码管显示数字y(1、2...a、b...f)
        place=where[x];
    		delay(2);
    		date=number[y];
    		delay(2);
    	  date=0xff;
    }
    
    void initalize(void){//初始化函数
    	IRIN=1;//因为引导码一开始是0,所以置1
    	TCON=0x01;//设置外部中断方式
    	TMOD=0x10;//设置T1定时
    	EA=1;//总中断开启
    	EX0=1;//外部中断开启
    }
    

    延时代码

    为了信号读入的精确,将51芯片内置的T1定时/计数器作为参照。(推荐使用单片机小精灵)
    *不使用T1的中断

    在信号读入中需要三个延时:引导码判别9ms、引导码结束4.5ms、位布尔判别(取0信号和1信号宽度的中值为佳)0.84ms

    void time_9000us(void)
    {
        TH1 = 0x0DC;//(0xff-9000)
        TL1 = 0x0D8;
        TR1 = 1;//开始计时
    	  while(!TF1);//溢出标识
    	  TF1=0;//手动重置
    	  TR1=0;
    }
    void time_4500us(void)
    {
        TH1 = 0x0EE;
        TL1 = 0x6C;
        TR1 = 1;
    	  while(!TF1);
    	  TF1=0;
    	  TR1=0;
    }
    
    void time_840us(void)
    {
        TH1 = 0x0FC;
        TL1 = 0x0B8;
        TR1 = 1;
    	  while(!TF1);
    	  TF1=0;
    	  TR1=0;
    }
    

    八位数据读入

    关键是时序、时序和时序

    u8 get_code(void){
    	u8 n;
    	static temp=0;
    	for(n=0;n<8;n++){
    		while(!IRIN);//等到低电平的宽度结束
    		time_840us();
    		if(IRIN){
    			temp=(0x80|(temp>>1));// 将temp的其余位右移,第一位置1
    			while(IRIN);//准备读入下一位起始的低电平
    		}
    		else
    			temp=(0x00|(temp>>1));//同理
    	}
    	return temp;	
    }
    

    外部中断

    *注意对中断开关的操作。

    void interr(void) interrupt 0{
      u8 a1,a2,n1,n2;//32位数据
    	EA=0;//关闭中断,防止干扰
    	time_9000us();
    	if(!IRIN){//若引导码错误则说明是干扰信号
    	  EA=1;
    		return;
    	}
    	while(!IRIN);//以防万一的小设计
    	time_4500us();
    	if(IRIN){
    	  EA=1;
    		return;
    	}
    	a1=get_code();//低八位用户码
    	a2=get_code();//高八位用户码
    	n1=get_code();//机器码
    	n2=get_code();//机器反码
    	if(n1!=~n2){//利用反码判断真伪
    	  k1=14;
    		EA=1;
    	  return;
    	}
      k1=n2;//用于显示
    	k2=a2;//同上
    	EA=1;
    }
    

    无聊的土味main

    void main(){
      initalize();//初始化
      while(1){
    	  display(1,((k1&0xf0)>>4)&0x0f);//我随意找了一些位显示
    	  display(2,(k1&0x0f));
    	}
    }
    

    附上效果图:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 16-STM32F1-红外解码

    千次阅读 2018-08-23 20:33:40
    红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。由于红外线遥控不具有像无线电...
  • 之前已经写过了一个使用定时器普通计时功能来识别红外遥控数据的文章。本次是使用定时器输入捕获来实现,这种方法比起定时器普通计数来说要更加复杂一些,不过效果会更好。 一、原理1、红外发射协议 红外发射协议...
  • 简单的以为想在自己的项目中加个红外通讯功能,就直接买来红外发射管和接收头,想着自己能从头到尾的搞定发射和接收两个部分。结果想做红外发射的时候却发现。困难重重,以至于拖了很久都无法进行下去。 说一下我...
  • STM32之红外接收

    千次阅读 2017-10-26 14:01:37
    摘自:... 一、简介 本文介绍如何在STM32上使用红外接收头接收红外信号。 ...其中,红外协议采用为最常见的NEC协议。...版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件
  • STM32红外遥控(HAL源码)

    千次阅读 2020-08-28 20:21:58
    同步码头、地址、地址反码、控制、控制反码 同步由一个 9ms 的低电平和一个 4.5ms 的高电平组成 地址、地址反码、控制、控制反码均是 8 位数据格式(发送时低位在前 高位在后) 用反码是为了增加传输的...
  • 【STM32】STM32之红外接收

    万次阅读 2017-04-04 12:49:12
    本文介绍如何在STM32上使用红外接收头接收红外信号
  • STM32 定时器实现红外遥控数据接收

    万次阅读 2017-08-09 11:03:06
    一、原理1、红外发射协议 红外通信的协议有很多种。这个实验使用的是NEC协议。这个协议的采用PWM的方法进行调制,利用脉冲宽度来表示0和1。 NEC 遥控指令的数据格式为:同步码头、地址、地址反码、控制、控制...
  • 目前很多家电带有红外遥控,如:电视、空调、风扇等等。有一个用手机控制的红外线遥控器的话...有了红外串口通讯模块,省去了单片机的串口通讯和红外编码程序,大大缩短开发时间。因为红外通讯模块不支持3.3VTTL电平...
  • 如方案设计所述,制作红外接收解码装置,该装置至少具有面向用户和设计者的两种检测方法,能够完成采用RC-5编码协议遥控器(SAA3010)的红外接收和解码,要求基于用户的检测方法简单直观,基于设计者的检测能准确显示解码...
  • STM32红外解码(NEC)

    2020-08-06 22:22:54
    红外遥控不能隔墙、抗干扰强。 对流程不感兴趣可以直接看代码 NEC的时序 大致是接收到引导(9ms 低电平+ 4.5ms 高电平) + 地址+反码(校验用)+数据+数据反码,这时已经接收到了完整的数据了,之后如果不松手,就会...
  • 格力空调红外编码分析

    万次阅读 2014-07-17 21:18:17
    最近一个月一直z
  • HAL版本:STM32Cube_FW_F1_V1.8.0 本文内容: STM32 使用 定时器捕获功能捕获红外时序 解码 hx1838 时序 附件: MDK5 示例工程 红外遥控器 + 红外接收头 : 测试过程请注意遥控和接收头的距离不要过远...
  • 日立空调遥控红外码值编码规则
  • 工程使用CubeMX创建,使用VS Code编程,单片机为STM32F103VCT6。 首先配置时钟,下载方式,开启USART以方便调试,这里就不具体展示了。开启某个定时器的输入捕获【Input Capture direct mode】预分频系数设为(72-1)...
  • 最近尝试做一个红外接收装置,看了网上大多数参考文章以后,选了比较通用的NEC红外协议入手,正巧有一个遥控器使用的正是NEC协议,解决了信号源问题,我的目标便是用STM32c8t6核心板配合集成红外接收头将遥控器各个...
1 2 3 4 5 ... 18
收藏数 350
精华内容 140
热门标签
关键字:

单片机 红外码库