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

上述“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 位。数据反码是数据 码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电 路中被设置成第一段用户码的反码。
红外线遥控器接收程序

/*红外线接收程序,本程序运行在NEC制下的遥控器下,在铁牛单片机开发板上可直接运行,用其他板子的朋友少作修改就行了。
本程序是参照了百度文库《红外数据传输》和铁牛开发板自带的示例程序才最终得以完成。
在学习的过程中我结合了两者的优势思想并整合为如下程序。
----何元杰 2010/09/04*/#include <reg51.h>//定义红外接收脚,sbit PIN_Rec=P3^3;//共阴数码管 0-9 a-f - 表code unsigned char table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};unsigned char disdate[4]={0};//显示管数据void delay(unsigned char ); //延时子函数void display( ); //数字的显示函数void main(void){unsigned char i=10;EA=1; //首先开启总中断EX1=1; //开启外部中断 1IT1=1; //设置成下降沿触发方式while(i){ //循环显示,接收都由中断处理display();i--;if(i==0) //为什么要这样?——是防止按键抖动产生的干扰啦。
{ //没加这一句之前接收总是不正确//花了我3个小时才找到原因啊EX1=1;i=255;}}}void display( ){unsigned char i;P1=0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管for(i=0;i<4;i++){ //动态显示P2=table[disdate[i]]; //查表法得到要显示数字的数码段delay(10);P2=0;P1++; //下一位数码管}}void delay(unsigned char num){//延时6*num+5个机器周期while(num)num--;}void hongwai(void) interrupt 2{ //外部中断 1 ,INT1(P3^3)连接红外线接收IC数据脚unsigned char i,j,tmp;EX1=0; //关闭中断delay(100);if(PIN_Rec) //防止干扰return;while(!PIN_Rec); //等待引导码9MS的低电平结束while(PIN_Rec); //等待4.5MS的高电平结束for(i=0;i<4;i++){tmp=0;for(j=0;j<8;j++){tmp>>=1;delay(30); //消除干扰while(!PIN_Rec); //等待0.56MS的低电平结束delay(140); //当大于0.8MS 后再判断遥控接收脚的电平if(PIN_Rec){tmp+=0x80;//数据是1,要继续延迟1MS才能跨入下个位编码的低电平中 delay(122);}}disdate[i]=tmp;}//校验接收是否有误if(disdate[0]==~disdate[1]&&disdate[2]==~disdate[3]){tmp=disdate[0];disdate[0]=disdate[0]/16;disdate[1]=tmp%16;tmp=disdate[2];disdate[2]=disdate[2]/16;disdate[3]=tmp%16;}else{disdate[0]=16;disdate[1]=16;disdate[2]=16;disdate[3]=16;}}。
基于STMFHAL库的红外接收程序

基于STM32F1HAL库的红外解码程序,核心思想是通过外部下降沿中断记录相邻两个下降沿的时间,记录的数据存入数组,再根据数据判断是0还是1,获得NEC协议的4个码。
程序使用PG15作为中断输入,使用基本定时器7定时,相比在中断里面等待的方式节省了CPU时间,提高了效率,也方便移植到其他型号的MCU上。
程序没有处理连发的问题,感兴趣的可以尝试修改。
.c文件#include"bsp_ir.h"//irdata[33]存储相邻下降沿的cnt计数值uint8_tirdata[33],cnt=0,IR_OK=0;TIM_HandleTypeDefir_timx;voidIR_Init(void){GPIO_InitTypeDefGPIO_InitStruct;IR_GPIO_CLK_ENABLE;GPIO_InitStruct.Pin=IR_GPIO_PIN;GPIO_InitStruct.Mode=GPIO_MODE_IT_FALLING;//下降沿中断GPIO_InitStruct.Pull=GPIO_PULLUP;//上拉HAL_GPIO_Init(IR_GPIO_PORT,&GPIO_InitStruct);HAL_NVIC_SetPriority(IR_EXTI_IRQn,1,1);HAL_NVIC_EnableIRQ(IR_EXTI_IRQn);IR_TIMx_Init(249,71);}//Tout=(arr+1)*(psc+1)/sck//设计Tout=250us,psc=71,arr=249,sck=72MHzvoidIR_TIMx_Init(uint16_tarr,uint16_tpsc){ir_timx.Instance=IR_TIMx;ir_=psc;ir_=TIM_COUNTERMODE_UP;ir_=arr;ir_=TIM_CLOCKDIVISION_DIV1;ir_=TIM_AUTORELOAD_PRELOAD_DISABLE;IR_TIMx_RCC_CLK_ENABLE();HAL_NVIC_SetPriority(IR_TIMx_IRQn,1,0);HAL_NVIC_EnableIRQ(IR_TIMx_IRQn);HAL_TIM_Base_Init(&ir_timx);__HAL_TIM_CLEAR_FLAG(&ir_timx,TIM_FLAG_UPDATE);HAL_TIM_Base_Start_IT(&ir_timx);}//定时器中断服务函数voidIR_TIMx_IRQHandler(void){HAL_TIM_IRQHandler(&ir_timx);}//定时器更新中断回调函数voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim) {if(htim->Instance==IR_TIMx){cnt++;}}//外部中断服务函数//根据霖锋老师89C51篇关于红外接收的程序修改voidIR_EXTI_IRQHandler(void){staticuint8_tuCounter;staticuint8_tStartflag=0;//开始接收标志HAL_GPIO_EXTI_IRQHandler(IR_GPIO_PIN);if(!Startflag){Startflag=1;cnt=0;}elseif(Startflag){if((cnt<60)&&(cnt>40))//引导码检测(9+4.5)/0.25=54 uCounter=0;irdata[uCounter]=cnt;//cnt存储了相邻两个下降沿的时间差cnt=0;uCounter++;if(uCounter==33)//接收完成{uCounter=0;IR_OK=1;Startflag=0;}}}//获得命令码//成功返回命令码,错误返回0uint8_tIR_GET_CODE(void){uint8_ti,j,k=1,value=0,ir_code[4];//ir_code[0]:用户码ir_code[1]:用户码反码ir_code[2]:命令码ir_code[3]:命令码反码if(IR_OK!=1)return0;else{IR_OK=0;for(i=0;i<4;i++){for(j=0;j<8;j++){value>>=1;//注释部分对应低位在前的情况if(irdata[k]>6) //0:1.125/0.25=4.5<6,1:2.25/0.125=9>6value|=0x80;k++;}ir_code[i]=value;}k=1;value=0;if(ir_code[2]+ir_code[3]==0xFF)//数据校验{returnir_code[2]; //返回的是命令码}elsereturn0;}}.h文件#ifndef_BSP_IR_H#define_BSP_IR_H#include"stm32f1xx_hal.h"//用PG15的EXTI中断来检测红外引脚电平跳变,基本定时器7用来计时//可根据自己需要修改#defineIR_TIMxTIM7#defineIR_TIMx_RCC_CLK_ENABLE()__HAL_RCC_TIM7_CLK_ENABLE()#defineIR_TIMx_IRQnTIM7_IRQn#defineIR_TIMx_IRQHandlerTIM7_IRQHandler#defineIR_GPIO_CLK_ENABLE __HAL_RCC_GPIOG_CLK_ENABLE()#defineIR_GPIO_PORTGPIOG#defineIR_GPIO_PINGPIO_PIN_15#defineIR_EXTI_IRQnEXTI15_10_IRQn#defineIR_EXTI_IRQHandlerEXTI15_10_IRQHandler//遥控器上按键的控制码,十进制,根据自己遥控器上的按键修改#definePOWER162#defineMODE98#defineSPEAK226#definePLAY34#definePREV2#defineNEXT194#defineEQ224#defineVOL_PLUS144#defineVOL_REDU168#defineRPT152#defineU_SD176#defineZERO104#defineONE48#defineTWO24#defineTHREE122#defineFOUR16#defineFIVE56#defineSIX90#defineSEVEN66#defineEIGHT74#defineNINE82voidIR_Init(void);voidIR_TIMx_Init(uint16_tarr,uint16_tpsc);uint8_tIR_GET_CODE(void);#endifMain函数中直接调用IR_GET_CODE函数即可获得命令码。
红外遥控接收头的使用方法

红外遥控接收头的使用方法
红外遥控接收头使用方法:
①首先确保购买的红外接收头与所需应用相匹配通常标识有工作电压和视接收角度以及频率响应范围;
②使用前阅读产品说明书了解引脚定义一般情况下有三个引脚分别为电源地线与信号输出根据颜色或者长度区分连接电路板对应位置;
③在焊接之前测试接收头功能用万用表测量电阻值正常情况下当遮挡发射管测得电阻应该接近无穷大移开障碍物后电阻变小表明内部光敏三极管导通;
④将接收头焊接到电路板上注意不要让焊点过大以免短路并保证其方向正确特别是对于表面贴装型防止反向安装导致无法工作;
⑤连接好电源确保供电稳定且符合接收头要求通常为3到5伏特过压可能会损坏设备然后接地最后连接信号线至微控制器相应端口;
⑥编写程序代码配置微控制器读取信号线状态大多数时候需要初始化GPIO端口为输入模式并设置中断来捕捉脉冲变化;
⑦在代码中实现解码算法用于解析从信号线读取到原始脉冲串转换成有意义指令通常红外通信协议如NEC RC5或者Sony SIRC定义了起始位标记位以及数据位格式;
⑧考虑增加软件滤波功能过滤掉因干扰造成误触发如重复检测信号有效性或者增加延迟来确认真正按键动作;
⑨测试整个系统通过按下遥控器上不同按钮观察是否能准确触发预期功能如果出现错误检查硬件连接及软件逻辑直至问题解决;
⑩实际部署过程中注意遮蔽或者导向措施以增强接收性能例如在接收头前加装导管限制接收角度避免非直接信号干扰;
⑪对于复杂应用场景可能需要支持多种遥控设备此时应该扩展解码库支持更多协议并且优化资源利用减少延迟提高响应速度;
⑫最后在长期运行下定期检查接收头及连线是否有物理损伤特别是在移动装置上震动可能导致接触不良定期维护可确保系统持续可靠运行;。
红外遥控器和接收器用户手册说明书

iBIO-Remote MCE遥控器用于Windows Win7™家庭高级版专业版旗舰版ii1欢迎购买我们的产品感谢您选购红外遥控器和接收器,它们专供Win7™家庭高级版,Win7™专业版和Win7™旗舰版所用,通过红外遥控器和接收器您可以访问和管理多媒体电脑以及其他外围设备。
※重要提示:如果您的多媒体电脑已安装接收器,请跳过手册中与接收器相关的部分。
步骤一安装电池遥控器使用两个AAA 或AA 电池(包装附带电池)。
在使用过程中请及时更换电池,以免电池漏液对设备造成损坏。
1.1 将遥控器电池仓盖打开。
1.2 装入电池,注意电池正负极与遥控器正负极相对应。
1.3 盖上遥控器电池仓盖。
步骤二 定位接收器为了获取最佳的性能,请确保遥控器和接收器之间没有障碍物阻挡且距离不超过10米;此外,应该避免强光直接照射在接收器的红外传感器上。
如果您之前有购买过红外接收器,请参阅手册“使用遥控器”章节。
2步骤三 连接接收器开机前,请将接收器连接主板红外接头。
注意:当接收器连接主板红外接头后,请进入BIOS 设置确保板载红外端口功能已激活。
([Advanced]→[SuperIO Configuration]→[OnBoard CIR Port]↓现在您可以通过遥控器来体验多媒体中心的各种功能。
只需将遥控对准接收器,您便可以随意操作享受遥控带给您的舒适感受。
5种按钮:•导航按钮:屏幕上各种菜单之间的移动。
(例如:向上箭头或者输入)•播放按钮:控制多媒体。
(例如:暂停或者停止)•影音和电源按钮:更换频道,调节音量。
(例如:上一频道或者静音)•快捷按钮:方便用户快速访问多媒体中心的主要媒体。
•数字键按钮:输入字母数字字符或电视频道。
3选择遥控器上的导航按钮可以进行媒体中心各菜单之间的移动。
按钮功能图标START 启动媒体中心功能菜单UP 向上移动选项DOWN 向下移动选项LEFT 向左移动选项RIGHT 向右移动选项OK 确认选项BACK 返回上级菜单MORE 提供更多信息45媒体中心的播放按钮功能类似于家庭普通电子设备如CD 、DVD 播放器的播放按钮。
红外线接收程序

遥控接收解码程序[C语言]2007年10月12日 星期五 14:06//实验目的:熟悉遥控接码解码的方法//数码管显示解码结果:高四位为用户码,低2位为按键码//硬件要求:拨码开关S10的第2位置ON,其他置OFF// 拨码开关S5、S6全部置ON// 其他拨码开关全部置OFF#include<pic.h>__CONFIG(0x1832);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#define uchar unsigned char#define uint unsigned int#define bitset(var,bitno)((var)|=1<<(bitno))#define bitclr(var,bitno)((var)&=~(1<<(bitno)))union {struct {unsigned b0:1;unsigned b1:1;unsigned b2:1;unsigned b3:1;unsigned b4:1;unsigned b5:1;unsigned b6:1;unsigned b7:1;}oneBit;unsigned char allBits;} myFlag;#define CNT2_1 myFlag.oneBit.b1#define CNT2_2 myFlag.oneBit.b2#define CNT2_3 myFlag.oneBit.b3#define CNT2 myFlag .allBitsstatic bit FLAGS ;static bit Bitin;union Csr{ unsigned long i;unsigned char Csra[4];}myCsra;#define RMT RA1 // ;遥控接收输入脚位地址(RA。
1)#define BITIN 7 //遥控接收数据位位标志uchar CNT0, CNT3,CNT4; //用户临时寄存器1--4uint CNT1;uchar TABADD; //数码管显示码取码用寄存器uchar CSR0; //;遥控键码反码寄存器uchar CSR1; //;遥控器键码寄存器uchar CSR2; //;遥控器用户码高8位寄存器uchar CSR3; //;遥控器用户码低8位寄存器uchar FLAGS2; //;临时寄存器uchar CSR2A ; //遥控接收32位数据暂存寄存器const uchartable[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x0a1,0x86,0x8e,};//0x00 // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f,//-------------系统初始化子程序------------------------------void initial (void){PORTA=0;ADCON1=7; // 设置RA口全部为普通数字IO口TRISA=0x02; // 将RMT设置为输入,其它所有IO口设置为输出TRISD=0; // ;RC口全部为输出PORTD=0xFF; //先让数码管全部不显示}//--------------------------------------------------------------------------------------------void RCV(){if(!RMT){CNT1=640; //4*256*10us 640*16=10。
c51学习型红外遥控器程序

c51学习型红外遥控器程序#include; //装入AT89X51头文件#include;//装入红外解码程序#include;//装入24c02读写程序sbit key=P1^0;//定义按键IOsbit led=P0^0; //定义指示ledsbit rel=P0^1;//定义输出控制脚unsigned char kaver; //定义kaver为输出口状态缓存unsigned char iccdate,irdate; //定义24c02数据和解码数据//延时10ms函数,用于开关消抖等delay10ms(){unsigned char i,j;for(i=20;i>;0;i--)for(j=248;j>;0;j--);}//学习红外解码并写入24c02的函数study(){IR_IN();irdate=IRCOM[3];iccdate=ReadIIC(W_cmd,0x00,R_cmd);if(irdate!=iccdate) //只在解码结果与读取结果不同时写入24C02{if(irdate!=0)//防止没有接收到红外信号,IRCOM[3]置零时,误写入0{WP=0;WriIIC(W_cmd,0x00,irdate);delay10ms();WP=1;led=0;while(key==0);//学习成功等待按键释放,led停止闪动作为指示}}}//进入学习状态时的led闪动函数flash(){unsigned char i;while(key==0){led=~led;for(i=50;i>;0;i--)study();}}//按键模式识别函数keymod(){unsigned char m=0;while(key==0) //如果按键按下,开始对按键时间进行计数{delay10ms();//计数时间延时m++;delay10ms();//计数时间延时if(m>;=90)//如果计数次数大于90次,等于按键按下时间大于约5秒后,进入led闪动学习模式{m=0;flash();}}if(m。
STC15系列只用一个定时器的红外接收程序

#define User_code 0xFD02 //定义红外接收用户码
/************* 以下宏定义用户请勿修改 **************/
#include "reg51.H"
#define uchar unsigned char
#define uint unsigned int
sbit P_TXD1 = P3^1; //定义模拟串口发送脚,打印信息用
sbit P_IR_RX = P0^1; //定义红外接收输入端口
bit P_IR_RX_temp; //Last sample
bit B_IR_Sync; //已收到同步标志
uchar IR_SampleCnt; //采样计数
对于用户码与User_code定义不同的遥控器,程序会将用户码一起从串口输出。
使用模拟串口发送监控显示编码,显示内容为ASCII码和中文。
本接收程序基于状态机的方式,占用CPU的时间非常少。
HEX文件在本目录的/list里面。
******************************************/
/*------------------------------------------------------------------*/
/************* 功能说明 **************
红外接收程序。适用于市场上用量最大的HT6121/6122及其兼容IC的编码。
//*******************************************************************************************
红外遥控器程序

红外遥控器程序:#include<reg52.h>sbit ir=P1^1;//红外输出//sbit P1_0=P1^0;sbit LED=P1^2;sbit qian=P2^1;sbit hou=P2^2;sbit zuo=P2^5;sbit you=P2^7;bit flag;unsigned int flag1;//===================================== //MS延时函数//=====================================void delayms(ms){unsigned char i;while(ms--)for(i=0;i<120;i++);}//===================================== //定时器T0初始化//===================================== void T0_init(void){TMOD=0x02;TH0=0xe6;TL0=0xe6;EA=ET0=1;}//====================================//定时器T0中断函数//====================================void Timer0(void) interrupt 1{flag1++;if(flag) ir=~ir;else ir=0;}//===================================//数据处理//===================================void cend_data(unsigned char add,unsigned char dat) {unsigned char unadd,undat;unsigned char i;unsigned char bir;unadd=~add;undat=~dat;TH0=0xe6;TL0=0xe6;LED=~LED;flag1=0;flag=1;while(flag1<300); //9MS初始码flag1=0;flag=0;while(flag1<150);//4.5MS结束码for(i=0;i<8;i++) //发送用户码 {flag1=0;flag=1;while(flag1<18);bir=(add>>i)&0x01;flag1=0;flag=0;if(bir==0x01) while(flag1<56); else while(flag1<18);}for(i=0;i<8;i++) //发送用户反码 {flag1=0;flag=1;while(flag1<18);bir=(unadd>>i)&0x01;flag1=0;flag=0;if(bir==0x01) while(flag1<56); else while(flag1<18);}for(i=0;i<8;i++) //发送数据码{flag1=0;flag=1;while(flag1<18);bir=(dat>>i)&0x01;flag1=0;flag=0;if(bir==0x01) while(flag1<56); else while(flag1<18);}for(i=0;i<8;i++) //发送数据反码 {flag1=0;flag=1;while(flag1<18);bir=(undat>>i)&0x01;flag1=0;flag=0;if(bir==0x01) while(flag1<56); else while(flag1<18);}flag1=0;flag=1;while(flag1<10);flag=0;}//=============================//主函数//=============================void main(void){T0_init();//TR0=1;LED=0;while(1){if(!qian==1&&zuo!=0&&you!=0)//前进{TR0=1;while(!qian==1&&zuo!=0&&you!=0) {cend_data(0x08,0x20);delayms(100);} TR0=0;LED=0;}elseif(!hou==1&&zuo!=0&&you!=0)//后退{TR0=1;while(!hou==1&&zuo!=0&&you!=0) {cend_data(0x08,0x30);delayms(100);} TR0=0;LED=0;}elseif(!zuo==1&&!qian==1)//前左转弯{TR0=1;while(!zuo==1&&!qian==1) {cend_data(0x08,0x40);delayms(100);}TR0=0;LED=0;}elseif(!you==1&&!qian==1)//前右转弯{TR0=1;while(!you==1&&!qian==1) {cend_data(0x08,0x50);delayms(100);} TR0=0;LED=0;}elseif(!zuo==1&&!hou==1)//后左转弯{TR0=1;while(!zuo==1&&!hou==1) {cend_data(0x08,0x60);delayms(100);} TR0=0;LED=0;}elseif(!you==1&&!hou==1)//后右转弯{TR0=1;while(!you==1&&!hou==1) {cend_data(0x08,0x70);delayms(100);} TR0=0;LED=0;}else //停止{TR0=1;cend_data(0x08,0x80);delayms(50);TR0=0;LED=0;}}}。
红外遥控器接收_LCD_DS18B20结合程序

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};sbit IRIN = P3^2; //红外接收器数据线sbit BEEP = P1^0; //蜂鸣器控制线sbit DQ=P2^4;sbit LCD_RS = P2^5;sbit LCD_RW = P2^6;sbit LCD_EN = P2^7;uchar IRCOM[7];uint temp;uchar temp1;uchar num[4];uchar aa;uint a,bb=0;uchar code cdis1[ ] = {"Present:"};uchar code cdis2[ ] = {"High: Low:"};void delay(uchar x); //x*0.14MSvoid delay1(int ms);void beep(void);void delay2(uint x)//延时函数{uchar i;while (x--)for(i=0;i<120;i++);}void delay3 (uint a)//小延时函数{while (a--);}/*******************************************************************//* *//*检查LCD忙状态*//*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*//* *//*******************************************************************/bit lcd_busy(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN = 0;return(result);}/*******************************************************************//* *//*写指令数据到LCD *//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
红外遥控的发射和接收

红外遥控的发射和接收Donna 发表于2006-5-12 10:08:00光谱位于红色光之外,波长为0.76~1.5μm,比红色光的波长还长,这样的光被称为红外线。
红外遥控是利用红外线进行传递信息的一种控制系统,红外遥控具有抗干扰,电路简单,编码及解码容易,功耗小,成本低的优点,目前几乎所有的视频和音频设备都支持这种控制方式。
一、红外遥控系统结构红外遥控系统主要分为调制、发射和接收三部分,如图1 所示:红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。
交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。
注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。
一体化红外接收头引脚图如图3-14所示。
图1 红外遥控系统1.调制红外遥控发射数据时采用调制的方式,即把数据和一定频率的载波进行“与”操作,这样可以提高发射效率和降低电源功耗。
调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的455kHz晶振决定的。
在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9 kHz≈38kHz。
图2 载波波形1.发射系统目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。
由于发射系统一般用电池供电,这就要求芯片的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常一点误差可以忽略不计。
红外线通过红外发光二极管(LED)发射出去,红外发光二极管内部材料和普通发光二极管不同,在其两端施加一定电压时,它发出的是红外线而不是可见光。
- 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();
}。