红外遥控器软件解码原理及程序
红外遥控解码实验报告(3篇)
第1篇一、实验目的本次实验旨在通过搭建红外遥控系统,了解红外遥控的基本原理,掌握红外遥控信号的编码和解码方法,并利用单片机实现对红外遥控信号的解码,实现对红外遥控器的控制。
二、实验原理红外遥控技术是一种无线通信技术,通过发射端发送特定编码的红外信号,接收端接收该信号并进行解码,从而实现对电器的控制。
红外遥控系统主要由发射端和接收端两部分组成。
1. 发射端:由按键矩阵、编码调制电路和红外发射器组成。
按键矩阵根据按键的不同产生不同的编码信号,编码调制电路将这些信号调制在38kHz的载波上,红外发射器将调制后的信号发射出去。
2. 接收端:由红外接收器、前置放大电路、解调电路和指令信号检出电路组成。
红外接收器接收发射端发射的红外信号,前置放大电路对信号进行放大,解调电路将38kHz的载波信号去除,指令信号检出电路从解调后的信号中提取出指令信号。
三、实验设备1. 红外遥控发射器2. 红外接收模块3. 单片机开发板4. 连接线5. 电源6. 红外遥控解码程序四、实验步骤1. 搭建红外遥控系统:将红外接收模块连接到单片机开发板的相应引脚上,确保连接正确无误。
2. 编写红外遥控解码程序:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
3. 程序烧录与调试:将解码程序烧录到单片机中,连接电源,进行程序调试。
4. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
五、实验结果与分析1. 红外遥控系统搭建成功:通过连接红外接收模块和单片机开发板,成功搭建了红外遥控系统。
2. 解码程序编写与调试:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
在调试过程中,通过观察单片机的输出,验证了程序的正确性。
3. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
实验结果表明,单片机能够成功解码红外信号,并实现红外遥控器的控制功能。
红外遥控原理及解码程序
红外遥控系统原理及单片机红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
1红外遥控系统通用红外遥控系统由发射和接收两大部分组成。
应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
图1红外线遥控系统框图2遥控发射器及其编码遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC 的UPD6121G组成发射电路为例说明编码原理(一般家庭用的DVD VCD 音响都使用这种编码方式)。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的0” 以脉宽为0.565ms 、间隔1.685ms 、周期为2.25ms 的组合表示二进制的1 ”,其波形如图2所示。
图2遥控码的0”和1 ” (注:所有波形为接收端的与发射相反)上述0”和1 ”组成的32位二进制码经38kHz 的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极 管产生红外线向空间发射,如图3示。
图3遥控信号编码波形图UPD6121G 产生的遥控编 码是连续 的32位二进制 码组,其中前16 位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干 扰。
该芯片的用户识别码固定为十六进制01H ;后16位为8位操作码(功 能码)及 其反 码。
UPD6121G 最多额128种不同组 合的编码。
基于功能码的红外遥控软件解码技术
的软 件 解 码 技 术 , 在 编 程 时 采 用 中 断 技 术 , 并 占用 较 少 的 系统 资 源 且 系 统 的响 应 速 度 得 到 提 高 。
1 系统设 计
1 1 红 外 摇 控 发 射 电 路设 计 。
本 系 统 中使 用 S 6 2 作 为 遥 控 发 射 器 C 12
1 2 红 外 遥 控 接 收 电路 设 计 .
红 外 遥 控 接 收 器 的 实 现 方 法 很 多 , 本 系 统 中 , 外 在 红 接 收 头 采 用 价 格 便 宜 、 能 可 靠 的 一 体 化 的 红 外 接 收 头 性 HS 0 8 0 3 。它 接 收 红 外 信 号 频 率 为 3 Hz 周 期 约 为 2 8k , 6
l
() i“ ” b bt l的波形
就是遥控器发射码的时间值 。
(1 i 0的波形 a bt ’ …
() C 引导码的波形
() d 连发码的波形
图 3 遥 控 码 的 特 征 波 形
2 2 确 定 需解 析 的码 .
在参考文献[~3中 , 1 ] 对所 有 的码 都 进 行 捕 获 、 储 、 存
目前 使 用 最 广 泛 的一 种 通 信 和 遥 摔 手 段 。一 般 的 软 件 解
码 技 术 在 接 收 信 号 时 采 用 了查 询 方 式 ] 在 处 理 信 号 时 , ,
对 接 收 到 的所 有 码 信 息 进 行 处 理 一 , 占用 、 费 系统 的 资 浪 源较 严 重 , 容 易 得 到 错 误 信 息 。 因 此 , 文 通 过 对 红 外 且 本
体积小 、 便于安装等特点 , 具有一定市场价值。 ●
参 考 文 献
[ ]Mi o h eh oo yIc 1 c ci T cn lg n.Mo b s 议 中文 版 ,0 6 r p du 协 20. [ ]Mi o h eh oo yIc I 1F 76 aah e,0 8 2 c ci T cn lg n.PC 8 6J0dts et2 0 . r p
红外遥控器软件解码及其应用
红外遥控器软件解码及其应用随着现代科技的不断发展,红外遥控器已经成为人们日常生活中的必备工具之一。
不过,很多人并不了解红外遥控器的工作原理以及它是如何通过软件解码来实现遥控效果的。
本文将详细介绍红外遥控器软件解码的相关知识,以及其在实际应用中的作用。
一、红外遥控器的工作原理首先,我们需要了解红外遥控器的工作原理。
简单来说,红外遥控器是一种利用红外线光谱来传输指令的设备,通过在发射端发送编码的红外信号,再在接收端解码后执行相应的指令。
通常,红外遥控器由发射部分与接收部分两个部分组成。
发射部分由红外LED发射器构成,它会通过红外发射现象来发送编码的红外信号。
在接收端,红外接收器则会接收到这些信号,并将其转换成电信号进行解码。
之后,解码器会解析出信号的编码含义,然后执行相应的指令。
这就是红外遥控器的基本工作原理。
二、红外遥控器软件解码的实现在红外遥控器的工作中,软件解码起到了重要的作用。
所谓软件解码,就是在终端设备中运行的一种程序,能够将遥控器发射的红外编码转换成可读的指令。
而这些指令就可以用于控制各种家电、设备等。
软件解码的实现主要有两种方式。
第一种是使用硬件解码器,这需要在终端设备上安装一个专门的硬件解码器,用于解析红外信号,并输出相应的指令。
第二种方法则是使用软件解码器,这需要在终端设备上安装一个软件程序,用于解析红外信号并输出指令。
在软件解码的实现中,最常见的是使用赛贝尔红外编解码库。
这个库已经成为了广泛使用的一种红外编解码方案。
它可以用于各种嵌入式设备、物联网设备、手机、电视机顶盒等多种应用场景中。
三、红外遥控器软件解码的应用目前,红外遥控器软件解码已广泛应用于各种智能家居、物联网设备、工控设备等领域。
下面列举一些具体的应用案例:1、智能家居:通过使用红外遥控器软件解码,可以实现对家中的各种电器、设备的遥控控制。
如电视、空调、照明设备等。
2、物联网设备:红外遥控器软件解码还可以用于物联网设备中,如智能家居中的智能门锁、智能家电等。
红外遥控器程序及原理、程序
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 位。数据反码是数据 码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电 路中被设置成第一段用户码的反码。
红外遥控软件编解码简析
红外遥控软件编解码简析摘要:介绍如何用SONIX单片机实现红外编解码,并讨论SONIX系列芯片在实现红外遥控中的优势所在。
文中给出红外发射和接收硬件原理图,并给出相应程序。
关键词:Buzzer输出,外部电平变化中断引言:红外线遥控是目前应用最广泛的一种通信和遥控手段。
由于红外线遥控器具有体积小、功耗低、功能强、成本低等特点。
因此在家电产品中有着广泛的应用。
相比与专用的控制芯片,微控制器具有开发灵活的特点,用户可以随意制定编解码格式。
SONIX 8bit MCU中的1、1K的ROM,48bit的RAM完全可以用来开发普通的红外遥控产品,4K的ROM,128bit的RAM可用做高端复杂的红外遥控产品。
2、Buzzer输出功能可以方便的实现38K载波,1/2个计时计数器,上升下降沿可选的外部中断便于灵活接收和解码。
3、5V/4MHz条件下,正常工作电流2~3mA,睡眠电流小于1uA,便于电池供电系统。
一、红外编码格式说明用户采用红外模块时,编码格式非常灵活。
目前市场上的红外编码格式非常多,每家公司都可以自己定义一种编解码格式。
下面以一种比较常用的格式来做分析说明(示意图中高电平代表38K载波输出):上面的波形格式包括前导码(Load Code)、身份码和身份反码(ID Code)、数据码和数据反码(Data Code)。
导航码(Load Code):导航码用来通知接受器其后为遥控数据,解码部分在接受到这个信号后就可以开始解码。
系统码(ID Code):系统码用来区分是哪一机型的数据,接收端依此来判断后续的数据是否为须执行的指令。
数据码(Data code):数据码用来区分是哪一个键被按下,接收端根据数据码做出应该执行什么动作的判断。
数据帧间的空闲时间:有用信号中两帧数据间的空闲时间。
红外遥控数据传输系统中的关键是数据传输的可靠性。
因此有些公司也会在系统码和数据码后面分别再传送一个同样的码或反码,供误码校验用。
红外解码程序
红外解码程序本篇介绍红外解码的原理和程序的写法。
下面来看一下,红外线是如何编码的。
下面来具体说一下,解码的原理,每按一下遥控器的一个按键,遥控器就会发出32个“0”“1”代码(当然是通过高低电平的占空比来判断是0还是1的),具体是0,1是如何编码的上面图片中有介绍,和一个引导码,引导码的作用是告诉处理器,接下来将要开始发送代码,我们在编写程序时,当检测到引导码时,就应该准备接受数据了。
32位代码中的前16位是用户识别码,不同的遥控器不相同,防止互相干扰的,后16是8为数据码,和8位数据反码。
接下来开始介绍如何解码程序的编写。
程序中用到了两个中断,一个是定时器中断,一个是外部中断。
定时器中断用来准确计时,判断接受的代码是0还是1,外部中断用来准确确定定电平到来的时刻,然后开始计时。
/*********************************************************函数功能:红外解码,用八位数码管显示红外线的按键码,便于红外控制测试环境:hot 51学习板编译环境:keil4整理人:张家越QQ:435835181整理时间:2011-04-03************************************************************/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code seg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0 x6f,0x77,0x7c,0x39,0x5E,0x79,0x71 };//0-f的段选码unsigned char code seg_we[]={0,1,2,3,4,5,6,7};uchar irtime,startflag,bitnum,irreceok;uchar irdata[33];uchar irprosok;uchar display[8];uchar ircode[8] ;sbit led1=P0^1;sbit led2=P0^2;/******************************************************************** ****函数功能:延时函数,在数码管显示时使用,不需要很精确********************************************************************* ****/void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}/******************************************************************** ******函数的功能:定时器0的初始化********************************************************************* *****/void timer0init(){TMOD=0x02; //设置定时器工作在方式2TH0=0x00; //TL0=0x00; //设置定时器的初值ET0=1; //开定时器中断TR0=1; // 打开定时器EA=1; //开总中断}/******************************************************************** ****外部中断1的初始化********************************************************************* **/void int1init(){IT1=1; //设置触发方式为上升沿EX1=1; //开外部中断1EA=1; //开总中断}/******************************************************************** **定时器0的功能函数,每中断一次irtime++,用于计时********************************************************************* **/void timer0() interrupt 1{irtime++; //定时器中断一次irtime++,用于计时}/******************************************************************** ***外部中断0的处理函数,每当有低电平数据过来时,中断一次,(使用次中断的前提是,信号线必需接在外部中断0上面,也就是P3^2口),函数功能是,把信号从高低电平变成时间的代码放入irdata【】中********************************************************************* ***/void int1() interrupt 2{if(startflag){if(irtime>32) //一组代码检测完毕{bitnum=0;}irdata[bitnum]=irtime; //把检测到的时间送到数组irdata【】中去irtime=0;bitnum++;if(bitnum==33) //如果检测到bitnum=33,说明32位用户码已经检测完毕{bitnum=0; //将bitnum清零以便重新计数irreceok=1; //接收完毕标志位置一}}else //(此函数先进入else语句,跳过引导码的检测){startflag=1; //将开始标志位置一irtime=0; //设置时间初值为零irreceok=1; //接收完毕标志位置一}}/******************************************************************** *****函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中********************************************************************* *****/void irpros(){uchar k=1,value,j,i;for(j=0;j<4;j++){for(i=0;i<8;i++){value=value>>1; //右移7次(第一次是00,相当于没有移位)if(irdata[k]>6) //循环8次{value=value|0x80;}k++;}ircode[j]=value;}irprosok=1;}/******************************************************************** ********函数的功能是:将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示******************************************************************* ********/void irwork(){display[0]=ircode[0]/16;display[1]=ircode[0]%16;display[2]=ircode[1]/16;display[3]=ircode[1]%16;display[4]=ircode[2]/16;display[5]=ircode[2]%16;display[6]=ircode[3]/16;display[7]=ircode[3]%16;}/******************************************************************** ****函数功能:用数码管显示解码结果********************************************************************* ***/void display1(){uchar i;for(i=0;i<8;i++){P2=seg_we[i];P0=seg_du[display[i]];delay_50us(40);}}void main(){timer0init(); //定时器初始化int1init(); //外部中断初始化while(1){if(irreceok) //判断数据接收完毕(数组中存储的是高低电平的时间){irpros(); //执行处理函数,将高低电平时间转化成16进制的0,1代码,存放在数组中irreceok=0; //标志清零}if(irprosok) //处理函数执行完毕,{irwork(); //将存储的16进制代码分离,便于数码管显示irprosok=0; //标志清零}display1();}}//在最后我再分析一下程序的编写思路,便于大家理解,一旦有按键按下,接受管接收到引导码,进入外部中断,并将高低电平的时间放入irdata【】数组中,接受完毕标志位置一,判断接受标志位,为1,进行处理函数,将高低电平转换成16进制数,处理标志位置一,判断处理标志位,为1,执行分离函数,将16进制数分离,便于数码管显示,分离完毕后显示。
红外解码说明文档
红外解码说明文档作者:ruihuan_vb@时间:2013-12-71、红外遥控的基本原理红外遥控器发出的红外光信号,所以只能产生1 0 信号。
但是,为防止自然光的干扰,同时为了增大红外管的发射功率,正真发出的“1”信号是:38K的载波信号。
(而0 1 信号的区分就在于对发射管的关闭时间)。
红外一体化接收头接收到信号后会对信号进行滤波,所以一体化接收头输出的信号是经过滤波放大后的电平信号,并且对对电平信号进行了反相输出。
2、一般电平编码的结构红外遥控的数据编码是多种多样的,但是一般都会一这这种情况出现:引导码加数据。
引导码由9ms(可能有时候要设置到9.1ms)的低电平和4.5ms的高电平构成。
“0”信号由0.6ms的低电平和0.6ms的高电平组成;“1”信号由0.6的低低电平和1.2ms的高电平组成。
(注:这里说的电平是说的是红外一体化接收头的输出电平)。
红外一体化接收头的输出波形,示波器保存的图片3、红外遥控的电路设计1)发射电路红外遥控的发射电路比较简单,但是要想做的比较好还是有要注意的地方的。
NPN 三极管直接拉红外发射头就可以构成一个红外发射电路了。
但是,要注意的是:驱动红外发射管要加隔离电阻,并且这个隔离电阻不能太大,因这个隔离电阻决定了红外发射的功率。
发射电路的关键就在这里了,这个发射管的隔离电阻的阻值不要超过10欧姆,否则发射距离会非常近的,并且还有注意发射信号的载波的占空比不要设为1/2 最好是1/3 (这个好像是跟一体化接收头的原理有关的,而且将占空白降低方便增大发射功率)。
2)红外接收电路红外接收电路比较简单,一般用一个一体化接收头接到单片机的引脚就可以了。
我们这用过的型号是:HS0038B。
4、如何利用单片机的外设来实现对应的功能红外解码功能:因为红外解码的第一步骤是对电平长度的检测,因而最好是利用单片机的捕获功能来检测电平的长度,然后再根据电平长度来判断其意义(建议:不要检测双边沿,最好是检测一个周期的电平,例如下降沿的时间间隔)。
红外遥控器原理
遥控器使用方便,功能多.目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。
如果能将遥控器上许多的按键解码出来.用作单片机系统的输入.则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。
而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用。
一、编码格式1、0和1的编码遥控器发射的信号由一串O和1的二进制代码组成.不同的芯片对0和1的编码有所不同。
通常有曼彻斯特编码和脉冲宽度编码。
TC9012的O和1采用PWM方法编码,即脉冲宽度调制,其O码和1码如图1所示(以遥控接收输出的波形为例)。
O码由O.56ms低电平和0.56 ms高电平组合而成.脉冲宽度为1.12ms。
1码由0.56ms低电平和1.69ms高电平组合而成.脉冲宽度为2.25ms。
在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。
2、按键的编码当我们按下遥控器的按键时,遥控器将发出如图2的一串二进制代码,我们称它为一帧数据。
根据各部分的功能。
可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。
遥控器发射代码时.均是低位在前,高位在后。
由图2分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。
当接收到此码时.表示一帧数据的开始。
单片机可以准备接收下面的数据。
地址码由8位二进制组成,共256种.图中地址码重发了一次。
主要是加强遥控器的可靠性.如果两次地址码不相同.则说明本帧数据有错.应丢弃。
不同的设备可以拥有不同的地址码.因此。
同种编码的遥控器只要设置地址码不同,也不会相互干扰。
图中的地址码为十六进制的0EH(注意低位在前)。
在同一个遥控器中.所有按键发出的地址码都是相同的。
数据码为8位,可编码256种状态,代表实际所按下的键。
数据反码是数据码的各位求反,通过比较数据码与数据反码.可判断接收到的数据是否正确。
如果数据码与数据反码之间的关系不满足相反的关系.则本次遥控接收有误.数据应丢弃。
红外遥控器软件解码原理和程序
void rs232(void) interrupt 4{ static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2 用来接收 发送临时用,rsbuf1,rsbuf2 用来分别用来存放接收发送的半字节 EA=0; //禁止中断 if(RI){ RI=0; //清除接收中断标志位 sbuf1=SBUF; //将接收缓冲的字符复制到 sbuf1 if(sbuf1==HEAD){ //判断是否帧开头 state1=10; //是则把 state 赋值为 10 buf1=RECEIVE; //初始化接收地 址 } else{
void tf_2(void); void read_ir(void); void ir_jiema(void); void ir_init(void); void ir_exit(void); void store_ir(void); void read_key(void); void reset_iic(void); unsigned char read_byte_ack_iic(void); unsigned char read_byte_nack_iic(void); bit write_byte_iic(unsigned char a); void send_ack_iic(void); void send_nack_ic(void); bit receive_ack_iic(void); void start_iic(void); void stop_iic(void); void write_key_data(unsigned char a); unsigned int read_key_data(unsigned char a); void ie0(void) interrupt 0{ie_0();} void tf0(void) interrupt 1{tf_0();} void ie1(void) interrupt 2{ie_1();} void tf1(void) interrupt 3{tf_1();tf_2();} void tf2(void) interrupt 5{ //采用中断方式跟查询方式相结合的办法解 码 EA=0; //禁止中断 if(TF2){ //判断是否是溢出还是电平变化产生的中断 TF2=0; //如果是溢出产生的中断则清除溢出位,重 新开放中断退出 EA=1; goto end; } EXF2=0; //清除电平变化产生的中断位 *ir=RCAP2H; //把捕捉的数保存起来 ir++; *ir=RCAP2L; *ir++; F0=1; TR0=1; //开启计数器 0 loop: TL0=0; //将计数器 0 重新置为零 TH0=0; while(!EXF2){ //查询等待 EXF2 变为 1 if(TF0)goto exit; //检查有没超时,如果超时则退出 };
红外遥控器解码程序
//===================================================================== //// 红外遥控器解码程序演示//// 本程序主要将现在比较常用TX1300遥控器进行解码,将解码后的数据通过P2端////口的数码管显示出来,为了更好的看到运行过程,特加了三个指示灯用来指示当////前运行状态.P10主要用来闪亮,表示程序正在运行,P11则用来表示接收到数据, ////P12表示触发内部的定时器操作.P13的闪亮表示正确接收完一个数据. //// 程序运行效果: 打开本机电源开关,可以看到P10不停的闪动,按下遥控器的数////字键,数码管则显示相应的数字键(1-9).可以看到P11,P12在显示后呈亮状态.则////可以接收下一个数据,在上面过程中可以看到P13闪亮了一下.表明上次正确接收////到数据. ////---------------------------------------------------------------------//// 开发日期: 2009/01/30 研发单位:上海腾芯实业有限公司//#include <reg52.h> //包含51单片机相关的头文件#define uint unsigned int //重定义无符号整数类型#define uchar unsigned char //重定义无符号字符类型uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定义数码管显示数据0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9uchar code RecvData[]={0x07,0x0A,0x1B,0x1F,0x0C,0x0D,0x0E,0x00,0x0F,0x19};uchar IRCOM[7];static unsigned int LedFlash; //定义闪动频率计数变量unsigned char RunFlag=0; //定义运行标志位bit EnableLight=0; //定义指示灯使能位/***********完成基本数据变量定义**************/sbit S1State=P1^0; //定义S1状态标志位sbit S2State=P1^1; //定义S2状态标志位sbit B1State=P1^2; //定义B1状态标志位sbit IRState=P1^3; //定义IR状态标志位sbit RunStopState=P1^4; //定义运行停止标志位sbit FontIRState=P1^5; //定义FontIR状态标志位sbit LeftIRState=P1^6; //定义LeftIR状态标志位sbit RightIRState=P1^7; //定义RightIRState状态标志位/*************完成状态指示灯定义*************/sbit S1=P3^2; //定义S1按键端口sbit S2=P3^4; //定义S2按键端口/*************完成按键端口的定义*************/sbit LeftLed=P2^0; //定义前方左侧指示灯端口sbit RightLed=P0^7; //定义前方右侧指示灯端口/*************完成前方指示灯端口定义*********/sbit LeftIR=P3^5; //定义前方左侧红外探头sbit RightIR=P3^6; //定义前主右侧红外探头sbit FontIR=P3^7; //定义正前方红外探头/*************完成红外探头端口定义***********/sbit M1A=P0^0; //定义电机1正向端口sbit M1B=P0^1; //定义电机1反向端口sbit M2A=P0^2; //定义电机2正向端口sbit M2B=P0^3; //定义电机2反向端口/*************完成电机端口定义***************/sbit B1=P0^4; //定义话筒传感器端口sbit RL1=P0^5; //定义光敏电阻端口sbit SB1=P0^6; //定义蜂鸣端口/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/sbit IRIN=P3^3; //定义红外接收端口/*********完成红外接收端口的定义*************/#define ShowPort P2 //定义数码管显示端口extern void ControlCar(uchar CarType); //声明小车控制子程序void delayms(unsigned char x) //0.14mS延时程序{unsigned char i; //定义临时变量while(x--) //延时时间循环{for (i = 0; i<13; i++) {} //14mS延时}}void Delay() //定义延时子程序{ uint DelayTime=30000; //定义延时时间变量while(DelayTime--); //开始进行延时循环return; //子程序返回}void IR_IN() interrupt 2 using 0 //定义INT2外部中断函数{unsigned char j,k,N=0; //定义临时接收变量EX1 = 0; //关闭外部中断,防止再有信号到达delayms(15); //延时时间,进行红外消抖if (IRIN==1) //判断红外信号是否消失{EX1 =1; //外部中断开return; //返回}while (!IRIN) //等IR变为高电平,跳过9ms 的前导低电平信号。
红外遥控器软件解码及其应用
红外遥控器软件解码及其应用摘要:通过对红外遥控器各按键发送冲波形分析可以识别码型,从而为软件解码提供依据。
本文以实例介绍红外遥控器与单片机硬件接口,并从原理出发给出软件解码方法。
这是一个可以直接引用成功例子,同时也为各类红外遥控器在单片机控制产品中开发应用提供了一个非常实用参考。
关键词:遥控器软件解码单片机在单片机控制产品开发应用中,为了向控制系统软件控制命令,键盘往往是不可缺少。
传统方法是利用并行输入/输出接口芯片扩展一个键盘接口,或者直接利用单片机并行端口进行扩展。
在某些应用环境下,这种方式2个弊端:①键盘和控制系统连在一起,不灵活,环境适应性差;②浪费单片机端口,且硬件成本较高。
使用红外遥控器作为控制系统输入设备,具有成本低、灵活方便特点。
本文目就在于介绍软件解码研究一般方法和红外遥控器进行二次开发应用技术。
该方法已在多个应用系统设计中成功地实现,效果良好。
红外遥控器是一种非常容易买到,且价格便宜产品,种类很多,但它们都是配合某种特定电子产品(如各种电视机、VCD、空调器等),由专用CPU解码,作为一般单片机控制系统能直接使用。
使用现成遥控器作为控制系统输入,需要解决如下几个问题:如何接收红外遥控信号;如何识别红外遥控信号;解码软件设计。
其它问题都是非本质,例如遥控器面板功能键标注问题,可自行设计、重印即可。
1 红外遥控信号接收接收电路可以使用集成红外接收器成品。
接收器包括红外接收管和信号处理IC。
接收器对外只有3个引脚:Vcc、GND和1个脉冲信号输出PO。
与单片机接口非常方便,如图1所示。
①Vcc接系统电源正极( 5V);②GND接系统地线(0V);提示请看下图:③脉冲信号输出接CPU中断输入引脚(例如803113脚INT1)。
采取这种连接方法,软件解既可工作于查询方式,也可工作于中断方式。
2 脉冲流分析要了解一个未知遥控器,首先要分析其脉冲流,从而了解其脉冲波形特征(以何种方式携带“0”、“1”信息),进而了解其编码规律。
红外线遥控解码原理
红外线遥控解码原理一、引言红外线遥控解码是一种常见的电子技术应用,广泛用于电视、空调、音响等家电产品中。
通过红外线遥控解码技术,可以实现遥控器与设备之间的无线通信,方便人们对设备进行远程操控。
本文将介绍红外线遥控解码的原理和实现方式。
二、红外线遥控解码原理红外线遥控解码的原理是利用红外线信号的特点进行解码。
遥控器通过按键操作产生一系列的红外信号,这些信号被红外发射器发射出去,然后被接收器接收并解码。
下面将详细介绍红外线遥控解码的原理。
1. 红外线信号的特点红外线是一种电磁波,波长在0.75微米到1000微米之间。
在这个波长范围内,红外线具有较好的穿透性,能够穿透一些物体,比如空气、玻璃等。
同时,红外线的波长也决定了它能够被人眼所感知。
2. 红外线遥控信号的编码方式红外线遥控信号一般采用脉冲宽度编码(Pulse Width Encoding)的方式进行编码。
即通过调节红外线信号的脉冲宽度来表示不同的信息。
通常会将一个编码周期分为若干个时间单位,每个时间单位内的脉冲宽度决定了信号的状态,比如高电平表示1,低电平表示0。
3. 红外线遥控信号的解码方式红外线遥控信号的解码一般分为两个步骤:解调和解码。
解调是指将接收到的红外线信号转换为电信号,解码是指将解调后的电信号转换为对应的按键信息。
解调通常采用红外线接收头来完成,红外线接收头是一种能够感知红外线信号并将其转换为电信号的传感器。
红外线接收头内部含有一个光电二极管,当红外线信号照射到光电二极管上时,会产生一个电压信号。
通过对这个电压信号进行放大和滤波处理,可以得到解调后的电信号。
解码是将解调后的电信号转换为对应的按键信息。
解码一般采用红外线遥控解码芯片来完成,这些芯片内部包含了一系列的逻辑电路和存储器,能够根据输入的电信号解码出对应的按键信息。
不同的遥控器厂商和设备类型会使用不同的解码协议,因此解码芯片需要根据具体的解码协议来进行解码。
三、红外线遥控解码的实现方式红外线遥控解码可以通过硬件电路和软件算法两种方式来实现。
红外遥控解码原理
感谢观看
汇报人:XX
红外遥控解码技 术能够提高智能 家居系统的稳定 性和可靠性
红外遥控解码技 术能够实现智能 家居系统的自动 化控制
红外遥控解码技 术能够提高智能 家居系统的安全 性和隐私保护
04
红外遥控解码的发展趋势
提高解码的准确性和稳定性
采用更先进的 算法和编码技 术,提高解码 的准确性和稳
定性
增加抗干扰能 力,降低外界 因素对解码的
影响
优化硬件设计, 提高接收器的 灵敏度和稳定
性
结合人工智能 技术,实现自 适应学习和优
化解码效果
实现多通道解码和多协议兼容
红外遥控解码技术不断发展,未来将实现多通道解码,提高解码效率和稳定性。 随着不同品牌和型号的红外遥控器不断涌现,多协议兼容将成为解码技术的重要发展方向。 解码芯片厂商将不断推出支持更多协议和通道的解码芯片,以满足市场需求。 未来红外遥控解码技术将更加智能化和人性化,为用户带来更加便捷的使用体验。
灯光:红外遥控解码技术也可以 用于控制灯光,如调节亮度、色 温等,实现智能照明。
在工业控制中的应用
实现远程控制:通过红外遥控解码技术, 工业控制中可以实现设备的远程启动、 停止、调节等功能,提高生产效率。
自动化监控:红外遥控解码技术可以用 于工业控制中的自动化监控,例如对温 度、湿度、压力等参数的实时监测和调 节。
无线通信:红外遥控解码技术可以实现工 业控制中的无线通信,避免了布线的繁琐 和成本,提高了系统的灵活性和可靠性。
安全性:红外遥控解码技术可以用于工 业控制中的安全保护,例如对设备的锁 定、解锁等操作,保证生产过程的安全 可控。
在智能家居系统中的应用
红外遥控解码技 术能够实现智能 家居系统的远程 控制
红外线遥控器(nec编码方式)
抗干扰优化
通过调整编码方式或增加滤波器等手段,增强遥控器的抗干扰能 力。
测试结果与结论
测试结果显示,该红外线遥控器 在有效范围内能够正常工作,按 键响应准确,抗干扰能力较强。
通过调试优化,进一步提高了遥 控器的性能和稳定性。
结论:该红外线遥控器符合预期 要求,可以用于实际应用中。
在NEC编码中,脉冲的宽度和间隔时间 被分为两种不同的比例,即1:2和1:1, 通过这两种比例的不同组合,可以表示 出0和1两种不同的二进制位。
当发送数据时,首先发送起始位,然 后是数据位,最后是停止位。起始位 是一个较长的脉冲和一个较短的间隔 时间,数据位由一系列的脉冲和间隔 时间组成,停止位是一个较短的脉冲 和一个较长的间隔时间。
红外线遥控器(NEC编码方式)
目 录
• 红外线遥控器简介 • NEC编码方式简介 • 红外线遥控器(NEC编码方式)的电路设计 • 红外线遥控器(NEC编码方式)的软件设计 • 红外线遥控器(NEC编码方式)的测试与调试
01 红外线遥控器简介
红外线遥控器的原理
红外线遥控器利用红外线作为信号传输介质,通过调制信号来控制设备的开关或功 能。
THANKS FOR WATCHING
感谢您的观看
01
采用NEC编码算法,将按键信息转换为红外线信号。
解码算法
02
将接收到的红外线信号解码为按键信息。
测试与调试
03
对编码和解码算法进行测试和调试,确保其正确性和稳定性。
05 红外线遥控器(NEC编码 方式)的测试与调试
测试方法
1 2
发射距离测试
测试遥控器在不同距离下的信号发射效果,确保 遥控器在有效范围内能够正常工作。
红外解码原理
红外解码原理
红外解码是一种通过解析红外信号来识别和转换成可读信息的技术。
红外信号是由红外发射器产生的,可以在不可见的红外光谱范围内传输数据。
解码器是一种特殊的电子设备,它可以将收到的红外信号转换成可读的信号,例如二进制代码或其他形式的控制指令。
红外解码的原理是基于红外传输的工作原理。
在红外传输中,发送端的红外发射器会产生一个具有特定编码的红外信号,然后通过空气或其他介质传输到接收端。
接收端的红外接收器会接收到红外信号,并将其转换成电信号。
接下来,解码器会对这些电信号进行解析,以获得原始数据。
解码器的工作原理是通过识别红外信号的特征来解析数据。
红外信号通常以脉冲的形式传输,即通过发送一系列的脉冲信号来表示不同的信息。
解码器会根据脉冲信号的频率、持续时间和间隔等特征来解析数据。
这些特征被称为红外编码协议,不同的设备和厂商可能使用不同的编码协议。
一旦解码器成功解析了红外信号,并将其转换成原始数据,就可以根据需要进行进一步的处理。
例如,将数据转换成可读的文本、控制指令或其他形式的操作。
此外,解码器还可以与其他设备或系统进行通信,以实现各种功能,例如遥控器控制电视或空调等。
总的来说,红外解码是一种将红外信号转换成可读信息的过程,其原理是通过解析红外信号的特征来识别和转换数据。
它在许
多应用中起着关键的作用,例如智能家居、安防系统和无线通信等。
详解红外遥控器编码解码原理!
详解红外遥控器编码解码原理!红外遥控器原理介绍红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
红外遥控系统:通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、 LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
红外的简单发射接收原理:在发射端,输入信号经放大后送入红外发射管发射,在接收端,接收管收到红外信号后,由放大器放大处理后还原成信号,这就是红外的简单发射接收原理。
1、红外遥控系统结构红外遥控系统的主要部分为调制、发射和接收,如图1所示:打开今日头条,查看更多精彩图片红外遥控是以调制的方式发射数据,就是把数据和一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源功耗。
调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的455kHz晶振决定的。
在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。
目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。
由于发射系统一般用电池供电,这就要求芯片的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常一点误差可以忽略不计。
红外线通过红外发光二极管(LED)发射出去,红外发光二极管(红外发射管)内部构造与普通的发光二极管基本相同,材料和普通发光二极管不同,在红外发射管两端施加一定电压时,它发出的是红外线而不是可见光。
单片机的红外遥控器解码原理与实现
单片机的红外遥控器解码原理与实现红外遥控器是我们日常生活中常见的电子设备,它通过使用红外线信号与接收器进行通信。
而在这个过程中,单片机起到了解码的重要作用。
本文将介绍单片机解码红外遥控器的原理以及实现方法。
一、红外遥控器的工作原理红外遥控器是一种使用红外线进行通信的设备,它主要由发送器和接收器两部分组成。
发送器将指令数据转换为红外脉冲信号并发送出去,接收器通过接收红外线信号并将其转换为电信号,进而解码为可识别的指令。
而单片机则负责接收并解码红外信号,将其转化为具体的操作。
二、单片机解码红外信号的原理单片机解码红外信号主要分为两个步骤:红外信号的接收和信号的解码处理。
1. 红外信号的接收单片机通过外部的红外接收器接收红外信号。
红外接收器可以通过外部电路将接收到的红外信号转换为电压信号,然后通过单片机的IO 口输入。
2. 信号的解码处理接收到的红外信号经过IO口输入后,单片机需要对信号进行解码处理。
解码的过程涉及到红外信号的标准化和解析。
对于常见的红外遥控器协议,单片机需要能够识别其编码方式,确定其协议格式。
这些协议通常包含了引导码、地址码和指令码等信息。
在解析红外信号时,单片机首先需要识别引导码。
引导码是红外信号的起始标志,通常由高、低电平组成,表示编码的开始。
单片机通过判断引导码的时间长度来确定信号的开始。
接下来,单片机需要识别地址码和指令码。
地址码是用来区分不同的红外遥控器设备,指令码则表示具体的操作指令。
单片机通过判断地址码和指令码的高、低电平时间长度来确定具体的操作。
三、单片机解码红外信号的实现方法单片机解码红外信号有多种实现方法,以下是一种简单的实现示例。
首先,需要连接红外接收器到单片机的IO口,将接收到的信号输入到单片机。
接收到的信号可以通过外部中断的方式触发单片机的中断服务程序。
然后,在中断服务程序中,单片机需要根据红外协议的规则,判断引导码、地址码和指令码的时间长度。
利用计时器或延时函数可以实现对信号时间的测量。
红外遥控器软件解码及其应用汇编语言程序
《红外遥控器软件解码及其应用》汇编语言程序——网络补充版;===========================================;遥控器软件解码子程序,入口标号:TKEY;影响4BH、4CH单元;4BH为循环计数器。
;位地址00H为读键标志:“1”为成功,“0”为读;键无效, 若成功, 键值在4C单元中。
;位地址04H为键值类型标志:;“1” 实际值,“0” 映射值。
;以下2个参数是红外遥控信号的软件解;码参数,视CPU时钟频率而定,若晶振为6M,则;===========================================#HW EQU #08H ;引导脉冲特征宽度#PW EQU #02H ;信号脉冲特征宽度#ZGZQ EQU #90H;主工作区高位地址;TKE2: LJMP TKE;接力跳转;TKEY: PUSH A ;子程序入口PUSH PSWPUSH DPHPUSH DPLPUSH 00HPUSH 01HMOV TMOD,#01HMOV PSW, #00HMOV P2, #ZGZQMOV R0, #70HMOV R1, #21H ;有效脉冲只有33个CLR 00HTK3: MOV TH0,#0MOV TL0,#0AH;测低电平宽度SETB TR0TK4: JB TF0, TKE2;超时无效转结束JNB P3.3, TK4CLR TR0MOV A, TH0MOVX @R0, AINC R0MOV A, TL0MOVX @R0, AINC R0MOV TH0, #00HMOV TL0, #0AH;测高电平宽度SETB TR0TK5: JB TF0, TKE2;超时无效转结束JB P3.3, TK5CLR TR0MOV A, TH0MOVX @R0, AINC R0MOV A, TL0MOVX @R0, AINC R0DJNZ R1, TK3;循环;分析脉冲流;脉冲波形数据存放在70H开始的连续84H个单元内, ;每个脉冲由一个低电平脉宽和高电平脉宽组成;每个脉宽数据占两个字节,前一个字节为高8位;后一个字节为低8位;;判引导脉冲是否有效MOV R0, #70HMOVX A, @R0CLR CSUBB A, #HWJC TKE ;低电平引导脉冲无效转结束INC R0INC R0MOVX A, @R0SUBB A, #HWJC TKE ;高电平引导脉冲无效转结束;分析键码;键码值在片内4CH单元 !;判9012遥控芯片特征码是否有效,;特征码是连续两个字节的0EH;首先译码第1个特征码,并判断是否为“0EH”MOV 4BH, #8MOV 4CH, #0INC R0INC R0TK6: INC R0INC R0MOVX A, @R0CLR CSUBB A, #PWMOV A, 4CHRRC AMOV 4CH, AINC R0INC R0DJNZ 4BH, TK6 ;循环MOV A, 4CHCPL ACJNE A, #0EH, TK7MOV A, R0 ;是9012芯片的特征码ADD A, #20H;跳过后一个特征码的MOV R0, A ;判断,去译码键值-----LJMP TK9 ;--转TK9;第1个特征码无效;再译码第2个特征码,并判断是否为“0EH”TK7: MOV 4BH, #8MOV 4CH, #0TK8: INC R0INC R0MOVX A, @R0CLR CSUBB A, #PWMOV A, 4CHRRC AMOV 4CH, AINC R0INC R0DJNZ 4BH, TK8MOV A, 4CHCPL ACJNE A, #0EH, TKE;无效退出;; 特征码有效,进行键值译码TK9: MOV 4BH, #8MOV 4CH, #0TK10: INC R0INC R0MOVX A, @R0CLR CSUBB A, #PWMOV A, 4CHRRC AMOV 4CH, AINC R0INC R0DJNZ 4BH, TK10MOV A, 4CH;CPL A ;得键码JB 04H, TKE1MOV DPTR, #TAB ;键码到键值MOVC A, @A+DPTR;的查表映射TKE1: MOV 4CH, A;或4CH中SETB 00H ;置读键有效标志TKE: POP 01HPOP 00HPOP DPL ;返回POP DPHPOP PSWPOP AMOV P2, #0FFHRET;以下是针对某一具体应用的“重定义按键”映射表TAB: DB 01H,02H,03H,04H,05H,06H,07H,08HDB 09H,00H,20H,20H,20H,20H,20H,20HDB 0EH,11H,14H,13H,0AH,0BH,0FH,20HDB 0CH,0DH,15H,20H,10H,12H,0FH,20HDB 20H,20H,20H,20H,20H,20H,20H,20H;以上是软件译码的子程序。
红外遥控的工作原理
红外遥控的工作原理
红外遥控是一种利用红外线信号进行无线遥控操作的技术。
其工作原理主要包括三个步骤:编码、传输和解码。
编码:红外遥控的发射器将需要操作的指令编码成红外线信号。
编码通常使用脉冲编码调制(PCM)或脉宽编码调制(PWM)技术。
在编码过程中,将指令信息转换成数字信号,通过特定的编码技术将这些数字信号转换成红外脉冲信号,以便发送给红外遥控器。
传输:编码完成后,红外遥控器的发射器将编码好的红外信号以无线方式传输出去。
通过红外发射器内的红外二极管,将编码好的信号转换为红外光脉冲信号,并以特定频率进行传输。
这些红外信号通常在红外线的频率范围内,具体频率可以根据具体应用进行设定。
解码:收到红外信号的接收器会将所接收到的红外光脉冲信号转化为电信号,并通过解码器进行解码。
解码器会将红外光脉冲信号转换为数字信号,并将其与预先存储的密钥或指令进行比较,以确定接收到的信号是否有效。
如果信号有效,解码器将执行相应的操作,例如开启或关闭设备,调节音量等。
红外遥控器的工作原理可以简单总结为:发射器将指令编码成红外信号,然后通过无线传输到接收器,接收器再将信号解码,最后执行相应的操作。
这种红外遥控技术在家电、汽车、电子产品等领域得到广泛应用,为用户提供了便捷的远程控制体验。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
end:
;
}
void rs232(void) interrupt 4{
static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2用来接收发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节
void sub(void);
void delay(void);
void ie_0(void);
void tf_0(void);
void ie_1(void);
void tf_1(void);
void tf_2(void);
void read_ir(void);
void ir_jiema(void);
// unsigned int xdata *p4; //地址指针
//}q; //
union{
unsigned char a[2];
unsigned int b;
}count;
union{
unsigned char a[2];
unsigned int b;
}temp;
union{
unsigned char data *ir;
union{
unsigned char a[2];
unsigned int b;
unsigned char data *p1[2];
unsigned int data *p2[2];
unsigned char xdata *p3; //红外缓冲的指针
#define READ_KEY 0x0d//读取键值
#define RECEIVE 0Xf400//接收缓冲开始地址
#define SEND 0xfa00//发送缓冲开始地址
#define IR 0x50//红外接收缓冲开始地址
#define HEAD 0xaa//数据帧头
#define TAIL 0x55//数据帧尾
TF2=0; //如果是溢出产生的中断则清除溢出位,重新开放中断退出
EA=1;
goto end;
}
EXF2=0; //清除电平变化产生的中断位
*ir=RCAP2H; //把捕捉的数保存起来
ir++;
*ir=RCAP2L;
*ir++;
F0=1;
TR0=1; //开启计数器0
loop:
红外遥控器软件解码原理及程序
红外一开始发送一段13。5ms的引导码,引导码由9ms的高电平和4。5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2。25ms的低电平,跟着是一个短脉冲,本程序经过试用,能解大部分遥控器的编码!
rsbuf1|=sbuf1; //高低半字节合并
*buf1++=rsbuf1; //将接收的数据保存至接收缓冲里,并且数据指针加一
buf1_length++; //接收数据长度加一
state1=10; //将state1置为10,准备接收下个字节的高半字节
}
break;
}
}
}
state1=20; //将状态标志置为20,准备接收低半字节
}
break;
case 20:sbuf2=sbuf1>>4; //把高半字节右移到的半字节
sbuf2=~sbuf2; //将低半字节取反
if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确
{ //接受错误
unsigned int data *p2[4];
unsigned char xdata *p3[2];
unsigned int xdata *p4[2];
}i;
unsigned char ir_key;
bit ir_flag; //红外接收标志,0为缓冲区空,1为接收成功,2为缓冲溢出
if(sbuf1==TAIL) //判断是否接收到数据帧尾
{ //是接收到数据帧尾
buf1=RECEIVE; //初始化接收的地址
if(*buf1==RESET) //判断是否为复位命令
{
ES=0;
sbuf2=SP+1;
for(p.p1[0]=SP-0x10;p.p1[0]<=sbuf2;p.p1[0]++)*p.p1[0]=0;
}
state1=0; //将接收状态标志置为零,接收下一个数据帧
buf1_flag=1; //置接收标志为1,表示已经接收到一个数据帧
REN=0; //禁止接收
}
else
{ //不是接受到数据帧尾,表明接收错误
state1=0; // 将接收状态标志置为零,重新接收
buf1=RECEIVE; //初始化发送的地址
void ie1(void) interrupt 2{ie_1();}
void tf1(void) interrupt 3{tf_1();tf_2();}
void tf2(void) interrupt 5{ //采用中断方式跟查询方式相结合的办法解码
EA=0; //禁止中断
if(TF2){ //判断是否是溢出还是电平变化产生的中断
*buf1=NACK; //把NACK信号存入接收缓冲里
buf1_flag=1; //置标志位为1,使主程序能对接收错误进行处理
REN=0; //禁止接收
}
}
else
{ //接收正确
rsbuf1=~sbuf1; //按位取反,使高半字节变原码
rsbuf1&=0xf0; //仅保留高半字节,低半字节去掉
bit write_byte_iic(unsigned char a);
void send_ack_iic(void);
void send_nack_iic(void);
bit receive_ack_iic(void);
void start_iic(void);
void stop_iic(void);
void write_key_data(unsigned char a);
unsigned int read_key_data(unsigned char a);
void ie0(void) interrupt 0{ie_0();}
void tf0(void) interrupt 1{tf_0();}
#define NACK 0x04//应答信号,表示接收数据错误
#define BUSY 0x05//忙信号,表示正在忙
#define FREE 0x06//空闲信号,表示处于空闲状态
#define READ_IR 0x0b//读取红外
#define STORE_IR 0x0c//保存数据
else{
switch(state1){
case 10:sbuf2=sbuf1>>4; //把高半字节右移到的半字节
sbuf2=~sbuf2; //把低半字节取反
if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确
{ //接收错误,有可能接收的是数据帧尾,也有可能是接收错误
EA=0; //禁止中断
if(RI){
RI=0; //清除接收中断标志位
sbuf1=SBUF; //将接收缓冲的字符复制到sbuf1
if(sbuf1==HEAD){ //判断是否帧开头
state1=10; //是则把state赋值为10
buf1=RECEIVE; //初始化接收地址
}
sbuf2>>=4; //将高半字节右移到低半字节
rsbuf2&=0xf0; //保留高半字节,去掉低半字节
sbuf2&=0x0f; //保留低半字节,去掉高半字节
rsbuf2|=sbuf2; //合并高低发送出去
state2=10; //将state2置为10准备发送下半字节
#include "at89x52.h"
#define NULL 0x00//数据无效
#define RESET 0X01//程序复位
#define REQUEST 0X02//请求信号
#define ACK 0x03//应答信号,在接收数据后发送ACK信号表示数据接收正确,也位请求信号的应答信号
unsigned int xdata *p4;
}p;
//union{ //
// unsigned char a[2]; //
// unsigned int b;
// unsigned char data *p1[2];
// unsigned int data *p2[2];
// unsigned char xdata *p3;
ir++;
*ir=temp.a[1];
ir++;
*ir=RCAP2H; //把长电平脉冲时间记录下来
ir++;
*ir=RCAP2L;
ir++;
if(ir>=0xda) {
goto exit; //判断是否溢出缓冲,如果溢出则失败退出