51单片机 - 红外遥控NEC协议


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站-红外遥控_视频教程

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是51单片机红外遥控发射NEC协议的程序代码: ``` #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code table[33] = {0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff}; uchar count, i, j; void delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void sendone(void) { P1 = 0; delay(1); P1 = 1; delay(2); P1 = 0; delay(1); } void sendzero(void) { P1 = 0; delay(1); P1 = 1; delay(1); P1 = 0; delay(2); } void send(uchar data) { uchar i; for(i=0;i<8;i++) { if(data&0x01) sendone(); else sendzero(); data >>= 1; } } void main() { TMOD = 0x01; TH0 = 0xFC; TL0 = 0x67; TR0 = 1; ET0 = 1; EA = 1; while(1) { send(0x00); send(0x00); send(0x00); send(0x00); send(0x00); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); delay(100); } } void timer0() interrupt 1 { TH0 = 0xFC; TL0 = 0x67; count++; if(count == 15) { P1 = 1; delay(1); P1 = 0; count = 0; } } ``` 该程序使用了51单片机的定时器和外部中断,通过红外发射管发送NEC协议格式的红外码。在main函数中循环发送了一组红外码,通过定时器中断控制红外码的发送频率。其中sendone和sendzero函数分别表示发送1和0的红外码,send函数用于发送8位数据。注意在使用该程序时需要根据具体硬件电路设计进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值