51单片机红外遥控程序.docx
《51单片机红外遥控程序.docx》由会员分享,可在线阅读,更多相关《51单片机红外遥控程序.docx(11页珍藏版)》请在冰点文库上搜索。
![51单片机红外遥控程序.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/930a2c6b-00b8-462b-ab78-0cb7db4713cc/930a2c6b-00b8-462b-ab78-0cb7db4713cc1.gif)
51单片机红外遥控程序
红外线遥控系统原理及软件解码实例
简介:
红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线
遥控装置具有体积小、功耗低、功
关键字:
红外
红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置
具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在
录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥
控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不
仅完全可靠而且能有效地隔离电气干扰。
1、红外遥控系统
通用红外遥控系统由发射和接收两大部分组成。
应用编解码专用集成电路
芯片来进行控制操作,如图
1所示。
发射部分包括键盘矩阵、编码调制、LED
红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
图
1红外线遥控系统框图
2、遥控发射器及其编码
遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运
用比较广泛,解码比较容易的一类来加以说明,现以日本
NEC的
uPD6121G组
成发射电路为例说明编码原理(一般家庭用的
DVD、VCD、音响都使用这种编
码方式)。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不
同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为
0.565ms、间隔
0.56ms、周期为
1.125
ms的组合表示二进制的“0”;以脉宽为
0.565ms、间隔
1.685ms、周期为
2.25
ms的组合表示二进制的“1”,其波形如图
2所示。
图
2遥控码的“0”和“1”(注:
所有波形为接收端的与发射相反)
上述“0”和“1”组成的
32位二进制码经
38kHz的载频进行二次调制以提高发
射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空
间发射,如图
3所示。
图
3遥控信号编码波形图
UPD6121G产生的遥控编码是连续的
32位二进制码组,其中前
16位为用
户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。
该芯片的用
户识别码固定为十六进制
01H;后
16位为
8位操作码(功能码)及其反码。
U
PD6121G最多额
128种不同组合的编码。
遥控器在按键按下后,周期性地发出同一种
32位二进制码,周期约为
108
ms。
一组码本身的持续时间随它包含的二进制
“0”和“1”的个数不同而不同,大约
在
45~63ms之间,图
4为发射波形图。
图
4遥控连发信号波形
当一个键按下超过
36ms,振荡器使芯片激活,将发射一组
108ms的编码
脉冲,这
108ms发射代码由一个引导码(
9ms),一个结果码(
4.5ms),低
8位地
址码(9ms~18ms),高
8位地址码(9ms~18ms),8位数据码(9ms~18ms)
和这
8位数据的反码(9ms~18ms)组成。
如果键按下超过
108ms仍未松开,
接下来发射的代码(连发码)将仅由起始码(
9ms)和结束码(
2.25ms)组成。
图
5引导码图
6连发码
3、遥控信号接收
接收电路可以使用一种集红外线接收和放大于一体的一体化红外线接收
器,不需要任何外接元件,就能完成从红外线接收到输出与
TTL电平信号兼容
的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和
红外线数据传输。
接收器对外只有
3个引脚:
Out、GND、Vcc与单片机接口非常方便,如图
7所示。
图7
①脉冲信号输出接,直接接单片机的
IO口。
②GND接系统的地线(0V);
③Vcc接系统的电源正极(+5V);
4遥控信号的解码
下面是一个对
51实验板配套的红外线遥控器的解码程序,它可以把红外遥
控器每一个按键的键值读出来,并且通过实验板上
P1口的
8个
LED显示出来,
在解码成功的同时并且能发出“嘀嘀嘀”的提示音。
ORG0000H
MAIN
JNBP2.2,IR;遥控扫描
LJMPMAIN;在正常无遥控信号时,一体化红外接收头输出是高
电平,程序一直在循环。
;=================================================
;解码程序
IR
;以下对遥控信号的9000微秒的初始低电平信号的识别,波形见图5。
MOVR6,#10
IR_SB
ACALLDELAY882;调用882微秒延时子程序
JBP2.2,IR_ERROR;延时882微秒后判断P2.2脚是否出现高电平如
果有就退出解码程序
DJNZR6,IR_SB;重复10次,目的是检测在8820微秒内如果出现
高电平就退出解码程序
;识别连发码,和跳过4.5ma的高电平。
JNBP2.2,$;等待高电平避开9毫秒低电平引导脉冲
ACALLDELAY2400
JNBP2.2,IR_Rp;这里为低电平,认为是连发码信号,见图6。
ACALLDELAY2400;延时4.74毫秒避开4.5毫秒的结果码
;以下32数据码的读取,0和1的识别请看图2
MOVR1,#1AH;设定1AH为起始RAM区
MOVR2,#4
IR_4BYTE
MOVR3,#8
IR_8BIT
JNBP2.2,$;等待地址码第一位的高电平信号
LCALLDELAY882;高电平开始后用882微秒的时间尺去判断信号
此时的高低电平状态
MOVC,P2.2;将P2.2引脚此时的电平状态0或1存入C中
JNCIR_8BIT_0;如果为0就跳转到IR_8BIT_0
LCALLDELAY1000
IR_8BIT_0
MOVA,@R1;将R1中地址的给A
RRCA;将C中的值0或1移入A中的最低位
MOV@R1,A;将A中的数暂时存放在R1中
DJNZR3,IR_8BIT;接收地址码的高8位
INCR1;对R1中的值加1,换下一个RAM
DJNZR2,IR_4BYTE;接收完16位地址码和8位数据码和8位数据,
;存放在1AH1BH1CH1DH的RAM中
;解码成功
JMPIR_GOTO
IR_Rp
;这里为重复码执行处
;按住遥控按键时,每过108ms就到这里来
JMPIR_GOTO
IR_ERROR
;错语退出
LJMPMAIN;退出解码子程序
;=================================================
;遥控执行部份
IR_GOTO
;这里还要判断1AH和1BH两个系统码或用户码,用于识别不同的遥控
器
;MOVA,1AH
;CJNEA,#xxH,IR_ERROR;用户码1不对则退出
;MOVA,1BH
;CJNEA,#xxH,IR_ERROR;用户码2不对则退出
;判断两个数据码是否相反
MOVA,1CH
CPLA
CJNEA,1DH,IR_ERROR;两个数据码不相反则退出
;遥控执行部份
;MOVA,1DH;判断对应按键
;CJNEA,#xxH,$+6
;LJMP-à跳到对应按键执行处
;CJNEA,#xxH,$+6
;LJMP-à跳到对应按键执行处
;.
MOVP1,1DH;将按键的键值通过P1口的8个LED显示出来!
CLRP2.3;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
LCALLDELAY2400
LCALLDELAY2400
LCALLDELAY2400
SETBP2.3;蜂鸣器停止
;清除遥控值使连按失效
MOV1AH,#00H
MOV1BH,#00H
MOV1CH,#00H
MOV1DH,#00H
LJMPMAIN
;=================================================
;延时子程序
;=============================882
DELAY882;1.085x((202x4)+5)=882
MOVR7,#202
DELAY882_A
NOP
NOP
DJNZR7,DELAY882_A
RET
;=============================1000
DELAY1000;1.085x((229x4)+5)=999.285
MOVR7,#229
DELAY1000_A
NOP
NOP
DJNZR7,DELAY1000_A
RET
;=============================2400
DELAY2400;1.085x((245x9)+5)=2397.85
MOVR7,#245
DELAY2400_A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZR7,DELAY2400_A
RET
END
51单片机红外遥控解码
Qq:
735491739
红外遥控发射芯片采用PPM编码方式,当发射器按键按下后,将发射一组108ms的编码脉冲。
遥控编码脉冲由前导码、8位用户码、8位用户码的反码、8位操作码以及8位操作码的反码组成。
通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之间的干扰。
编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。
前导码是一个遥控码的起始部分,由一个9ms的低电平(起始码)和一个4.5ms的高电平(结果码)组成,作为接受数据的准备脉冲。
以脉宽为0.56ms、周期为1.12ms的组合表示二进制的“0”;以脉宽为1.68ms、周期为2.24ms的组合表示二进制的“1”。
如果按键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
单片机采用外部中断INTI管脚和红外接收头的信号线相连,中断方式为边沿触发方式。
并用定时器0计算中断的间隔时间,来区分前导码、二进制的“1”、“0”码。
并将8位操作码提取出来在数码管上显示。
//解码值在Im[2]中,当IrOK=1时解码有效。
/*51单片机红外遥控解码程序*/
//用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
#include
#defineucharunsignedchar
sbitdula=P2^6;
sbitwela=P2^7;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
ucharf;
#defineImax14000 //此处为晶振为11.0592时的取值,
#defineImin8000 //如用其它频率的晶振时,
#defineInum11450 //要改变相应的取值。
#defineInum2700
#defineInum33000
unsignedcharIm[4]={0x00,0x00,0x00,0x00};
ucharshow[2]={0,0};
unsignedlongm,Tc;
unsignedcharIrOK;
voiddelay(uchari)
{
ucharj,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voiddisplay()
{
dula=0;
P0=table[show[0]];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[show[1]];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
}
//外部中断解码程序
voidintersvr1(void)interrupt2using1
{
Tc=TH0*256+TL0; //提取中断时间间隔时长
TH0=0;
TL0=0; //定时中断重新置零
if((Tc>Imin)&&(Tc {
m=0;
f=1;
return;
} //找到启始码
if(f==1)
{
if(Tc>Inum1&&Tc {
Im[m/8]=Im[m/8]>>1|0x80;m++;
}
if(Tc>Inum2&&Tc {
Im[m/8]=Im[m/8]>>1;m++;//取码
}
if(m==32)
{
m=0;
f=0;
if(Im[2]==~Im[3])
{
IrOK=1;
}
elseIrOK=0; //取码完成后判断读码是否正确
}
//准备读下一码
}
}
/*演示主程序*/
voidmain(void)
{
unsignedint a;
m=0;
f=0;
EA=1;
IT1=1;EX1=1;
TMOD=0x11;
TH0=0;TL0=0;
TR0=1;//ET0=1;
while
(1)
{
if(IrOK==1)
{
show[1]=Im[2]&0x0F; //取键码的低四位
show[0]=Im[2]>>4;
IrOK=0;
}
for(a=100;a>0;a--)
{
display();
}
}
}