红外遥控解码原理

合集下载

红外遥控原理及解码程序

红外遥控原理及解码程序

红外遥控系统原理及单片机红外线遥控是目前使用最广泛的一种通信和遥控手段。

由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。

工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。

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种不同组 合的编码。

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

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

上述“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左右均可。

红外 遥控 原理

红外 遥控 原理

红外遥控原理
红外遥控原理是通过发射红外线信号来遥控设备的一种技术。

红外线是一种电磁波,其频率高于可见光,人眼无法直接看到。

通过使用红外发射器将电信号转换为红外光信号,然后使用红外接收器将红外光信号转换回电信号,实现设备的控制。

在红外遥控中,发射器通常由红外发光二极管组成。

当发射器接收到电信号时,它会驱动红外发光二极管产生红外光信号。

这些红外光信号具有特定的编码,可以指示不同的操作。

接收器通常由红外接收二极管和解码器组成。

红外接收二极管可以接收到发射器发出的红外光信号,并将其转换为电信号。

解码器会对接收到的电信号进行解码,将其转换为对应的操作指令。

解码器根据设定的协议,解析红外信号中的编码,以确定应该执行的操作。

在红外遥控中,发射器和接收器之间需要进行频道匹配,确保发射的红外信号能够被接收器正确解码。

此外,遥控设备通常具有不同的按键,每个按键对应着一种操作。

当用户按下按键时,发射器会发送相应的红外信号,接收器接收到信号后将其解码,并执行相应的操作。

红外遥控技术广泛应用于电视、空调、音响、家电等各种设备,为用户提供了方便的操作方式。

红外遥控原理简单而有效,因此被广泛采用。

红外遥控原理和制作方法

红外遥控原理和制作方法

红外遥控原理和制作方法一、引言红外遥控技术是一种常见的无线通信技术,广泛应用于家电、电子设备等领域。

本文将介绍红外遥控的原理和制作方法。

二、红外遥控原理红外遥控原理基于红外线的发射和接收。

遥控器发射器中的红外发射二极管会产生红外光信号,信号经过编码后发送给接收器。

接收器中的红外接收二极管会接收到红外光信号,并进行解码。

解码后的信号通过微处理器进行处理,最终转化为对应的控制信号,控制设备的操作。

三、红外遥控制作方法1. 硬件设计制作红外遥控器的第一步是设计硬件。

需要准备的材料有红外发射二极管、红外接收二极管、编码解码芯片、微处理器等。

在电路设计中,需要根据具体的遥控器功能,选择合适的编码解码芯片和微处理器,并按照电路原理图进行连接。

2. 程序编写制作红外遥控器的第二步是编写程序。

根据遥控器功能需求,编写相应的程序代码。

程序代码可以使用C、C++、Python等编程语言进行编写,通过对按键的扫描和编码解码的处理,将控制信号转化为红外光信号。

3. 硬件连接将硬件电路和程序进行连接。

将编写好的程序通过编程器下载到微处理器中,将红外发射二极管和红外接收二极管连接到电路中的相应位置。

确保电路连接正确无误。

4. 测试与调试完成硬件连接后,进行测试与调试。

使用万用表等工具检查电路连接是否正常,确保红外发射和接收二极管工作正常。

通过按下遥控器按键,检查接收器是否可以正确解码,并将信号转化为对应的控制信号。

四、红外遥控的应用红外遥控技术广泛应用于各种家电和电子设备中,例如电视、空调、DVD播放器等。

通过红外遥控器,用户可以方便地控制设备的开关、音量、频道等功能。

五、红外遥控技术的发展趋势随着科技的不断进步,红外遥控技术也在不断发展。

目前,一些新型的红外遥控技术已经出现,例如基于无线网络的红外遥控技术,可以通过手机等设备进行远程控制。

此外,一些智能家居系统也开始使用红外遥控技术,实现对家中各种设备的集中管理。

