红外线遥控解码原理2

合集下载

红外遥控解码实验报告(3篇)

红外遥控解码实验报告(3篇)

第1篇一、实验目的本次实验旨在通过搭建红外遥控系统,了解红外遥控的基本原理,掌握红外遥控信号的编码和解码方法,并利用单片机实现对红外遥控信号的解码,实现对红外遥控器的控制。

二、实验原理红外遥控技术是一种无线通信技术,通过发射端发送特定编码的红外信号,接收端接收该信号并进行解码,从而实现对电器的控制。

红外遥控系统主要由发射端和接收端两部分组成。

1. 发射端:由按键矩阵、编码调制电路和红外发射器组成。

按键矩阵根据按键的不同产生不同的编码信号,编码调制电路将这些信号调制在38kHz的载波上,红外发射器将调制后的信号发射出去。

2. 接收端:由红外接收器、前置放大电路、解调电路和指令信号检出电路组成。

红外接收器接收发射端发射的红外信号,前置放大电路对信号进行放大,解调电路将38kHz的载波信号去除,指令信号检出电路从解调后的信号中提取出指令信号。

三、实验设备1. 红外遥控发射器2. 红外接收模块3. 单片机开发板4. 连接线5. 电源6. 红外遥控解码程序四、实验步骤1. 搭建红外遥控系统:将红外接收模块连接到单片机开发板的相应引脚上,确保连接正确无误。

2. 编写红外遥控解码程序:根据红外遥控协议,编写解码程序,实现对红外信号的解码。

3. 程序烧录与调试:将解码程序烧录到单片机中,连接电源,进行程序调试。

4. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。

五、实验结果与分析1. 红外遥控系统搭建成功:通过连接红外接收模块和单片机开发板,成功搭建了红外遥控系统。

2. 解码程序编写与调试:根据红外遥控协议,编写解码程序,实现对红外信号的解码。

在调试过程中,通过观察单片机的输出,验证了程序的正确性。

3. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。

实验结果表明,单片机能够成功解码红外信号,并实现红外遥控器的控制功能。

任务5.4红外遥控解码.

任务5.4红外遥控解码.

