红外遥控器接收程序
红外接收解码原理和源程序

上述“0”和“1”构成旳32位二进制码经38kHz旳载频进行二次调制以提升发射效率,到达降低电源功耗旳目旳。然后再经过红外发射二极管产生红外线向空间发射,如图。
UPD6121G产生旳遥控编码是连续旳32位二进制码组,其中前16位为顾客辨认码,能区别不同旳电器设备,预防不同机种遥控码相互干扰。芯片厂商把顾客辨认码固定为十六进制旳一组数;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合旳编码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身旳连续时间随它包括旳二进制“0”和“1”旳个数不同而不同,大约在45~63ms之间,图4为发射波形图。当一种键按下超出36ms,振荡器使芯片激活,将发射一组108ms旳编码脉冲,这108ms发射代码由一种起始码(9ms),一种成果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据旳反码(9ms~18ms)构成。假如键按下超出108ms仍未松开,接下来发射旳代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)构成。
注:P3.2接旳是外部中断
红外接受头将38K载波信号过虑,得到与发射代码反向接受代码
发射端旳“0”和“1”
红外解码旳关键就是辨认 0和1
Hale Waihona Puke 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左右均可。
[教材]38kHz红外发射与接收
![[教材]38kHz红外发射与接收](https://img.taocdn.com/s3/m/2926aa2642323968011ca300a6c30c225901f0b6.png)
38kHz 红外发射与接收红外线遥控器在家用电器和工业控制系统中已得到广泛应用,了解他们的工作原理和性能、进一步自制红外遥控系统,也并非难事。
1.红外线的特点人的眼睛能看到的可见光,若按波长排列,依次(从长到短)为红、橙、黄、绿、青、蓝、紫,如图1所示。
由图可见,红光的波长范围为0.62μm~0.76μm,比红光波长还长的光叫红外线。
红外线遥控器就是利用波长0.76μm~1.5μm之间的近红外线来传送控制信号的。
红外线的特点是不干扰其他电器设备工作,也不会影响周边环境。
电路调试简单,若对发射信号进行编码,可实现多路红外遥控功能。
2.红外线发射和接收人们见到的红外遥控系统分为发射和接收两部分。
发射部分的发射元件为红外发光二极管,它发出的是红外线而不是可见光,如图2所示。
常用的红外发光二极管发出的红外线波长为940nm左右,外形与普通φ5 mm发光二极管相同,只是颜色不同。
一般有透明、黑色和深蓝色等三种。
判断红外发光二极管的好坏与判断普通二极管一样的方法。
单只红外发光二极管的发射功率约100mW。
红外发光二极管的发光效率需用专用仪器测定,而业余条件下,只能凭经验用拉距法进行粗略判定。
接收电路的红外接收管是一种光敏二极管,使用时要给红外接收二极管加反向偏压,它才能正常工作而获得高的灵敏度。
红外接收二极管一般有圆形和方形两种。
由于红外发光二极管的发射功率较小,红外接收二极管收到的信号较弱,所以接收端就要增加高增益放大电路。
然而现在不论是业余制作或正式的产品,大都采用成品的一体化接收头,如图3所示。
红外线一体化接收头是集红外接收、放大、滤波和比较器输出等的模块,性能稳定、可靠。
所以,有了一体化接收头,人们不再制作接收放大电路,这样红外接收电路不仅简单而且可靠性大大提高。
图3是常用两种红外接收头的外形,均有三只引脚,即电源正VDD、电源负(GND)和数据输出(Out)。
接收头的引脚排列因型号不同而不尽相同,图3列出了因接收头的外形不同而引脚的区别。
c51、c52单片机红外线遥控接收解码c程序(可直接使用)

/ 亲,此程序以经过测试,可直接使用!!!/#include <reg51.h>#define uchar unsigned char#define uint unsigned intvoid delay(uchar x);sbit IRIN = P3^2;uchar IRCOM[4];void main(){ IE = 0x81;TCON = 0x01;IRIN=1;/* 此处可以根据按键码自由编写程序/以下为3*7遥控按键码//(也可以应用与其他类型遥控,本程序只以3*7遥控为例)/ / 0x45 0x46 0x47 // 0x44 0x40 0x43 // 0x07 0x15 0x09 // 0x16 0x19 0x0d // 0x0c 0x18 0x5e // 0x08 0x1c 0x5a // 0x42 0x52 0x4a /例如:while(1){switch(IRCOM[2]){case 0x45: P2=0x7f; break;case 0x44: P2=0xbf; break;case 0x07: P2=0xdf; break;case 0x16: P2=0xef; break;case 0x0c: P2=0xf7; break;case 0x08: P2=0xfb; break;case 0x42: P2=0xfd; break;case 0x52: P2=0xfe; break;case 0x4a: P2=0xff; break;case 0x5a: P2=0x00; break;}} */while(1);} //end main/**********************************************************/ void IR_IN(void) interrupt 0 //外部中断服务程序{unsigned char j,k,N=0;EX0 = 0;delay(15);if (IRIN==1){ EX0 =1;return;}//确认IR信号出现while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
红外线遥控解码接收程序-C语言

{
uchar i,j;
i=5;
do{j=95;
do{j--;}
while(j);
i--;
}while(i);
}
/*---------------------------延时882us子程序-----------------------*/
date[i]>>=1;
date[i]=date[i]|0x80;
}
} //1位数据接收结束
} //32位二进制码接收结束
/*-----------------------红外解码程序(核心)-----------------*/
/*----------------------------------------------------------*/
void IR_decode()
{
uchar i,j;
//在STC12C5410上运用红外线解码程序.主要的问题在于延迟上。
#include <regx51.h>
#define uchar unsigned char
#define uint unsigned int
#define IR_RE P3_2
bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效
红外线遥控解码接收程序-C语言
#include <regx51.h>
#define uchar unsigned char
#define uint unsigned int
#define IR_RE P3_2
bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效
10款好用的手机红外线遥控器软件合集

10款好⽤的⼿机红外线遥控器软件合集 Android⼿机有个⼤受欢迎的功能之⼀是红外线扩充(IRBlaster)。
通过您智能⼿机上内置红外IR发射器或外置发射器,您可以可靠控制您的电视机、机顶盒、DVD 播放器、蓝⽛光碟机、Roku、苹果电视、⾳响系统和像空调以及加热器这样的家⽤电器。
要使⽤这个功能,就需要⼀款强⼤红外遥控器软件,应⽤市场中红外线遥控器很多,很多⽹友不知道哪个好⽤。
在这⾥,我们精⼼整理10款最好的⽤的Android⼿机红外线遥控器app分享!注意:请确认⼿机内置红外遥控功能,未内置红外遥控功能的⼿机需要使⽤红外线发射器配件⽅可实现遥控功能。
1、遥控精灵《遥控精灵》家电遥控是通过红外信号传递实现的,使⽤本软件遥控家电需要⼿机⽀持红外遥控;⽆内置红外功能的⼿机需购买配件,或使⽤APP的wifi遥控功能控制联⽹设备,如互联⽹盒⼦、wifi智能插座、摄像头等。
最好的家电遥控APP,五千万⽤户推荐的⼿机万能遥控器软件,把空调、机顶盒、电视遥控器统统装进⼿机!2、AnyMote Smart Remote《AnyMote⼿机遥控器 AnyMote Smart Remote》是⼀款利⽤红外技术来将⼿机改造成遥控器的软件,它可以控制你的智能电视,同时还⽀持AIR⼿势操作。
3、遥控⼤师《遥控⼤师》史上最发烧的⼿机万能遥控器,⼿机⼀秒变智能遥控器,⼀部⼿机遥控所有家⽤电器!完美遥控电视机、机顶盒、空调、投影仪、⽹络盒⼦、DVD、电风扇等⼏乎所有家电;⾃动匹配全球电器产品库 + 强⼤DIY⼿动学习功能。
打开⼿机就可查看电视机上所有频道正在播出的电视节⽬单,点击节⽬名称就可以直接遥控机顶盒切换频道播放这个节⽬,所见即所控。
全球3000+频道最全⾯、最准确的⼀周电视节⽬预告。
内置智能导视遥控、模拟遥控、列表遥控等多种遥控模式。
《Peel智能遥控器 peel smart remote》是世界上最流⾏的智能遥控器,在全球拥有 1.5 亿多激活⽤户以及每个⽉超过 100 亿条智能遥控命令。
自己写的51单片机的红外线遥控接收程序(C语言)

//51单片机做的红外遥控实验(C语言)#include<reg51.h>#define u8 unsigned char#define u16 unsigned int#define ID 0x00 //本遥控器的ID号sbit ir=P3^3;code u8 seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9的段码code u8 s[]={1,0x40,0x48,0x04,0x02,0x05,0x54,0x0A,0x1E,0x0E}; u8 buf[4];bit ir_f=0;u8 nu;void delay(u16 x){while(x--);}void show(u16 x){u8 i=0,k=0;u8 s[4];kk:s[i]=x%10;if((x/10)>=1){x=x/10;i++;goto kk;}k=i+1;for(i=0;i<k;i++){P0=seg[s[i]];P2=~(8>>i);delay(300);P0=0XFF;P2=0XFF;}}void timer0_init(){TH0=0;TL0=0;TMOD|=0x01;TR0=0;}u16 low_test(){u16 t;TR0=1;while((ir==0)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0; //t=(TH*256+TL0);//机器周期数return t;}u16 high_test(){u16 t;TR0=1;while((ir==1)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0;return t;}/*u16 time_test(bit x){}*/u8 receive_8bit(){u8 d,i;u16 t;for(i=0;i<8;i++){t=low_test();t=high_test();d>>=1;if((t>=2750)&&(t<=3100)){d|=0x80;}}return d;}void ir_decode(){u16 t;u8 i;if(ir==0)//有遥控信号{t=low_test();//8295-9000us,倍频的是16590-18000if((t>=14500)&&(t<=18000))//检查引导码低电平时间{t=high_test();if((t>=8000)&&(t<=9000))//检查高电平{for(i=0;i<4;i++){buf[i]=receive_8bit();}if(buf[0]==(~buf[1]))//检查系统码是否正确{if(buf[0]==ID){if(buf[2]==(~buf[3])){//具体按键处理ir_f=1; //遥控有效}}}}}}}/*void key(){if(buf[2]==0x40){P1^=(1<<0);}if(buf[2]==0x48){P1^=(1<<1);}}*/void ir_execuse(){if(ir_f==1){switch(buf[2]){case 0x40:P1^=(1<<0);break;case 0x48:P1^=(1<<1);break;case 0x04:P1^=(1<<2);break;case 0x02:P1^=(1<<3);break;case 0x05:P1^=(1<<4);break;case 0x54:P1^=(1<<5);break;case 0x0A:P1^=(1<<6);break;case 0x1E:P1^=(1<<7);break;}ir_f=0;}}void show_d(){u8 j;for(j=0;j<10;j++){if(s[j]==buf[2]){nu=j;break;}}show(nu);}void isr_init(){EA=1;EX1=1;//外部中断,一直看3.3有没有下降沿。
红外接收程序讲解

红外接收程序讲解 TYYGROUP system office room 【TYYUA16H-TYY-TYYYUA8Q8-红外接收程序讲解1、红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
下面,我们将使用下面两种设备:另外,使用51单片机进行解码。
2、原理图从原理图看出,IR的data脚与51的PD2相连。
2、红外发射原理要对红外遥控器所发的信号进行解码,必须先理解这些信号。
a) 波形首先来看看,当我们按下遥控器时,红外发射器是发送了一个什么样的信号波形,如下图:由上图所示,当一个键按下超过22ms,振荡器使芯片激活,将发射一组108ms的编码脉冲(由位置1所示)。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码由位置3所示)将仅由起始码(9ms)和结束码()组成。
下面把位置1的波形放大:由位置1的波形得知,这108ms发射代码由一个起始码(9ms),一个结果码(),低8位地址码(用户编码)(9ms~18ms),高8位地址码(用户编码)(9ms~18ms),8位数据码(键值数据码)(9ms~18ms)和这8位数据的反码(键值数据码反码)(9ms~18ms)组成。
b) 编码格式遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同。
通常有曼彻斯特编码和脉冲宽度编码。
XS-091遥控板的0和1采用PWM方法编码,即脉冲宽度调制。
下图为一个发射波形对应的编码方法:放大0和1的波形如下图:这种编码具有以下特征:以脉宽为、间隔、周期为的组合表示二进制的“0”;以脉宽为、间隔、周期为的组合表示二进制的“1”。
3、红外接收原理a) 波形红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:放大,位定义0和位定义1波形如下:4、解码原理及算法注:代码宽度算法:16位地址码的最短宽度:×16=18ms 16位地址码的最长宽度:×16=36ms可以得知8位数据代码及其8位反代码的宽度和不变:(+)×8=27ms所有32位代码的宽度为(18ms+27ms)~(36ms+27ms)对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。
红外遥控器程序及原理、程序