六、结论红外遥控技术是一种常见且实用的无线通信技术,通过红外线的发射和接收,可以实现对各种设备的远程控制。

红外遥控器软件解码及其应用

红外遥控器软件解码及其应用

红外遥控器软件解码及其应用随着现代科技的不断发展,红外遥控器已经成为人们日常生活中的必备工具之一。

不过,很多人并不了解红外遥控器的工作原理以及它是如何通过软件解码来实现遥控效果的。

本文将详细介绍红外遥控器软件解码的相关知识,以及其在实际应用中的作用。

一、红外遥控器的工作原理首先,我们需要了解红外遥控器的工作原理。

简单来说,红外遥控器是一种利用红外线光谱来传输指令的设备,通过在发射端发送编码的红外信号,再在接收端解码后执行相应的指令。

通常,红外遥控器由发射部分与接收部分两个部分组成。

发射部分由红外LED发射器构成,它会通过红外发射现象来发送编码的红外信号。

在接收端,红外接收器则会接收到这些信号,并将其转换成电信号进行解码。

之后,解码器会解析出信号的编码含义,然后执行相应的指令。

这就是红外遥控器的基本工作原理。

二、红外遥控器软件解码的实现在红外遥控器的工作中,软件解码起到了重要的作用。

所谓软件解码,就是在终端设备中运行的一种程序,能够将遥控器发射的红外编码转换成可读的指令。

而这些指令就可以用于控制各种家电、设备等。

软件解码的实现主要有两种方式。

第一种是使用硬件解码器,这需要在终端设备上安装一个专门的硬件解码器,用于解析红外信号,并输出相应的指令。

第二种方法则是使用软件解码器,这需要在终端设备上安装一个软件程序,用于解析红外信号并输出指令。

在软件解码的实现中,最常见的是使用赛贝尔红外编解码库。

这个库已经成为了广泛使用的一种红外编解码方案。

它可以用于各种嵌入式设备、物联网设备、手机、电视机顶盒等多种应用场景中。

三、红外遥控器软件解码的应用目前,红外遥控器软件解码已广泛应用于各种智能家居、物联网设备、工控设备等领域。

下面列举一些具体的应用案例:1、智能家居:通过使用红外遥控器软件解码,可以实现对家中的各种电器、设备的遥控控制。

如电视、空调、照明设备等。

2、物联网设备:红外遥控器软件解码还可以用于物联网设备中,如智能家居中的智能门锁、智能家电等。

51红外遥控原理

51红外遥控原理

51红外遥控原理红外遥控技术是一种利用红外线进行远程无线控制的技术,广泛应用于家电、电视、空调、音响等设备上。

其原理是利用红外线的特性进行信息的传输与解码。

首先,红外遥控的原理基于红外线的传播特性。

红外线是一种波长较长的电磁辐射,其波长范围为0.75微米到1000微米。

红外线具有穿透力强、传播速度快、直线传播等特点,且几乎不受可见光的影响。

因此,红外线可以穿透透明的物体,如玻璃、塑料等,而不能穿透不透明的物体,如墙壁等。

在红外遥控中,遥控器是发射器,被控制的设备是接收器。

遥控器中包含一个红外线发射二极管,通过对其通电激活,在发射二极管前方会形成一个红外线发射区域。

而被控制的设备中则装有一个红外线接收头,用于接收发射器发出的红外线信号。

红外遥控的工作过程一般分为发射和接收两个步骤。

在发射过程中,当用户按下遥控器上的某个按键时,遥控器会从内部的码库中选择相应的红外线编码,通过发射二极管产生红外线信号。

这个红外线信号包含了具体的操作指令,如开关、音量调节、频道切换等。

发射二极管将红外线信号发出,在空气中以光的形式传播,然后被被控设备的红外线接收头接收。

在接收过程中,被控设备接收到红外线信号后,红外线接收头会将红外线转换为电信号,并将其传送给设备的中央处理芯片。