* 函数名称: InfraredInit()
* 功能 :定时器测量脉宽功能初始化 * 入口参数:无
* 出口参数:无
* 说明 : ***************************************************************************/
void InfraredInit()
{
uint PulseWidth=0;
//
uchar OriginalCode=0;
//
脉宽 操作码原码
6
5.4 红外遥控器解码
uchar AntiCode=0;
//
按键码反码
static bit FlagStart=0;
//
捕获结果码标志位
static uchar IntrNum=0;
//
中断次数
IntrNum++;
}
if(IntrNum>=32)
//
{
IntrNum=0;
AntiCode=InfraredDecode&0xff; // OriginalCode=(InfraredDecode>>8)&0xff;//
if(AntiCode+ OriginalCode==0xff) //
{
FlagInfraredGet=1;
5.4.3 任务实施
图 5.4.8 是本程序的工程结构图:
图 5.4.8 工程结构框图
4
5.4 红外遥控器解码
( 1)主函数 main.c:
#include<reg52.h>
#include"Infrered.h"

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

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

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

解码原理2

解码原理2

单片机解码红外遥控的原理来源:互联网作者:匿名发表日期: 2009-10-12 18:53:27 阅读次数: 601 查看权限:普通文章用单片机解码红外遥控器遥控器使用方便,功能多.目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。

如果能将遥控器上许多的按键解码出来.用作单片机系统的输入.则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。

而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用。

下面以TC 9012编码芯片的遥控器为例。

谈谈如何用常用的51系统单片机进行遥控的解码。

一、编码格式1、0和1的编码遥控器发射的信号由一串O和1的二进制代码组成.不同的芯片对0和1的编码有所不同。

通常有曼彻斯特编码和脉冲宽度编码。

TC9012-p.htm" target="_blank" title="TC90 12货源和PDF资料">TC9012的O和1采用PWM方法编码,即脉冲宽度调制,其O码和1码如图1所示(以遥控接收输出的波形为例)。

O码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms.1码由0.56ms低电平和1.69ms高电平组合而成.脉冲宽度为2.25ms。

在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。

2、按键的编码当我们按下遥控器的按键时,遥控器将发出如图2的一串二进制代码,我们称它为一帧数据。

根据各部分的功能。

可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。

遥控器发射代码时.均是低位在前。

高位在后。

由图2分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。

当接收到此码时.表示一帧数据的开始。

单片机可以准备接收下面的数据。

地址码由8位二进制组成,共256种.图中地址码重发了一次。

主要是加强遥控器的可靠性.如果两次地址码不相同.则说明本帧数据有错.应丢弃。

红外遥控的原理

红外遥控的原理

红外遥控的原理展开全文目前很多手机都集成了红外功能,这一功能在手机上主要用作遥控器使用。

现在的硬件厂商都在搭建生态,比如智能家居。

以手机作为智能终端,通过APP来控制所要接入的各种设备,如空调、电视、照明灯、音响等。

而手机的红外功能就可以把手机当作一个遥控器来使用。

家用设备中,红外的普及是通过空调和电视来实现的。

两者的遥控设备都是通过红外功能来实现的,这两种近距离场景是红外应用最广泛的地方。

红外要实现遥控需要红外发送和红外接受等硬件的支持。

在空调和电视端,集成的红外接收电路;在手机端集成的是红外发射电路。

1 红外发射电路红外发射电路的核心元器件是红外发射探头,该探头的外形与直插LED非常类似,外表透明,在使用时也是按照LED的驱动电路来设计电路的。

如下图所示。

当基极端的IR为低电平时红外电路处于关断状态;当基极端的IR 为高电平时红外电路导通,发出外红光,被接收电路所接收。

2 红外接收电路红外接收电路涉及到红外接收元器件电路以及解码电路。

红外发射和接收是成对出现的,通用的红外接收元器件为黑色外壳,外形如LED。

但是这种接收器件比较容易收到干扰。

在设计电路时都使用专用的红外接收器件,如HS0038。

接收电路如下图所示。

3 红外的通讯协议有了发射电路、有了接收电路,那么数据是如何传输的呢?这就要设计到通讯协议了。

手机的红外在适配不同型号的电视、空调时都一个学习的过程,这个学习的过程就是协议适配的过程。

目前比较主流的通讯协议是NEC的。

NEC规定了0和1的定义,定义了报文数据结构。

0和1的定义如下图所示。

遥控器在按下的时候,红外发射部分会发送一串脉冲,该脉冲的编码是遵循NEC协议的,接收端对脉冲编码解析出用户按键的含义再执行相应的命令。

手机端的红外,是发送部分,APP中按下某一个键,红外就会发送出一串脉冲,接收电路对该脉冲进行解码,由此实现发送和接收的配合,实现遥控设备的目的。

但是,手机红外目前功能主要用来控制电视、空调等,当作遥控器来使用,应用场景比较受限,这主要由红外的通讯距离短、需要点对点匹配等约束的。

红外调制与解调原理

红外调制与解调原理

4 功能模块设计4.1 红外的发射和接收红外线波长在750nm至1um之间的电磁波,它的频率低于可见光,是一种人的眼睛看不到的光线。

红外遥控具有抗干扰能力强,信息传输可靠,功耗低,成本低,易于实现等显著优点。

红外遥控由发送和接收两部分组成,发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲信号,通过红外发射管发射红外信号。

红外接收采用性能可靠的一体化红外接收头接收红外信号,它同时对信号进行放大,检波,整形,得到TTL电平的编码信号,再送给单片机,经单片机解码并进行相关操作。

发送与接收示意图如下所示:图4 发送与接收示意图由上所述可知,遥控系统分为编码,调制,解调和解码如图5所示四大部分:图5 遥控与接收系统4.1.1 编码如图4,二进制信号中的‘1’的高低电平均等于0.26ms,相当于10个26us的宽度;二进制信号中的‘0’的低电平宽0.52ms,高电平宽0.26ms。

图6 编码示意图4.1.2 调制红外信号的调制有脉冲宽度调制(PWM),脉冲位置调制(PPM)等方法,本设计采用脉宽调制。

二进制的调制由单片机来完成,它把编码后的二进制信号调制成频率为38khz 的间断脉冲串,此脉冲串即是用于红外发射二极管发送的信号。

如图7,A是二进制信号的编码波形,B是频率为38khz(周期约为26us)的连续脉冲串,C是经调制后的间断脉冲串,即是用于发送的信号。

图7中,待发的二进制数据为101。

图7 信号调制示意图4.1.3 解调二进制信号的解调由一体化红外接收头来完成,它把接收到的信号(图8中的波形D 也是图7中的波形C)经内部处理并解调复原,输出图8中的波形E(正好是图7中A的取反)。

接收头的解调可理解为:在输入脉冲串时输出低电平,否则输出高电平。

二进制的解码由单片机来完成,它把红外接收头送来的二进制编码波形通过解码,还原成发送端发送的数据。

如图8,把波形E解码还原成数据信息101。

图8 信号解调示意图4.1.4 解码在发送字节的开始先通过单片机发送20个脉冲宽度(每个脉冲周期26us)的高电平作为传输的开始(同步帧),接着发送8位二进制数据(高位在前,低位在后),最后发送10个脉冲宽度的低电平作为传输的结束,如图9所示:图9 字节传输当接收到同步帧后,进入解码部分。

电路工作原理揭秘遥控器的红外发射与信号解码

电路工作原理揭秘遥控器的红外发射与信号解码

电路工作原理揭秘遥控器的红外发射与信号解码红外发射技术是现代电子产品中常见的一种通信方式,广泛应用于各种遥控器中。

它的工作原理是通过红外光发射器将信号转换成红外光信号,然后通过红外接收器接收并解码,实现远程控制设备的操作。

本文将揭秘遥控器的红外发射与信号解码的工作原理及其应用。

一、红外发射器的工作原理红外发射器是遥控器中的核心部件,它能将电信号转换成红外光信号,并通过空气传输到接收器。

红外发射器工作原理如下:1.1 发光二极管红外发射器通常采用发光二极管(Light Emitting Diode,简称LED)进行红外光的发射。

LED是一种能够发出可见光和红外光的二极管,当通电时,LED会发出特定频率的光信号。

1.2 调制技术为了确保遥控器发出的红外信号能够被接收器正确解码,通常会采用调制技术。

调制技术是通过改变信号的频率、幅度或脉冲来表示信息,常见的调制方式有脉冲宽度调制(PWM)和脉冲位置调制(PPM)。

1.3 码型遥控器发射的红外信号通常是经过编码的,不同的信号对应不同的功能。

常见的红外码型有NEC码、RC-5码、RC-6码等,不同的遥控器使用不同的码型。

二、红外信号解码技术接收器是红外发射信号的接收和解码装置,它能将接收到的红外信号转换成电信号,并进行解码还原为原始信号,从而控制相应的设备。

红外信号解码技术主要包括以下几个方面:2.1 红外接收器红外接收器是用于接收红外信号的装置,它通常由红外接收模块和解码电路组成。

红外接收模块能够接收并转换传输过来的红外光信号,解码电路则负责解析接收到的信号。

2.2 滤波和放大由于环境中存在多种光源,为了确保只接收到有效的红外信号,红外接收器通常会设置滤波器来屏蔽其他频率的光信号。

同时,接收到的红外信号经过放大,以增强信号的强度和稳定性。

2.3 解码和译码接收到的红外信号经过解码电路的处理,通过特定的解码算法还原为原始信号,这样就可以实现对设备的控制。

解码算法通常根据不同的码型进行设计,以确保正确地解析红外信号。

红外解码说明文档

红外解码说明文档

红外解码说明文档作者: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、如何利用单片机的外设来实现对应的功能红外解码功能:因为红外解码的第一步骤是对电平长度的检测,因而最好是利用单片机的捕获功能来检测电平的长度,然后再根据电平长度来判断其意义(建议:不要检测双边沿,最好是检测一个周期的电平,例如下降沿的时间间隔)。

  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位为用户识别码,能区别不同的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的低电平,跟着是一个短脉冲,本程序是免费给大家,版权所有,不得用于商业目的,如需用到本程序到商业上请与本人联系jiang_xi_sheng@,经本人同意后方可用于商业目的,本程序经过试用,能解大部分遥控器的编码!#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表示没有要发送的数据或发送完毕示接收状态,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 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; //开启计数器0TL0=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;goto loop; //返回继续查询 }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 char sbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2用来接收发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节//禁止中断if(RI){RI=0;//清除接收中断标志位sbuf1=SBUF;//将接收缓冲的字符复制到sbuf1if(sbuf1==HEAD){//判断是否帧开头state1=10;//是则把state赋值为10buf1=RECEIVE;//初始化接收地址}else{switch(state1){case 10:sbuf2=sbuf1>>4; //把高半字节右移到的半字节sbuf2=~sbuf2;//把低半字节取反if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确{//接收错误,有可能接收的是数据帧尾,也有可能是接收错误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;//禁止接收}{//不是接受到数据帧尾,表明接收错误state1=0;// 将接收状态标志置为零,重新接收buf1=RECEIVE;//初始化发送的地址*buf1=NACK;//把NACK信号存入接收缓冲里buf1_flag=1;//置标志位为1,使主程序能对接收错误进行处理REN=0;//禁止接收}}else{//接收正确rsbuf1=~sbuf1;//按位取反,使高半字节变原码rsbuf1&=0xf0;//仅保留高半字节,低半字节去掉state1=20;//将状态标志置为20,准备接收低半字节}break;case 20:sbuf2=sbuf1>>4; //把高半字节右移到的半字节sbuf2=~sbuf2;//将低半字节取反if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确{//接受错误state1=0;// 将接收状态标志置为零,重新接收buf1=RECEIVE;//初始化接收的地址*buf1=NACK;//把NACK信号存入发送缓冲里buf1_flag=1;//置标志位为1,使主程序能对接收错误进行处理REN=0;//禁止接收}else{//仅保留低半字节,去掉高半字节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{//发送低半字节//将要发送的字节送到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;//开放中断}。

相关文档
最新文档