C51 - 红外遥控NEC协议

Infrared

  • 1> 实验概述
  • 2> 红外遥控器
    • 2.1> 硬件电路
  • 3> NEC红外传输协议
    • 3.1> 5部分构成
    • 3.2> 引导码
    • 3.3> 38KHz载波长啥样?
    • 3.4> 咋表示 0 / 1
  • 4> 红外接收
    • 4.1> 硬件电路
    • 4.2> IRM-3638T内部框图
    • 4.3> IRM-3638T解调波形
  • 5> 程序设计
    • 5.1> 编程思路
    • 5.2> 代码实现
  • 6> 联调测试
    • 6.1> 实测波形
    • 6.2> 硬件设计


1> 实验概述

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

C51 - 红外遥控NEC协议_第1张图片

C51 - 红外遥控NEC协议_第2张图片


2> 红外遥控器


2.1> 硬件电路

upd6121内部框图:
C51 - 红外遥控NEC协议_第3张图片

参考原理图:
C51 - 红外遥控NEC协议_第4张图片
工作原理:

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


3> NEC红外传输协议


3.1> 5部分构成

5部分构成:1> 引导码; 2> 客户码; 3> 客户码反码; 4> 数据码; 5> 数据码反码;
客户码,数据码, 由8bit数据组成, 先发送LSB(最低有效位);

C51 - 红外遥控NEC协议_第5张图片

时间参数:
C51 - 红外遥控NEC协议_第6张图片


3.2> 引导码

C51 - 红外遥控NEC协议_第7张图片

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


3.3> 38KHz载波长啥样?

C51 - 红外遥控NEC协议_第8张图片


3.4> 咋表示 0 / 1

C51 - 红外遥控NEC协议_第9张图片

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


4> 红外接收


4.1> 硬件电路

C51 - 红外遥控NEC协议_第10张图片


4.2> IRM-3638T内部框图

C51 - 红外遥控NEC协议_第11张图片

C51 - 红外遥控NEC协议_第12张图片

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


4.3> IRM-3638T解调波形

C51 - 红外遥控NEC协议_第13张图片

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


引导码解调波形:

C51 - 红外遥控NEC协议_第14张图片


5> 程序设计


5.1> 编程思路

实测IRM-3638T解调波形:
C51 - 红外遥控NEC协议_第15张图片

用51单片机,把输出的波形分析出数据;


5.2> 代码实现

#include "bsp.h"


sbit IR_RX = P4^3;			// INT2# (interrupt 0)

unsigned char IrValue[5];  // IrValue的0-3用来放原始数据,4用来放经过校验确认无误的键值



void Delay5ms(void);


void IR_Init(void)
{
	IT2 = 1;	// 外部中断2下降沿触发
	EX2 = 1;	// 打开外部中断2
	EA = 1;		// 打开总中断

	IR_RX = 1;	// 初始化端口
}


void IR_handle() interrupt 6	// 外部中断2
{
	unsigned char i;			// 字节索引 
	unsigned char j;			// bit索引
	unsigned short err = 0;		// 超时检测
	unsigned char ir_cnt = 0;	// 记录高电平时间
						 
	Delay5ms();

	//确认是否真的接收到正确的信号
	if (IR_RX == 0) {	 		
	
		/* Step 1> 引导码 9ms低电平处理 */
		err = 1000;			
		while ((IR_RX == 0) && (err > 0)) {			
			Delay140us();		
			err--;
		} 

		if (IR_RX == 1)	{
			
			/* Step 2> 引导码 4.5ms高电平处理 */
			err = 500;
			while ((IR_RX == 1) && (err > 0)) {
				Delay140us();
				err--;
			}

			/* Step 3> 4组数据接收 */
			for (i=0; i<4; i++) {			
				for (j=0; j<8; j++)	{

					ir_cnt = 0;				
							
					/* 数据0/1的 560us的载波检测 */
					err = 60;		
					while ((IR_RX == 0) && (err > 0)) {
						Delay140us();
						err--;
					}

					/* 判断数据 是0还是1? */
					err = 500;
					while ((IR_RX == 1) && (err > 0)) {
						Delay140us();
						ir_cnt++;
						err--;

						if (ir_cnt > 30) {
							EX2 = 1;	
							return;
						}
					}

					IrValue[i] >>= 1;	//i表示第几组数据	IrValue[1] = IrValue[1] >> 1; 低位在前;

					/* 如果高电平出现大于565us,那么是1	*/
					if (ir_cnt >= 8) {
						IrValue[i] |= 0x80;
					}								
				}
			}
		}

		
		/* 判断数据,更新数据 */
		if (IrValue[2] == ~IrValue[3]) {
			IrValue[4] = IrValue[2];
			return;
		}
	}			
}


void Delay140us(void)		//@22.1184MHz
{
	unsigned char i;

	_nop_();
	i = 126;
	while (--i);
}

void Delay5ms(void)		//@22.1184MHz
{
	unsigned char i, j;

	i = 18;
	j = 235;
	do
	{
		while (--j);
	} while (--i);
}


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


6> 联调测试

6.1> 实测波形

C51 - 红外遥控NEC协议_第16张图片

直接测量红外接收的输出端波形,(下降沿,5ms时间格)

6.2> 硬件设计

红外接收引脚,必须连接到,带外部中断的引脚;

你可能感兴趣的:(单片机-C51,51单片机)