51单片机红外解码资料+源代码docx.docx
《51单片机红外解码资料+源代码docx.docx》由会员分享,可在线阅读,更多相关《51单片机红外解码资料+源代码docx.docx(9页珍藏版)》请在冰豆网上搜索。
51单片机红外解码资料+源代码docx
51单片机红外解码(NEC)
1,遥控发射及其编码
红外遥控编码具有以下特征:
(1),采用脉宽调制串行码,以脉宽为0.565ms,间隔0,56ms.周期为1.125ms的组合表示二进制的“0”。
(2)
—脉宽为0.565ms,间隔1.685ms,周期为2.25nis的组合农示二进制的“1”。
iS控爾的S”和4<1"
红外发射电路如图:
左边是•个222的无极性电容,然后接地。
发送38K方波,就是载波
innn^z
in叩〃
innnzz
inn
1
V_►
9ms
4.5ms
■用户编硏
■曲位・
用户編码
键数据码
°引导码”
rI8«36m”
S
27ms
WS8.Sm$至76.5ms
■■、nn•4匚e•
上述“0”和“1”组成32位二进制代码,包括两次8位用户码,
8位数据码,和8位数据反码以及最后的同部位。
-体化红外接收管原理图
一体化红外接收头在检测到38K红外遥控载波信号时输出低电平,在未检测到39K的红外遥控载波信号时输出高电平。
发射器发射的的信号为
in
innn,z
innn„
innn”
1
9ms
-O-
4.5nis
p低她一
■用户编码
用户编码
键弦据码
键数弟玛反玛
°引导码”
"I8«36m”
S
27ms
58.5ms§76.5ms
接收器接收到的信号为
即9ms低电平后4.5ms高电平作为起始码,之后接受到两次8位客户码,一次八位数据码,和一•次八位数据反码。
遥控器〃按键按卜•之后周期件的发出同一种32位二进制编码周期约为108ms,纽码持续时间随本身的“0”“1”个数不同
而不同。
人约在45~63ms之间,当一个键按下36ms,振荡器使芯片激活,将发射一•组108ms的编码脉冲这108ms编码脉冲由一个起始码(9ms),一个结束码(4.5nis),低八位地址码(9〜18ms),高八位地址码(9〜18ms),八位数据码(9〜18ms),和这八位数据码反码(9〜18ms),如果按下超过108ms仍未松开,接卜-来发射的代码(连发代码)将仅有起始码(9ms)和结束码(2.5ms)组成。
解码的关键是如何识别零和一:
“0”和“1”都是以0.56ms低电平开始的,不同的是高电平宽度不同,“0”为0.56ms“1”为1.168ms,所以必须根据高电平宽度来区别“0”和T。
如果从0.56ms低电平过后,开始延时,0.56ms后,若读到的电平为低,说明该位为零,反之则为」,可靠其间,延时必须比0.56ms长一些,又不能超过1.12ms,否则如果该位为零,读到的已是下一位高电平,因此取(1.12+0.56)/2=0.84ms最为可靠,一般取0.84ms左右均可。
根据码的格式,应该等待9ms起始码和4.5111S结束码完成后才能读码。
备注:
定时器/计数器控制寄存器TCON
位序
号
D7
D6
D5
D4
D3
D2
D1
DO
位符
号
TF1
TR1
TF0
IR0
IE1
m
IE0
ITO
位地
址
8FH
8EH
8DH
8CH
8BH
8AH
89H
88H
源代码如K:
#include
#defineucharunsignedchar
#defiiieuintunsignedintsbitdula=P2A6;
sbitwela=P2A7;
uchariilime;〃红外时间
ucharstallflag;〃启动接收
ucharirdata[33];
ucharbitnmn;
ucharineceiveok;〃红外接收完毕
ucharircode[4];
uchariiprosok;
uchardisp[8];
ucharcodesmg_du[]={
0x3F7*0*/
0x067*1*/
Ox5B,/*2*/
0x4F7*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F/*8♦/
0x6F,/*9*/
0x77,/*A*/
0x7C,/*b*/
0x39,/*C*/
0x5E,/*d*/
0x79,/*E♦/
0x71,/*F*/
};
ucharcodesmg_we[]={
Oxfe,
Oxfid,
Oxfb,
0xf7,
Oxef,
Oxdf,
Oxbf0x7f,
};
voiddelay(uintz)
{
uintij;
fbr(i=z;i>O;i~)
for(j=110;j>0;j-);
}
voidtimerOinit(void)//定时器0初始化
{
TMOD=0X02;〃方式2
TH0=0X00;〃高第八位清零
TL0=0X00:
EA=1;〃打开全局中断允许位(中断允许寄存器IE)
ETO=1;〃打开定时器0中断允许位(中断允许寄存器
IE)
TRO=1;〃寄存器TCON,置一启动定时器0
}
voidintOiiiit(void)〃夕卜部中断0初始化
ITO=1;〃置一,跳变沿触犯方式,引脚INTO上,下降沿的
负跳变有效
EXO=1;〃外部中断0中断允许位
EA=1;〃全局中断允许位
}
voidirwork(void)
{
disp[0]=ircode[0]/16;
disp[l]=ircode[0]%l6;
disp[2]=ircode[1]/16;
disp[3]=ircode[l]%16;disp[4]=ircode[2]/16;
disp[5]=ircode[2]%16;
disp⑹=ircode[3]/l6;
disp[7]=ircode[3]%16;
}
voiddisplay(void)
{
uchari;
fdr(i=O;i<&i++)
dula=l;
PO=smg_du[disp[i]];
dula=O;
PO=OxfT:
wela=1;
PO=smg_we[i];
wela=0;
delay(l);
P0=0xfT;
delay(l);
}
}
voidiipros(void)//1.125nis/0.2777=4.39=4.05个irtime(数据
零)
{//2.25ins/0.2777=8.10个irtime(数据一)取
中间值6
ucliark,i,j;
ucharvalue;
k=l;〃跳过引导码
fbr(j=0;j<4;j-H-)
for(i=0;i<8;i++)
value=value»l;//7次if(irdata[k]>6)//8次{
value=value|0x80;
}
k-HF;
}ircode[j]=vahie;
}
irpTOSok=1;
〃从这里开始
〃定时器0初始化
〃外部中断0初始化
〃人循环
}
voidmain()
{
tiinerOinitO;intOiiiit();while(l)
iffineceiveok)
iipros();
ineceiveok=0;
}
if(iiprosok)
{
irwoik();
iiprosok=0;
}
display();
}
}
voidtiinerO()intemipt1〃d时器0,初值口动重装的8位怎时器{〃最大计数值256,2的8次方
irtiiiie++;//256//每加计数256次,计数次时间为0.001085069ms
}〃每加一,计数256次,共需0.2777ms
voidinto()intemipt0〃夕卜部中断0(INTO)
{
if(startflag)if(iitime>32)〃说明收到的是引导码13.5ms(引导码)
70.2777=48.7个inime
bitnum=0;
}
irdata[bitnum]=ii1ime;
iilime=0;
bimum++;
if(bitnum=33)
{
bitnum=0;ineceiveok=l;
}
}
else
{
stailflag=l;
irtime=0;
}