RISC芯片/红外NEC应用教程/实操/含可运行代码~

红外NEC协议

一、NEC简介
        红外(Infrared,IR)遥控是一种无线、非接触控制技术,常用于遥控器、无线键盘、鼠标等设备之间的通信。IR协议的工作原理是,发送方通过红外线发送一个特定的编码,接收方通过识别该编码来执行相应的操作。

        IR协议是指红外线通信协议的总称,而NEC协议是IR协议中的一种具体实现。红外遥控系统分为发射和接收两部分,发射部分的发射元件为红外发光二极管,它发出的是红外线而不是可见光;接收电路的红外接收管是一种光敏二极管。

二、NEC传输格式
        NEC协议采用PPM(Pulse Position Modulation,脉冲位置调制)的形式进行编码,数据的每一位(Bit)脉冲长度为560us,由38KHz的载波脉冲 (carrier burst) 进行调制,推荐的载波占空比为 1/3至 1/4。有载波脉冲的地方,其宽度都为 560us,而载波脉冲的间隔时间是不同的。

        逻辑“1”的载波脉冲+载波脉冲间隔时间为2.25ms;逻辑“0”的载波脉冲+载波脉冲间隔时间为逻辑“1”的一半,即1.125ms. 

        每次信息都是按照引导码 (9ms载波脉冲+4.5ms 空闲信号)地址码、地址反码、控制码和控制反码的格式进行传输,因此,单次信息传输的时间是固定不变的。

        当红外遥控器上的按键被一直按下时,红外遥控器只会发送一次完整的信息,其后会每隔 110ms 发送一次重复码(连发码)。重复码的数据格式比较简单,同样是由 9ms的载波脉冲开始,紧接着是2.25ms的空闲信号,随后是560us的载波脉冲。

        红外接收头通常被厂家集成在一个元件中,成为一体化红外接收头。红外接收头内部的三极管电路具有信号反向的功能,也就是将1变为0,0变为1,即数据0是0.56ms的低电平和0.56ms的高电平,数据1是0.5ms的低电平和1.69ms的高电平,9ms是高电平变为低电平。

红外发送接收器件介绍

红外发光管

红外发光管:

红外发光二极管通常使用砷化镓(GaAs)、砷铝化镓(GaAlAs)等材料,采用全透明或者浅蓝色或者黑色树脂封装。

红外接收管

红外接收管:

下图为一常用的红外接收模块。内部包含有高频的滤波电路,专门用来滤除红外线合成信号的载波信号(38KHZ),并送出接收到的信号。当红外线合成信号进入到红外接收模块,在其输出端便可以得到原先发射器发出的数字编码,便可以通过MCU程序解码出相应的键码。

应用电路

红外协议

发送信号波形图:

接收信号波形图:

从示波器上看到红外接收管采集到的波形的波形,可以看出采集的·信号与发出的信号反向

红外信号特点

1.地址码与地址反码,以及命令码与命令反码,具有数据校验作用,增强结果的准确性

2.脉冲距离调制,调制占空比

3.载波频率38KHZ

4.逻辑位时间为逻辑0:1.125ms或逻辑1:2.25ms

5.发送的信号与接收到的信号是反向的

代码编写

引脚定义代码

省略

每个单片机的代码都有所区别,这里不写了

获取低电平时间函数

  • 运行一下代码需要另外设置定时器1的分频和系统时钟
  • 本代码定时器的计数周期为256ms,频率为1/256
  • 即定时器产生溢出一次的时间为256ms

void low_time()
{  
    W_TEMP=0;//计数
     	T1CNT=255; //T1CNT初始值
     	while((!NEC)&&W_TEMP<3);//NEC为宏定义,为单片机采集红外信号的引脚
   {
        if(T1IF)//T1IF为定时器中断溢出标志
        {
          T1IF=0;//清除标志位
          W_TEMP++;//计数加一
         }     
   }
}

高电平时间

该代码与上面代码基本一致

void high_time()
{   
    W_TEMP=0;
     	T1CNT=255; 
     	while(NEC&& W_TEMP<8)
     	{
        if(T1IF)
        {
          T1IF=0;  
          W_TEMP++;    
         }      
    } 
}

NEC信号读取

 void NEC_rec()
{

     	if(!NEC)
     	{
        delayms(8);//可以自己用for循环代替只需要延迟这么多时间即可
        if(!NEC)
        {
         	 delayms(5);//可以自己用for循环代替只需要延迟这么多时间即可
          if(NEC)
         	  {
     	   	   high_time();
         	  for(char i=0;i<4;i++)//读取4个字节的数据
         	       	{
                     	STA_TEMP=0;//临时变量
         	   	   	for(char j=0;j<8;j++)
         	   	   	  {
         	   	   	   	  low_time();//等待低电平
         	   	   	   	  high_time();
 /*获取高电平时间,判断是0还是1主要看高电平持续的时间,低电平时间是一样的*/                
         	   	   	   	   	if(W_TEMP<5)
/*实际上高电平的话STA_TEMP的值为6,因为一次时间为256ms根据自己定时器时间自行调整W_TEMP值*/
                 	   	   	   	 {
                 	   	   	   	   	STA_TEMP<<=1;//data>>=1;
                 	   	   	   	 }
                 	   	   	 else if(W_TEMP>4)//高电平持续时间长
                 	   	   	   	 {
                     	   	   	   STA_TEMP<<=1;//data>>=1;
                               STA_TEMP|=0x01; //0000 0001
             	   	   	   	   	
         	   	   	   	   	     } 	   	   	   	  
     	   	   	     }
             if(!i)//0和1的值为相反数,可以检测读取的数值是否正确
             {
     	   	   	   	NEC_CODE1=STA_TEMP;
     	           	T1DATA=NEC_CODE1;
     	   	   	 }
             else if(i==1)
     	   	   	  {
     	   	   	   //写判断读取正确错误代码
     	   	   	   	}

     	   	 else if(i==2)
     	   	   	  {
     	   	   	   	NEC_CODE2=STA_TEMP;
                 	T1DATA=NEC_CODE2;
     	   	   	   	}
 	         else if(i==3)
     	   	   	  {
     	   	   	    //写判断读取正确错误代码
     	   	   	   	}

         	    }
        }
    }
 }
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值