51单片机学习指南:红外遥控NEC协议详解
Infrared
1> 实验概述
通过红外遥控器,控制DAYi(51开发板),开/关灯等,并将按键信息通过串口,发送到PC端;
2> 红外遥控器
2.1> 长啥样?
DAYi开发板用的是第1种编码;
2.2> 咋干的?
以upd6121为例:内部框图
参考原理图:
工作原理:
Step 1> 扫描键盘键盘,得到按键编码值;
Step 2> 然后,用内部产生的38KHz的载波,按照【NEC红外传输协议】键值等信息调制;
Step 3> 最后通过红外发射二极管发射出去;
3> NEC红外传输协议
3.1> 6部分构成
6部分构成:
1> 引导码;
2> 客户码; 3> 客户码反码;
4> 数据码; 5> 数据码反码;
6>结束位;
客户码,数据码, 由8bit数据组成, 先发送LSB(最低有效位);
时间参数:
举栗子:
重复码波形:
3.2> 引导码
38KHz载波保持9ms, 低电平4.5ms;
9ms = 9000us;
9000us / 26.3 ≈ 342个载波周期;
3.3> 38KHz载波长啥样?
3.4> 咋表示 0 / 1
通过载波间隔不同表示 0 或 1;
0: 低电平0.565ms; 565us;
1: 低电平1.69ms; 1690us;
载波都是保持0.56ms = 560us;
560us / 26.3us = 21个载波周期;
4> 红外接收
4.1> 硬件电路
4.2> IRM-3638T内部框图
一体式红外接收头,内部包含载波解调等功能,输出方波,非常方便了使用;
这1个大洋花的值;
4.3> IRM-3638T解调波形
输入波形的38KHz载波解调为:低电平;
输入波形的低电平反向输出为:高电平;
引导码解调波形:
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> 整体波形
1> 引导码:低电平9ms,高电平4.5ms;
2> 客户码: 0x00;
3> 客户码反码: 0xFF;
4> 数据码:0x08;
5> 数据码反码:0xF7;
一帧数据,大约68ms;
发现:有38KHz载波经过红外接收管解调后,都变成了低电平;
没有38KHz的都是高电平;
6.2> 38KHz载波波形
实测:
周期:26.4us
频率:37.87KHz
高电平:2.7us
低电平:23.7us
测量有一定误差,与理想波形基本一样
6.3> 数据“0”波形
6.3> 数据“1”波形
6.4> 重复码
7> 视频链接
🔗 B站-红外遥控_视频教程
作者:零号-轩工