51单片机学习指南:红外遥控NEC协议详解

Infrared

  • 1> 实验概述
  • 2> 红外遥控器
  • 2.1> 长啥样?
  • 2.2> 咋干的?
  • 3> NEC红外传输协议
  • 3.1> 6部分构成
  • 3.2> 引导码
  • 3.3> 38KHz载波长啥样?
  • 3.4> 咋表示 0 / 1
  • 4> 红外接收
  • 4.1> 硬件电路
  • 4.2> IRM-3638T内部框图
  • 4.3> IRM-3638T解调波形
  • 5> 程序设计
  • 5.1> 编程思路
  • 6> 逻辑分析仪-测试波形
  • 6.1> 整体波形
  • 6.2> 38KHz载波波形
  • 6.3> 数据“0”波形
  • 6.3> 数据“1”波形
  • 6.4> 重复码
  • 7> 视频链接

  • 1> 实验概述

    通过红外遥控器,控制DAYi(51开发板),开/关灯等,并将按键信息通过串口,发送到PC端;

    1

    1

    8


    2> 红外遥控器


    2.1> 长啥样?

    21

    DAYi开发板用的是第1种编码;



    2.2> 咋干的?

    22

    以upd6121为例:内部框图
    2.1

    参考原理图:
    21
    工作原理:

    Step 1> 扫描键盘键盘,得到按键编码值;
    Step 2> 然后,用内部产生的38KHz的载波,按照【NEC红外传输协议】键值等信息调制;
    Step 3> 最后通过红外发射二极管发射出去;


    3> NEC红外传输协议


    3.1> 6部分构成

    6部分构成:
    1> 引导码;
    2> 客户码; 3> 客户码反码;
    4> 数据码; 5> 数据码反码;
    6>结束位;

    客户码,数据码, 由8bit数据组成, 先发送LSB(最低有效位);

    31

    时间参数:
    22

    举栗子:
    44

    重复码波形:


    3.2> 引导码

    21

    38KHz载波保持9ms, 低电平4.5ms;
    9ms = 9000us;
    9000us / 26.3 ≈ 342个载波周期;


    3.3> 38KHz载波长啥样?

    222


    3.4> 咋表示 0 / 1

    34

    通过载波间隔不同表示 0 或 1;
    0: 低电平0.565ms; 565us;
    1: 低电平1.69ms; 1690us;
    载波都是保持0.56ms = 560us;
    560us / 26.3us = 21个载波周期;


    4> 红外接收


    4.1> 硬件电路

    41


    4.2> IRM-3638T内部框图

    422

    42

    一体式红外接收头,内部包含载波解调等功能,输出方波,非常方便了使用;
    这1个大洋花的值;


    4.3> IRM-3638T解调波形

    43

    输入波形的38KHz载波解调为:低电平;
    输入波形的低电平反向输出为:高电平;


    引导码解调波形:

    433


    5> 程序设计


    5.1> 编程思路

    实测IRM-3638T解调波形:

    #include "bsp.h"
    
    uchar8_t ir_code[4];
    uchar8_t ir_over_f = 0x00;
    
    void IR_Init(void)
    {
    	IR_RX = 1;  // 初始化红外接收端口
    	
    	IT0 = 1;	// 外部中断0,下降沿触发
    	EX0 = 1;	// 使能外部中断0
    	EA = 1;		// 打开总中断
    }
    
    
    uchar8_t IR_Read_Byte(void)
    {
    	uchar8_t i = 0;
    	uchar8_t time_lim = 0; 	//超时检测
    	uchar8_t ret;
    
    	for (i = 0; i < 8; i++) {
    		
    		//Step 1>处理低电平
    		time_lim = 0;
    		while ((IR_RX == 0) && (time_lim < 7)) {
    			Delay100us();
    			time_lim++;
    		}
    		
    		//Step 2>高电平计时
    		// 0: 570us;
    		// 1: 1700us;
    		time_lim = 0;
    		while ((IR_RX == 1) && (time_lim < 19)) {
    			Delay100us();
    			time_lim++;
    		}
    		
    		//Step 3> 根据高电平时间,读出数据0/1
    		ret = ret >> 1;
    		if (time_lim <=  7) {
    			ret = ret & 0x7F;
    		} else if (time_lim > 7) {
    			ret = ret | 0x80;
    		}
    	}
    
    	return ret;
    }
    
    
    void IR_handle() interrupt 0
    {
    	uchar8_t i = 0;			//4字节数据
    	uchar8_t time_lim = 0; 	//超时检测
    	ir_over_f = 0;
    	
    	//Step 1> 判断引导码 9ms低电平
    	time_lim = 0;
    	while ((IR_RX == 0) && (time_lim < 90)) {
    		Delay100us();
    		time_lim++;	
    	}
    	
    	// 排除干扰信号
    	if (time_lim < 80) {
    		return;
    	}
    
    	//Step 2> 判断引导码 4.5ms高电平
    	time_lim = 0;
    	while ((IR_RX == 1) && (time_lim < 50)) {
    		Delay100us();
    		time_lim++;
    	}
    	
    	
    	// 排除重复码Repeat
    	if (time_lim < 40) {
    		return;
    	}
    	
    	for (i = 0; i < 4; i++) {
    		ir_code[i] = IR_Read_Byte();
    	}
    	
    	ir_over_f = 1;
    }
    
    
    

    程序存在问题:
    1> 全在中断中处理,占用时间太长;


    6> 逻辑分析仪-测试波形

    注意:
    逻辑分析仪采样率设置为 80MHz;


    6.1> 整体波形

    61

    1> 引导码:低电平9ms,高电平4.5ms;
    2> 客户码: 0x00;
    3> 客户码反码: 0xFF;
    4> 数据码:0x08;
    5> 数据码反码:0xF7;
    一帧数据,大约68ms;

    发现:有38KHz载波经过红外接收管解调后,都变成了低电平;
    没有38KHz的都是高电平;


    6.2> 38KHz载波波形

    62

    实测:
    周期:26.4us
    频率:37.87KHz
    高电平:2.7us
    低电平:23.7us
    测量有一定误差,与理想波形基本一样

    222


    6.3> 数据“0”波形

    63


    6.3> 数据“1”波形

    63


    6.4> 重复码

    64


    7> 视频链接

    🔗 B站-红外遥控_视频教程

    作者:零号-轩工

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机学习指南:红外遥控NEC协议详解

    发表回复