中央处理芯片会进行解码操作,将接收到的红外线信号解码成对应的指令。

然后,中央处理芯片根据解码结果执行相应的操作,控制设备的开关、音量、频道等。

例如,如果用户按下遥控器上的音量加键,中央处理芯片会解码出音量加的指令,并相应地改变设备的音量。

总体来说,红外遥控的原理是通过发射器发出红外线信号,经过空气传播到接收器,接收器将红外线信号转换成电信号并进行解码,最终通过中央处理芯片控制设备的操作。

通过这种原理,用户可以远程操控各种设备,实现便捷的家电控制。

需要注意的是,不同厂商之间的红外编码方式可能存在差异,这就需要设备的红外接收头能够识别出不同编码方式,并将其转换为标准的电信号进行解码。

红外遥控器原理

红外遥控器原理

红外遥控器原理
红外遥控器是一种使用红外线来传输信号从而实现远距离控制设备的电子设备。

它主要由发射器和接收器两部分组成。

发射器部分包含一个红外发射二极管和控制电路。

当用户按下红外遥控器上的按钮时,控制电路会将对应的信号编码成红外信号。

红外发射二极管会随后将这一编码后的红外信号通过快速的光脉冲传播出去。

接收器部分一般由一个红外接收二极管、解码电路和执行电路构成。

红外接收二极管可以接收发射器发出的红外信号,并将其转换为电信号。

经过解码电路的处理后,电信号被解码成对应的控制信号,然后传送给执行电路。

执行电路可以根据接收到的控制信号来操作被控设备。

可以通过控制信号来打开或关闭电源,调节音量,切换频道等等。

红外遥控器的原理基于红外线的特性。

红外线是一种波长较长的电磁辐射,不可见于人眼。

正因为红外线的波长长,能量较低,因此其穿透能力相对较弱,只能在短距离内传输。

这使得红外遥控器成为一种理想的设备远程控制方法。

总结来说,红外遥控器利用红外线的特性,通过发射器部分将用户的操作编码成红外信号,并通过接收器部分将红外信号转换为电信号并解码成对应的控制信号,最终通过执行电路来实现远程控制设备的功能。

红外遥控器的原理

红外遥控器的原理

红外遥控器的原理
红外遥控器是一种通过红外线信号来进行远程控制的装置。

它由发射器和接收器两部分组成。

发射器部分包括一个红外发射二极管和一个微控制器。

当用户按下遥控器上的按钮时,微控制器会发送一个特定的红外编码。

红外编码是一组由数字0和1组成的序列,每个按钮对应一个编码。

这个编码会通过红外发射二极管转化为红外信号,并以一定的频率进行发射。

接收器部分包括一个红外接收二极管和一个解码器。

红外接收二极管用来接收发射器发送的红外信号,并将其转化为电信号。

解码器会将接收到的电信号解析为相应的红外编码,然后将其传送给被控制的设备。

红外遥控器的工作原理是基于红外线的特性。

红外线是一种电磁波,其频率较低,无法被人眼所识别。

由于红外线的特性,红外信号能够穿透空气,并在接收器所在设备的红外接收器上产生电信号。

通过解码红外编码,被控制的设备能够识别用户的操作,并执行相应的功能。

红外遥控器的原理是利用了红外线的无线传输特性,使得用户能够方便地通过遥控器来控制各种设备,如电视、空调、音响等。

这种无线遥控方式具有操作简便、响应迅速等优点,因此被广泛应用于日常生活和工业领域中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

红外线遥控器解码原理红外线遥控是目前使用最广泛的一种通信和遥控手段。

由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。

工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。

1 红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。

发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。

2 遥控发射器及其编码遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理。

当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。

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

上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。

然后再通过红外发射二极管产生红外线向空间发射,如图3所示。

UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。

该芯片的用户识别码固定为十六进制01H;后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)组成。

