红外编解码模块
- YS-IRTM模块
- 模块组成
- 模块通信
- 发射指令说明:
- 模块反馈
- 解码信息输出
- 51单片机测试代码
YS-IRTM模块
- 这个模块在某宝非常容易买到,内置刷好了固件的单片机,串口给指令就能直接发射NEC红外信号,用串口助手调试非常方便
模块组成
- 红外发射头:用于发射红外信号, 波长为940nm 38k NEC编码信号的发射
- 红外接收头:用于接收 NEC 红外信号, 进而单片机进行分析解码操作
- 红外头扩展: 该接口为红外发射头的扩展, 可以连接多个红外发射头( 常称红外发射模块) , 用于安放到不同的位置实现多方位控制
- UART 单片机串口通信接口:该端口为单片机串口( TTL) , 作为与外界单片机的通信桥梁, 其默认设置的波特率为9600bps
模块通信
发射指令说明:
地址 | 操作位 | 数据位1 | 数据位2 | 数据位3 |
---|---|---|---|---|
0xA1(0xFA) | 0xF1或0xF2或0xF3 | 8bit | 8bit | 8bit |
- 地址:A1为默认地址( 可改); FA 为通用地址 ( 不可改)
- 操作位:该位的数据用于代表当前的工作状态:
- F1:红外发射状态。 例:发射 NEC 信号编码为 1C 2F 33 {A1,F1,1C,2F,33}
- F2:进入修改串口通信地址状态。 例:改串口通信地址为0xA5 {A1,F2,A5,00,00}
- F3 进入修改波特率状态。 例:改波特率为9600bps {A1,F3,02,00,00}
- 波特率对应序号:
- 01 4800bps
- 02 9600bps
- 03 19200bps
- 04 57600bp
模块反馈
- F1 :发射成功
- F2 :串口地址修改成功
- F3 :波特率设置成功
- 无返回代表指令接收错误、 操作不成功, 以上指令操作重启有效
解码信息输出
-
NEC 红外信号编码由1个16位用户码( 分为高低8 位) 、 1个命令码和1个命令码的反码组成。用户码1+用户码2+命令码+命令码反码
-
我们在做解码操作时, 只需要将遥控器对准红外接收头, 按下要解码的按键, 即可通过串口调试助手 查看到解码的结果,结果输出为用户码1+用户码2+ 命令码 三位。 在做编码发送时也只需要发送这三位 即可。
-
我家遥控器(华为IPTV)的几个按键解码:
电源 0xB3 0x4C 0xDC 静音 0xB3 0x4C 0x9C 加台 0xB3 0x4C 0x85 减台 0xB3 0x4C 0x86 加音 0xB3 0x4C 0x80 减音 0xB3 0x4C 0x81
51单片机测试代码
#include <reg52.h>
#define uchar unsigned char
#define key P1 //6个按键连到了P1
void delay(unsigned int ms) //@11.0592MHz
{
unsigned char i, j;
while(ms--){
i = 2;
j = 199;
do{
while (--j);
} while (--i);
}
}
void uartInit(void)
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFA; //设置定时初始值
TH1 = 0xFA; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
}
void sendData(char* c){ //发送字符数组给串口
uchar i=0;
for(i=0;i<5;i++){
SBUF = c[i];
while(!TI);
TI = 0;
}
}
void main(void)
{
uchar power[5]={0xA1,0xF1,0xB3,0x4C,0xDC}; //电源
uchar slience[5]={0xA1,0xF1,0xB3,0x4c,0x9C}; //静音
uchar chAdd[5]={0xA1,0xF1,0xB3,0x4c,0x85}; //加台
uchar chMin[5]={0xA1,0xF1,0xB3,0x4c,0x86}; //减台
uchar volAdd[5]={0xA1,0xF1,0xB3,0x4c,0x80}; //加音量
uchar volMin[5]={0xA1,0xF1,0xB3,0x4c,0x81}; //减音量
uartInit();
while(1){
key = 0xff;
if(key != 0xff){
delay(20);
while(key == 0xff);
delay(20);
switch(key){
case 0xfe:sendData(power);break;
case 0xf7:sendData(slience);break;
case 0xfd:sendData(chAdd);break;
case 0xef:sendData(chMin);break;
case 0xfb:sendData(volAdd);break;
case 0xdf:sendData(volMin);break;
}
}
}
}