这几天弄了很久的遥控器解码,始终弄不好。经过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]
需要完整程序代码可以联系我。