找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

数码管显示32位红外遥控按键编码值(原创)

[复制链接]
admin 发表于 2012-9-2 05:12:21 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
看了工人大哥关于红外遥控器的帖子,打算自己也做一个,但是自己没有LCD屏幕,所以用LED数码管代替,还有和工人大哥的遥控器不同的是我手上是32位的遥控器。所以在网络上找了32编码遥控器的资料;


红外线遥控是目前使用很广泛的一种通信和遥控技术。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。

红外线是太阳光线中众多不可见光线中的一种,由德国科学家霍胥尔于1800年发现,又称为红外热辐射,他将太阳光用三棱镜分解开,在各种不同颜色的色带位置上放置了温度计,试图测量各种颜色的光的加热效应。结果发现,位于红光外侧的那支温度计升温最快。因此得到结论:太阳光谱中,红光的外侧必定存在看不见的光线,这就是红外线。也可以当作传输之媒界。 太阳光谱上红外线的波长大于可见光线,波长为0.751000μm。红外线可分为三部分,即近红外线,波长为0.751.50μm之间;中红外线,波长为1.506.0μm之间;远红外线,波长为6.0l000μm 之间。
真正的红外线夜视仪是光电倍增管成像,与望远镜原理全完不同,白天不能使用,价格昂贵且需电源才能工作。

 【红外遥控系统】   通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。


5_3_4477b0910bae55f.jpg




5_3_d4cd017b1db97fa.jpg

【遥控发射器及其编码】   红外遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NECuPD6121G组成发射电路为例说明编码原理。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:

  采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。



5_3_b6774f9cd7197fa.jpg




上述“0”“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如图3所示,连发波形如图4所示。


5_3_b7cf356d2e900d7.jpg




UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合的编码。

  当遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”“1”的个数不同而不同,大约在4563ms之间,图4为发射波形图。

  当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,108ms发射代码由一个起始码(9ms,一个结果码(4.5ms,8位地址码(9ms~18ms,8位地址码(9ms~18ms,8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
 代码格式(以接收代码为准,接收代码与发射代码反向)
    位定义




单发代码格式
5_3_2992c52539fd1f7.jpg


连发代码格式





注:代码宽度算法:

  16位地址码的最短宽度:1.12×16=18ms 16位地址码的最长宽度:2.24ms×16=36ms

  已知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms)×8=27ms

  ∴ 32位代码的宽度为(18ms+27ms)~(36ms+27ms)

  1解码的关键是如何识别“0”“1”,从位的定义我们可以发现“0”“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”0.56ms,“1”1.68ms,所以必须根据高电平的宽度区别“0”“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms/2=0.84ms最为可靠,一般取0.84ms左右均可。
 楼主| admin 发表于 2012-9-2 05:12:36 | 显示全部楼层
  2根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。

 



下面是我写的程序,程序分成两个部分,分开写的,一个部分是主程序数码管显示main(),一个部分是遥控器解码程序IRInit(),


第一部分;

/*注意这里在数码管上显示的是十进制数字,把其转换为十六进制就是遥控器的各个按键的编码*/

#include<reg52.h>
sbit key=P1^3;
unsigned int number=0;
unsigned char j,n,i=0;
unsigned int ledout[10];
unsigned char code led_num[]={0xfc,0x60,0xda,0xf2,0x66,
0xb6,0xbe,0xe0,0xfe,0xf6 }; //共阳数码管的0-9编码
unsigned char code led_duan[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdF,0xbF,0x7F}; //段选信号编码,我这里是直接用一个i/o口接的八个数码管的共阴极

extern void IRInit();//外部函数申明
void main()
{
while(1)
{ ledout[7]=led_num[number%10];
ledout[6]=led_num[number/10%10];
ledout[5]=led_num[number/100%10];
ledout[4]=led_num[number/1000%10];
ledout[3]=led_num[number%10];
ledout[2]=led_num[number/10%10];
ledout[1]=led_num[number/100%10];
ledout[0]=led_num[number/1000%10];
for(j=0;j<9;j++) //数码管动态显示,number的值;
{
P0=led_duan[j];
P2=ledout[j];
for(n=0;n<200;n++);
}
IRInit(); //调用解码程序,把遥控编码负值给number;
}

}




下面是第二部分;


#include <reg51.h>
sbit IRIN = P3^2; //红外接收器数据线
void IRdelay(char x); //x*0.14MS
unsigned char IRCOM[7];
extern unsigned int number; //外部变量声明


void IRInit()
{
IE |= 0x81; //允许总中断中断,使能 INT0 外部中断
TCON |= 0x01; //触发方式为脉冲负边沿触发

IRIN=1; //I/O口初始化
}


void IR_IN() interrupt 0
{
unsigned char j,k,N=0;
EX0 = 0;
IRdelay(15);
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{IRdelay(1);}

for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{IRdelay(1);}
while (!IRIN) //等 IR 变为高电平
{IRdelay(1);}
while (IRIN) //计算IR高电平时长
{
IRdelay(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}
}

if (IRCOM[2]!=~IRCOM[3]) //判断接收的第三组数据和四组数据是否相反
{ EX0=1;
return; }
EX0 = 1;
}
/**********************************************************/
void IRdelay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}



一下是实物效果图;因为一个手要拿手机,所以效果不好!


5_111576_c45e136af2bc3c5.jpg



5_111576_2fa67ef9897d969.jpg



5_111576_27ece155b98fc42.jpg



因为本人刚刚学习单片机不久,所以编程能力可能不怎么的,希望大家看看给点意见,谢谢,在这里还要谢谢工人大哥!!


5_111576_27ece155b98fc42.jpg




单片机红外遥控器设计.doc (308 KB, 下载次数: 13)
这里面是图片资料
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 22:52 , Processed in 0.065474 second(s), 14 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表