狂人呓语

HT6221红外遥控解码--51单片机

这几天弄了很久的遥控器解码,始终弄不好。经过2天的研究,终于将遥控部分弄出来了。大家可以参考一下,对其它遥控器也可以用,只要将时序改改就可以了。

[b]HT6221键码的形成[/b]
当一个键按下超过 36ms 振荡器使芯片激活 如果这个键按下且延迟大约 108ms,
这 108ms 发射代码由一个起始码 9ms ,一个结果码 4.5ms ,低 8 位地址码
9ms~18ms ,高 8 位地址码 9ms~18ms ,8 位数据码 9ms~18ms 和这 8 位数
据的反码 9ms~18ms 组成 如果键按下超过 108ms 仍未松开 接下来发射的
代码 连发代码 将仅由起始码 9ms 和结束码 2.5ms 组成
[b]代码格式 以接收代码为准 接收代码与发射代码反向[/b]
[img]download.asp?id=6[/img]
[img]download.asp?id=7[/img]
[img]download.asp?id=8[/img]
[img]download.asp?id=9[/img]
[img]download.asp?id=10[/img]

以下部分是本人写的程序:[html]

#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned int uint;

uchar mc,cmd[3];

//.....这里省略部分子函数.....

void main()
{
EA=1; //开总中断
EX0=1; //开外部中断0
mc=0;
while(1)
{
disp(mc); //显示函数
}
}

void rec() interrupt 0 //遥控器中断
{
uint i=0,n=0,j=0;
EA=0; //关中断

/*-------------头码-----------*/
while(!ir) //90ms低电平判断
{
delay0_14ms(); //延时0.14ms
n++;
}
if(n>=65 || n<40){EA=1;return;} //超过或者不足90ms退出

n=0; //N归零

while(ir) //45ms高电平
{
delay0_14ms();
n++;
}
if(n>=35 || n<20){EA=1;return;} //超过或者不足45ms退出

n=0; //N归零

/*-------------开始读取数据--------------------
*
* 数据格式:4个字节,每个字节都是从低位开始传输,总共32位
* 前2个字节为遥控的识别码(特征码),不同的设备识别码可能不一样。第3个字节为遥控代码,最后1个字节为遥控代码的反码
*--------------------------------------------*/
for(j=0;j<3;j++)
{
for(i=0;i<8;i++) //16位头码前8位
{
cmd[j]>>=1;
n=0;
while(!ir); //0.56ms低电平,数据开始传输
while(ir)
{
delay0_14ms();
n++;
} // n=C n=4

if(n>6) //1
cmd[j] |=0x80;
}
}
EA=1; //开中断
}
[/html]

需要完整程序代码可以联系我。

未经允许不得转载:狂人呓语 » HT6221红外遥控解码--51单片机

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址