代码格式(以接收代码为准,接收代码与发射代码反向)①位定义②单发代码格式③连发代码格式注:代码宽度算法:16位地址码的最短宽度:1.12×16=18ms16位地址码的最长宽度: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左右均可。

2.根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。

如果邮购我们开发的51单片机试验板和扩展元件的网友,可以获得如上图所示的红外遥控手柄,这种遥控器的编码格式符合上面的描述规律,而且价格低廉,有32个按键,按键外形比较统一,如果用于批量开发,可以把遥控器上贴膜换成你需要的字符,这为开发产品提供了便利。

接收器及解码一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。

下面是一个对51实验板配套的红外线遥控器的解码程序,它可以把上图32键的红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。

红外遥控器软件解码原理及程序红外一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms高电平,2.25ms的低电平,跟着是一个短脉冲,本程序经过试用,能解大部分遥控器的编码!红外发送一开始发送一段13。

5ms的引导码,引导码由9ms的高电平和4。

5ms 的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2。

25ms的低电平,跟着是一个短脉冲,本程序是免费给大家,版权所有,不得用于商业目的,如需用到本程序到商业上请与本人联系**********************,经本人同意后方可用于商业目的,本程序经过试用,能解大部分遥控器的编码!#include "at89x52.h"#define NULL 0x00//数据无效#define RESET 0X01//程序复位#define REQUEST 0X02//请求信号#define ACK 0x03//应答信号,在接收数据后发送ACK 信号表示数据接收正确,也位请求信号的应答信号#define NACK 0x04//应答信号,表示接收数据错误#define BUSY 0x05//忙信号,表示正在忙#define FREE 0x06//空闲信号,表示处于空闲状态#define READ_IR 0x0b//读取红外#define STORE_IR 0x0c//保存数据#define READ_KEY 0x0d//读取键值#define RECEIVE 0Xf400//接收缓冲开始地址#define SEND 0xfa00//发送缓冲开始地址#define IR 0x50//红外接收缓冲开始地址#define HEAD 0xaa//数据帧头#define TAIL 0x55//数据帧尾#define SDA P1_7#define SCL P1_6unsigned char xdata *buf1; //接受数据缓冲unsigned int buf1_length; //接收到的数据实际长度unsigned char xdata *buf2; //发送数据缓冲unsigned int buf2_length; //要发送的数据实际长度bit buf1_flag; //接收标志,1表示接受到一个数据帧,0表示没有接受到数据帧或数据帧为空bit buf2_flag; //发送标志,1表示需要发送或没发送完毕,0表示没有要发送的数据或发送完毕unsigned char state1,state2; //用来标志接收字符的状态,state1用来表示接收状态,state2用来表示发送状态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; //红外缓冲的指针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;// 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 a[4];unsigned int b[2];unsigned long c;}ir_code;union{unsigned char a[4];unsigned int b[2];unsigned long c;unsigned char data *p1[4];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为缓冲溢出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);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_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();}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;//开启计数器0loop:TL0=0; //将计数器0重新置为零TH0=0;while(!EXF2){ //查询等待EXF2变为1if(TF0)goto exit; //检查有没超时,如果超时则退出};EXF2=0;//将EXF2清零if(!TH0) / /判断是否是长低电平脉冲过来了{//不是长低电平脉冲而是短低电平if(F0)count.b++;//短脉冲数加一temp.a[0]=RCAP2H; //将捕捉数临时存放起来temp.a[1]=RCAP2L;gotoloop; //返回继续查询 }else{//是低电平脉冲,则进行处理F0=0;*ir=temp.a[0]; //把连续的短脉冲总时间记录下来ir++;*ir=temp.a[1];ir++;*ir=RCAP2H; //把长电平脉冲时间记录下来ir++;*ir=RCAP2L;ir++;if(ir>=0xda) {goto exit; //判断是否溢出缓冲,如果溢出则失败退出}goto loop; //返回继续查询}exit:ir_flag=1; //置ir_flag为1表示接收成功end:;}void rs232(void) interrupt 4{static unsigned charsbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2用来接收发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节EA=0;//禁止中断if(RI){RI=0;//清除接收中断标志位sbuf1=SBUF;//将接收缓冲的字符复制到sbuf1if(sbuf1==HEAD){//判断是否帧开头state1=10;//是则把state赋值为10buf1=RECEIVE;//初始化接收地址}else{switch(state1){case10:sbuf2=sbuf1>>4; //把高半字节右移到的半字节sbuf2=~sbuf2;//把低半字节取反if((sbuf2&0x0f)!=(sbuf1&0x0f))//判断接收是否正确{//接收错误,有可能接收的是数据帧尾,也有可能是接收错误if(sbuf1==TAIL)//判断是否接收到数据帧尾{//是接收到数据帧尾buf1=R ECEIVE; //初始化接收的地址if(*bu f1==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_f lag=1; //置接收标志为1,表示已经接收到一个数据帧REN=0;//禁止接收}else{//不是接受到数据帧尾,表明接收错误state1=0 ; // 将接收状态标志置为零,重新接收buf1=REC EIVE; //初始化发送的地址*buf1=NA CK; //把NACK信号存入接收缓冲里buf1_fla g=1; //置标志位为1,使主程序能对接收错误进行处理REN=0;//禁止接收}}else{//接收正确rsbuf1=~sbuf1;//按位取反,使高半字节变原码rsbuf1&=0xf0;//仅保留高半字节,低半字节去掉state1=20;//将状态标志置为20,准备接收低半字节}break;case20:sbuf2=sbuf1>>4; //把高半字节右移到的半字节sbuf2=~sbuf2;//将低半字节取反if((sbuf2&0x0f)!=(sbuf1&0x0f))//判断接收是否正确{//接受错误state1=0;// 将接收状态标志置为零,重新接收buf1=RECEIVE;//初始化接收的地址*buf1=NACK;//把NACK信号存入发送缓冲里buf1_flag=1;//置标志位为1,使主程序能对接收错误进行处理REN=0;//禁止接收}else{sbuf1&=0x0f;//仅保留低半字节,去掉高半字节rsbuf1|=sbuf1;//高低半字节合并*buf1++=rsbuf1;//将接收的数据保存至接收缓冲里,并且数据指针加一buf1_length++;//接收数据长度加一state1=10;//将state1置为10,准备接收下个字节的高半字节}break;}}}else{TI=0;//清除发送中断标志if(buf2_length)//判断发送长度是否为零{//发送长度不为零if(state2==0)//判断是否发送高半字节{//发送高半字节sbuf2=*buf2;//将要发送的字节送到sbuf2rsbuf2=~sbuf2; //取反,使高半字节变为反码sbuf2>>=4;//将高半字节右移到低半字节rsbuf2&=0xf0;//保留高半字节,去掉低半字节sbuf2&=0x0f;//保留低半字节,去掉高半字节rsbuf2|=sbuf2; //合并高低半字节SBUF=rsbuf2;//发送出去state2=10;//将state2置为10准备发送下半字节}else{//发送低半字节sbuf2=*buf2;//将要发送的字节送到sbuf2buf2++;//指针加一buf2_length--; //发送数据长度减一rsbuf2=~sbuf2; //取反,使低半字节变为反码rsbuf2<<=4;//将低半字节反码左移到高半字节rsbuf2&=0xf0;//保留高半字节,去掉低半字节sbuf2&=0x0f;//保留低半字节,去掉高半字节rsbuf2|=sbuf2; //合并高低半字节SBUF=rsbuf2;//发送出state2=0;}}else{//如果发送数据长度为零则发送数据帧尾if(buf2_flag){//判断是否发过数据帧尾SBUF=TAIL;//将数据帧尾发送出去while(TI==0);TI=0;buf2_flag=0;//置发送标志为零,表示发送完毕}}}EA=1;//开放中断}。

相关文档
最新文档