赞
踩
通过红外遥控器,控制DAYi(51开发板),开/关灯等,并将按键信息通过串口,发送到PC端;
DAYi开发板用的是第1种编码;
以upd6121为例:内部框图
参考原理图:
工作原理:
Step 1> 扫描键盘键盘,得到按键编码值;
Step 2> 然后,用内部产生的38KHz的载波,按照【NEC红外传输协议】键值等信息调制;
Step 3> 最后通过红外发射二极管发射出去;
6部分构成:
1> 引导码;
2> 客户码; 3> 客户码反码;
4> 数据码; 5> 数据码反码;
6>结束位;
客户码,数据码, 由8bit数据组成, 先发送LSB(最低有效位);
时间参数:
举栗子:
重复码波形:
38KHz载波保持9ms, 低电平4.5ms;
9ms = 9000us;
9000us / 26.3 ≈ 342个载波周期;
通过载波间隔不同表示 0 或 1;
0: 低电平0.565ms; 565us;
1: 低电平1.69ms; 1690us;
载波都是保持0.56ms = 560us;
560us / 26.3us = 21个载波周期;
一体式红外接收头,内部包含载波解调等功能,输出方波,非常方便了使用;
这1个大洋花的值;
输入波形的38KHz载波解调为:低电平;
输入波形的低电平反向输出为:高电平;
引导码解调波形:
实测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> 全在中断中处理,占用时间太长;
注意:
逻辑分析仪采样率设置为 80MHz;
1> 引导码:低电平9ms,高电平4.5ms;
2> 客户码: 0x00;
3> 客户码反码: 0xFF;
4> 数据码:0x08;
5> 数据码反码:0xF7;
一帧数据,大约68ms;
发现:有38KHz载波经过红外接收管解调后,都变成了低电平;
没有38KHz的都是高电平;
实测:
周期:26.4us
频率:37.87KHz
高电平:2.7us
低电平:23.7us
测量有一定误差,与理想波形基本一样
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。