Data=0;//收到数据 0 }
if(Ok==1) {
hw_jsm<<=1; hw_jsm+=Data;
if(Num>=32)
{ hw_jsbz=1; break }
EXTI_ClearITPendingBit(EXTI_Line15); }
printf_init(); //printf 初始化
while(1)
{
if(hw_jsbz==1) //如果红外接收到
{
hw_jsbz=0;
//清零
printf("红外接收码 %0.8X\r\n",hw_jsm); //打印
hw_jsm=0;
//接收码清零
}
}
}
1.1 红外遥控简介简介 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低, 成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用 到计算机系统中。 由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在 设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控 频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器, 可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以 及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影 响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电 器,也不会影响临近的无线电设备。 红外遥控的编码目前广泛使用的是: NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM(脉冲位置调制)。 普中科技 STM32 开发板配套的遥控器使用的是 NEC 协议,其特征如下: 1、 8 位地址和 8 位指令长度; 2、地址和命令 2 次传输(确保可靠性) 3、 PWM 脉冲位置调制,以发射红外载波的占空比代表“ 0”和“ 1”; 4、载波频率为 38Khz; 5、位时间为 1.125ms 或 2.25ms; NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms ( 560us 脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms( 560us 脉冲+560us 低 电平) 。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样, 我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。 NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步 码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制 反 码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的 可靠性(可 用于校验)。 2.数据码格式 数据格式包括了引导码、用户码、数据码和数据码反码,编码总占 32 位。数据反码是数据 码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电 路中被设置成第一段用户码的反码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//STC89C52RC
//11.0592MHZ
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define TH0_V ALUE 0xc5
#define TL0_V ALUE 0xc5 // 定时器计数值
#define ANT P2^4 //红外IO口,可任意一个IO
//系统变量定义区============================================================
volatile unsigned char irr_b=0,s_s=0;//irr_b接收状态指示,s_s显示许可
volatile signed long da=0; //32位数据码
volatile unsigned char wb=0, a=0; //wb为接收到的位数,a为接收到信号高低电平判断依据volatile unsigned int js=0; //定时器计数
volatile unsigned char a1=1,a2=1; //上升沿处理变量
void timer_init(void)
{
ET0=0;
TMOD=0x02;
TCON=0x10;
TL0=TL0_VALUE;
TH0=TH0_V ALUE;
ET0=1;
}
void timer_start()
{
TR0=1;
EA=1;
}
void timer0_interrupt(void) interrupt 1 //大约63us中断一次
{
js++;
//判断下降
a2=ANT;
if (a1>a2)
{
if(irr_b==0) //第一个中断
{
irr_b=1; //状态为:开始接收
js=0;
}
else if(irr_b==1) //第二个以后的中断
{
a=js; //读取定时器的值
if((170<a)&&(a<240)) //判断是引导,还是数据10.7ms-15.7ms 引导码长13.5ms
{
wb=0; //数据计数清零
da=0; //数据清零
js=0; //定时器清零
}
else //数据
{
if((8<a)&&(a<25)) //0.5ms-1.57ms 低电平长1.125ms
{
wb++;
js=0;
da=(da<<1) ;
}
else
{
if((25<a)&&(a<45)) //1.57ms-2.8ms 高电平长2.25ms
{
wb++;
js=0;
da=(da<<1) +1 ;
}
}
if(wb>=32) //数据长度够32位
{
irr_b=0; //状态为停止接收
wb=0; //数据计数清零
s_s=1; //打开显示许可
}
}
}
}
a1=a2; //a为两个下降沿之间的时间
}
void program(void)
{
uchar ds=0,d1;
while(1)
{
ds=js;
if(ds>250) //定时器超时,接收复位
{
js=0;
irr_b=0;
da=0;
wb=0;
s_s=0;
}
if(s_s==1) //显示开关打开,开始显示
{
TR0=0; //关闭全局中断
//显示设备码
d1=da>>8;
d1=da; //把long型的da强制转换为char型的d1
switch(d1)
{
case 0xff:P2=0xff;uart_tx(255);break; //停止,灯全灭
case 0x9f:P2=0xfe;uart_tx(191);break; //正转,对应的灯亮
case 0x5f:P2=0xfd;uart_tx(239);break; //反转,对应的灯亮
case 0xaf:P2=0xfb;uart_tx(251);break; //加速,对应的灯亮
case 0x6f:P2=0xf7;uart_tx(254);break; //减速,对应的灯亮
default:break; }
s_s=0; //关闭显示开关
TR0=1; //开全局中断
}
}
}
void delay_ms(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j=0;j<75;j++);
}
}
void uart_init()
{
TMOD|=0X20; //只把M1置为1,其余位不变,默认为0
TH1=0XFD;
TL1=0XFD;
SCON=0X50; // 设定串行口工作方式
PCON&=0XEF; // 波特率不倍增,只把倍增位置0,其他位保持不变,默认为0
TR1=1;
}
void uart_tx(unsigned char txd)
{
SBUF=txd;
while(!TI);
TI=0;
}
void uart_cn(unsigned char *cn,unsigned char cn_nub)
{
unsigned char i;
for(i=0;i<(cn_nub);i++)
{
uart_tx(cn[i]); //发送数据i
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //无实际意义,后移cpu指针,使指令按字对齐,减少取指令时的内存访问次数
}
}
void main()
{
timer_init();
timer_start();
uart_init();
EA=1;
P2=0xf0;
delay_ms(10);
program();
}。