红外线遥控接收器设计

合集下载

红外遥控接收器的设计

红外遥控接收器的设计

.. 目录红外遥控接收器的设计 (1)一、研究背景 (1)二、设计目的 (1)三、设计要求 (1)3.1整个控制系统的设计要求 (1)四、设计方案 (2)五、硬件设计 (3)5.1单片机及其硬件电路设计 (3)5.1.1 单片机的介绍 (3)5.1.2 时钟电路及RC复位电路 (4)5.2红外发射电路 (5)5.3 单片机红外接收器的电路设计 (6)5.3.1 红外接收电路 (6)5.3.2 电源电路的设计 (8)5.3.3 八路LED开关电路 (8)5.3.4电磁式继电器 (8)5.3.5 LCD1602液晶显示电路 (9)5.4小结 (10)六、程序设计 (10)6.1红外接收模块 (10)6.1.1红外接收电路主程序流程图 (10)6.1.2红外接收电路子程序流程图 (11)6.2小结 (12)七、系统测试 (12)7.1系统功能测试 (12)八、参考文献 (14)九、致 (14)附录1 (15)附录2 (19)红外遥控接收器的设计一、研究背景近年来随着计算机在社会领域的渗透,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。

传统的遥控器大多数采用了无线电遥控技术,但是随着科技的进步,红外线遥控技术的成熟,红外也成为了一种被广泛应用的通信和遥控手段。

继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。

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

由于红外线抗干扰能力强,且不会对周围的无线电设备产生干扰电波,同时红外发射接收围窄,安全性较高。

红外遥控虽然被广泛应用,但各产商的遥控器不能相互兼容。

当今市场上的红外线遥控装置一般采用专用的遥控编码及解码集成电路,由于其灵活性较低,应用围有限。

所以采用单片机进行遥控系统的应用设计,遥控装置将同时具有编程灵活、控制围广、体积小、功耗低、功能强、成本低、可靠性高等特点,因此采用单片机的红外遥控技术具有广阔的发展前景。

一种简易的红外遥控开关原理与设计

一种简易的红外遥控开关原理与设计

一种简易的红外遥控开关原理与设计
红外遥控开关原理及设计
一、红外遥控开关原理
1、红外线的基本原理:红外线是一种由发射源发出的电磁波,波长超
出了可见光的范围,其实就是由一个简单的电子元件把相对较高的电
压调整成电磁波,然后被接收端的接收器接收,从而实现遥控的功能。

2、红外遥控开关原理:红外遥控开关是靠红外线来传输信号,就是发
射端由一个发射器发射红外信号,接收端的接收器能够接收这种信号,然后触发、控制或启动对应的终端电路,从而实现遥控的功能。

二、红外遥控开关设计
1、结构设计:主要由发射模块和接收模块组成,发射模块主要由发射
电路和发射灯组成,接收模块主要由接收灯、接收电路、逻辑电路及
功率电路组成。

2、电路设计:发射模块的电路设计,采用称为双稳晶体管简易发射电路,它基于的的发射原理比较常见和简单,接收模块的电路设计,采
用两种常见的接收原理:第一种是用集成晶体芯片实现的高速度脉冲
解码器,第二种是用普通的射频管实现的简易接收电路。

3、传输距离:发射端能够将红外信号发射出去,接收端便能够收到这
种信号,但信号发送的距离有限,因为红外线的能量随距离的增大而
逐渐减小,因此接收端需要进行距离衰减调整。

总结:红外遥控开关原理是通过发射端发射红外信号,接收端的接收
器能够接收到信号,从而实现遥控的功能;结构设计上,发射模块和
接收模块由发射电路和发射灯,接收灯、接收电路、逻辑电路及功率
电路组成;电路设计主要采用双稳晶体管简易发射电路和用集成晶体
芯片实现的高速度脉冲解码器、用普通的射频管实现的简易接收电路;传输距离受到红外线的能量衰减影响,因此接收端需要进行距离衰减
调整。

红外接收电路设计

红外接收电路设计

[光

Spectrum ]
b. Noise 频 系 Noise 在R/M上使用可以遮断可见光的光学滤波。 使用High Frequency(30KHz ~ 56.9KHz) Carrier Modulation 在Pre-Amp Chip上,使用 I-V Stage 可变impedance及低频噪声折断滤波器。
Receiver Module Transmitter Vcc Vout GND C R Vcc Rp µ-com GND
8
REMOCON
c. 由于Vcc line Ripple Noise而没有输出信号的事例 - Set 區 : 卫星接收器的机顶盒。 - Noise Source : 在前面板的显示使用的七段码现使用脉冲驱动开关电路的噪声流入到 R/M的 Vcc Line上.. Vcc line noise 觀 R/M Output 觀 – Transmitter signal
[ incandescent lamp & Halogenlamp ]
R球

- Electronic Ballast ]
* channel 構 - ch-1 : Lamp ˘ - ch-M : spectrum * Modulation = - 120 Hz *} ¯ - Main : 47.0KHz
Vcc line Noise signal Noise signal
= 120Hz
R/M Output
② EMI Noise
a. Noise Source - TV CRT 的 b. Noise - 应用可以遮断 以及其他周边设备放射的 .
的金属屏蔽设计, 即可简单的路掉电磁波噪声. 整机厂商的IQC or PCB Ass’y 检查时,必须将金属屏蔽外壳和GND相连。 如果不接地,可能会使遥控距离变短。

数字系统课程设计 红外线遥控接收器

数字系统课程设计 红外线遥控接收器

数字系统课程设计报告第一部分设计题目及要求本次课程设计的题目及要求如下:一、设计题目红外线遥控接收器二、设计步骤1、EDA实验板组装调试参照提供的EDA实验板电路原理图、PCB图以及元器件清单进行电路板的组装。

电路板组装完成后,编写三个小程序进行电路板测试。

2、红外遥控系统的设计(1)发射编码部分使用指定的元器件在万用板上完成红外遥控器的制作。

(2)接收解码部分接收解码用VHDL语言编写程序,在EDA实验板上实现解码。

二、功能要求1、将一体化红外接收解调器的输出信号解码(12个单击键、6个连续键,单击键编号为7-18,连续键编码为1-6),在EDA实验板上用七段数码管显示出来。

2、当按下遥控器1—6号连续键时,在EDA实验板上用发光二极管点亮作为连续键按下的指示,要求遥控器上连续键接下时指示灯点亮,直到松开按键时才熄灭,用于区别单击键。

3、EDA实验板上设置四个按键,其功能等同于遥控器上的1—4号按键,当按下此四个按键时七段数码管分别对应显示“1”、“2”、“3”、“4”。

4、每当接收到有效按键时,蜂鸣器会发出提示音。

第二部分设计分析本次课程设计包括两大部分,一是电路设计及电路焊接,二是程序的设计及编写。

电路部分,根据题目要求,要做到红外发送,显然整个电路系统要分为红外发射和红外接收两个电路,分别做到红外的编码发射和译码接受,再在接收板上显示接受到的红外信号。

另外还包括一个从电脑下载程序到芯片上的下载线电路。

一、红外发射电路本次课程设计的红外遥控器由红外遥控专用芯片PT2248作为编码及发送部分,PT2248最大可用作18路红外遥控系统的编码,其内部己集成了38kHz的红外载波振荡及相应的数字脉码调制电路,只需外接3×6的矩阵式按键、红外发光二极管及其驱动电路等少量元器件便可完成编码发送的功能。

由PT2248和少量外围元件组成的红外遥控发射电路如下图所示芯片的发送指令由12位码组成,其中C1~C3是用户码,可用来确定不同的模式。

红外遥控原理和制作方法

红外遥控原理和制作方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

确保电路连接正确无误。

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

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

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

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

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

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

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

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

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

红外线接收控制器的制作

红外线接收控制器的制作

红外线接收控制器的制作在生活中,我们常用到红外线控制各类电器,如彩电、空调、电风扇等,为我们带来较多的方便,但有时我们仍感到不方便。

如看完电视后,用遥控器只能关掉电视主电源,电视仍处于待机状态,使用者还得走到电视跟前,按下电视电源开关方能放心。

若想看电视,还得动身开电视,显得很麻烦,尤其是冬天躺在床上看电视,上上下下,深感不便。

本文以利用红外遥控器来遥控风扇的制作方法为例(可任选一只红外线遥控器,能调速,软件稍作改变,可增加定时功能等),来介绍红外线接收控制器的制作方法,如果制作电视交流电源的开、关控制器,可与电视共用一只遥控器,制作也较简单些。

制作思路红外遥控发射器是利用红外线作载体传送信息的,发射周期不等的经过调制后串行码,该串行码一般由引导码、用户识别码、操作码组成。

经红外接收头解码后得到一串周期不等的矩形波,如示意图1。

不同型号的遥控发射器的波形宽度不同,即周期T1、T2……不同,在不知手头遥控发射器的波形周期的情况下,首先要制作一个检测红外线周期的工具。

根据测得的周期规律来制作红外线接收控制器。

制作方法检测红外周期的器件制作,见图2。

当红外接收头没有接收到发射器发送来的红外线,其输出端输出高电平(约+5V)。

当接收到红外线,输出端电平变低,送到单片机AT89C2051的外部中断1口即INT1,使其发生中断而进入中断服务:启动定时器1并开始计数,相当于在图1的A点,1个周期后即C点,单片机第二次中断,关定时器1,记下周期T1(实际上只记下TH1的数值,TL1的值可以丢弃),然后清TH1、TL1,再启动定时器1重新计数,第二个周期完后,同样会引起单片机发生中断,再记下周期T2……,如此记下40-50个周期(一般红外编码为4字节,即32BIT,之前还有引导码,又因接收到的红外数据不一定是从引导码开始,要分析一次完整的串行码,应尽可能多记下红外矩形波周期数),接收完后,通过按轻触开关将各记下的各周期的TH1在数码管显示出来以作分析(每按一次轻触开关,显示下一个周期数)。

基于单片机的红外通信系统设计

基于单片机的红外通信系统设计

基于单片机的红外通信系统设计1 简介红外通信是指利用红外线进行信息传输的一种无线通讯方式。

其传输距离在10米以内,速度较快,常用于遥控器、智能家居、安防监控等领域。

本文将介绍基于单片机的红外通信系统设计。

2 系统原理红外通信系统需包含红外发射器、红外接收器和处理器三个部分。

通信原理是将信息编码成红外信号,通过红外发射器发出,再由红外接收器接收,经过解码后传输到处理器中处理。

3 系统设计步骤3.1 红外接收器电路设计红外接收器采用红外管接收器,其特点是灵敏度高,在不同角度能接收到较远的红外信号。

红外管接收器与电路板焊接,电路板再选用较长的电线接到处理器的端口上。

3.2 红外发射器电路设计红外发射器采用红外二极管,其工作电压一般为1.2-1.4V。

通过接通1kHz以上的方波信号控制二极管的导通,使其发出红外光。

为保证其稳定性和较远的有效距离,需在电路中添加反向电流保护二极管。

3.3 处理器设计处理器选用常用的单片机,如AT89C51等。

单片机内置了红外通信模块,可用来发送和接收红外信号。

同时,还需通过编程实现对红外信号的解码和编码,实现信息传输与处理。

4 系统测试测试时,可用遥控器模拟发送红外信号,系统接收并解码后显示在液晶屏幕上。

测试距离一般在10米以内,且需保持天空无其它遮挡物。

5 总结基于单片机的红外通信系统设计,具有灵敏度高、速度快、传输距离短等特点。

其应用广泛,在智能家居、安防监控、车载通信等领域均有应用。

但需注意遮挡物的影响,以及信号干扰等问题。

--自己做红外遥控接收装置

--自己做红外遥控接收装置

自己动手,其乐无穷--自己做红外遥控接收装置红外遥控接收装置的硬件电路有很多种,它们各有特色。

如果你是一个狂热的电子爱好 者,那么你肯定热衷于自己动手来制作这样一个装置,其中的乐趣是别人所无法理解的。

如 果你仅仅是一个电脑爱好者,而对电子技术并不熟悉,那你可以购买这样一个装置,同样能 享受到坐在沙发上遥控电脑的乐趣。

1.完全采用数字电路的版本元件列表:U1 - 74HC14U2 - 74HC132U3 - IS1U60L or GP1U52XU4 - 74HC393U5 - 74HC165U6 - DS14C232 or MAX232电阻 R1,2 - 1K 微调电阻 R3 - 22K电容 C1,2 - 1 nF / C3 - 4.7 nF / C4-7 - 1 uF该电路在远距离使用时,工作效果较好。

你可以试着去掉外接电源,从串口获得电源, 从而简化电路(未测试)。

简单说明电路检测数字信号的每个周期并发送到计算机串口。

时钟电路由U1-c、R3、C3组成。

当 U1a的反相输出端产生一个从低电平到高电平的跃变时,U2a的与非门与C1-R1组成的电路将产生一个窄的低电平脉冲。

这个脉冲将影响移位寄存器从而载入记数器数据,并自动送入串 口。

同时,这个脉冲经U1b反转,这个高电平到低电平的跃变通过U2b、C2、R2后产生一个窄的高电平脉冲,此脉冲使记数器复位。

时序图如下所示,并非真实比例(实际上,红外信号 的周期远大于脉冲周期)这是两个不同的数据:这是两个相同的数据:2由图可见,给出允许的误差范围,程序就可以识别相同的数据。

疑难解析“我的接收装置无法区分同一遥控器的任意两个按键?”首先需要确认时钟电路的频率是否为19200Hz左右。

如果你无法获得信号,请试一下另外的软件,如SerialWatcher,并且改变时钟电路中微调电阻的阻值。

我的电路最后确定的阻值是15500欧,由于电子元器件的离散性,这个阻值会有所不同。

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

一、题目要求数字系统课程设计包括EDA实验板组装调试及红外遥控系统设计制作两个部分,各部分要求如下:红外遥控系统由发射编码和接收解码两个部分组成,本课程设计要求制作发射编码电路板(遥控器)以及编写程序在EDA实验板上实现接收解码,具体说明如下:1、发射编码部分发射编码部分要求使用指定的元器件在万用板上完成红外遥控器的制作,该部分电路原理图参照《PT2248数据手册》,制作前请详细阅读《红外遥控器制作说明》,制作时要求元器件在万用板上排列整齐,布局合理,焊接良好,各按键功能正常,均能发送编码。

2、接收解码部分接收解码用VHDL语言编写程序,在EDA实验板上实现解码,要求具有以下功能:(1)基本要求:(a)将一体化红外接收解调器的输出信号解码(12个单击键、6个连续键,单击键编号为7-18,连续键编码为1-6),在EDA实验板上用七段数码管显示出来;(b)当按下遥控器1—6号连续键时,在EDA实验板上用发光二极管点亮作为连续键按下的指示,要求遥控器上连续键接下时指示灯点亮,直到松开按键时才熄灭,用于区别单击键。

(c)EDA实验板上设置四个按键,其功能等同于遥控器上的1—4号按键,当按下此四个按键时七段数码管分别对应显示“1”、“2”、“3”、“4”。

(d)每当接收到有效按键时,蜂鸣器会发出提示音。

(2)扩展功能:(能完成的加分)通过遥控器跳线改变用户码,EDA实验板上用三个发光二极管正确显示发送端的用户码。

二、解题分析根据题目意思,此设计关键在于如何将接收器接收到的信号解码并显示。

这是本设计的难点所在。

其中解码的信号来源有两种,分别是:一、从键盘上直接按键输入。

二、从遥控器上按键以后将信号发射出去,然后键盘上的接收器将其接收。

这当中有一个优先权的问题,在本次设计中我将其设置为遥控器接收优先,即,当在按下键盘后,若此时遥控也按下则显示数码管优先显示遥控器按下的信号。

接收解码红外编码信号并成功解码以后,需要将解码出来的相应信息(用户码,连续键等)进行显示!经分析实际的电路原理图,发现在控制数码管显示只有一个4511去控制,这说明一次只能显示一个数码,因此如何显示两位数码是数码管控制的难点所在!这时应该编写一个专门的模块来解决这个问题。

三、设计方案为了实现题目中的要求,程序采用单进程并将系统划分为下列两个模块:一、接收编码信号及翻译模块二、输出显示模块各模块功能描述:接收编码信号及翻译模块:该模块的主要功能是接收从键盘或者从遥控器发出的信号,将其翻译成可以让CD4511用来控制数码管显示的编码。

输出显示模块:输出显示模块主要是对两个数码显像管的输出进行控制,该模块根据翻译出的BCD码,将此编码输入到CD4511驱动显像管循环显示。

系统结构框图:说明:1、CLK是的系统时钟信号。

2、DATAIN是38kHz一体化红外接收解调器输入到CPLD中的串行信号。

3、RESET是系统复位信号,高电平有效。

4、KEYIN4是小键盘输入的信号。

5、BIT指示选中的数码管6、NUM是数码管个位或十位的BCD码7、BEEP是控制蜂鸣器信号,根据电路原理图,其低电平有效8、USER是三位的用户码9、LED是LED灯控制信号,用来显示用户码和连续键注:两个模块间相连的CODE信号是翻译出来后的五位的BCD码。

详细设计思路:一、接收编码信号及翻译模块:(1)分析解码原理:(一)键盘输入解码:该模块中接收编码信号分为从键盘接收信号和从遥控器接收信号,本程序设置为从遥控器发射优先。

从键盘接收到的信号直接翻译对应的二进制编码然后再输出到显示模块。

(二)遥控器发射信号解码:如何解码是本次设计的关键。

发射端编码方式已经在“附录一”中给出,要接收发射端发射的编码最关键的地方是解决发射段频率和接收段频率不一致的问题。

发射端频率为38KHz,程序中设计的接收端频率为2.048MHz的2的8次方分频,分出来以后即为8KHz。

发射端每四个周期(4a)代表一个二进制编码,时间为1/38KHz*16*4=1.684ms,四个周期的时间换算成接收端周期数为 1.684ms/(1/8KHz)=13.47个。

一个a所占的周期数为13.47/4=3.37个,三个a共占的周期数为13.47/4*3=10.1个。

由于编码中一个周期的低电平代表“1”,三个周期的低电平代表“0”。

如下形式的1位的编码时分别表示“0”和“1”:1个a的低电平,3个a的高电平表示编码“0”3个a的低电平,1个a的高电平表示编码“1”再考虑到同步的问题,取(10.1+3.37)/2=6.7 7作为判断“0”、“1”的分界线,即当检测到连续收到等于或超过7个接收端周期的低电平后即可认为接收到的是“1”,否则为“0”。

以上就是解码的基本原理。

翻译出编码信号后根据编码的规则,分析用户码和所应显示的数字即可。

(2)解码的具体流程:从“附录一”中的说明可知,按下一个按键将会发送出去一串编码,而无论是连续信号还是单发信号,接收的波形中有用部分仅其中的十二位码,且其中的H、S1、S3位已经能名区分单发与连续信号,为节约资源,只需对接收信息中的十二位码进行编码即可。

而从接收到的波形图可看出,仅当接收有编码时才有低电平,其余时间均为高电平。

这样就可从低电平开始,对BIT‘0’和BIT‘1’进行编码。

而BIT‘0’和BIT‘1’的区别在于其占空比不同,可以考虑用这样一个计数器cnt1:在低电平时被启动开始计数,当计数器的输入变为高电平时停止计数,这时可以比较计数值的大小。

根据以上“分析解码原理”中分析可知:当计数值大于或等于7时编码为“1”,否则编码为“0”。

这样便完成一位编码的接收,照此方法继续接收其他编码。

当接收到的编码位数满足12位时,表明按下一个键发射的编码已被解码完毕,此时即可输出一串完整的翻译后的编码。

这就需要一个计数值上限为12的计数器cnt2来指示接收到的编码位数,以此来控制编码的输出。

当接收到一个有效按键后在显示的同时还需要用响铃来提示,可以考虑预设一个上限值为常量的计数器cnt3来控制响铃时间。

本程序用状态机来完成这些功能,其ASM图如下,图中各个状态的说明如下:S0:复位等待状态,键盘输入状态,低电平检测计数器cnt1、编码位数计数器cnt2和响铃时间计数器cnt3清零,12位移位寄存器清零,响铃标志位输出为低电平。

因为设置为遥控器接收优先,所以此时若接收到遥控器发射的信号则转入遥控器发射信号解码状态,否则就进行键盘输入解码。

S1:接收信号有低电平,转入S2状态低电平检测计数器开始计数,否则继续检测是否有低电平。

S2:低电平检测计数器cnt1开始计数,检测低电平时间长度,当检测到输入信号为高电平时,计数器停止工作并转入下一状态。

S3:编码位数计数器cnt2加‘1’,计算已收到多少位编码。

并且以7为分界线,检测到输入信号为BIT‘1’,则12位移位寄存器向前移一位,最低位并入一个‘1’;检测到输入信号为BIT‘0’,则12位移位寄存器向前移一位,最低位并入一个‘0’。

当编码计数器达到计数上限12,表明已经接收到一个完整的12位编码,跳入下一状态开始译码。

S4:译码部分,对解码之后的信号进行相应的译码输出。

ACTION:响应状态,接收并翻译完一个按键信号后,指示器开始作出响应:单击/连续指示器信号输出,用户码输出,响铃计数器cnt3开始计数直到预设值才停止。

然后复位。

(3)ASM图:(4)模块源程序:--ANAL YZE.VHDlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity analyze isport (clk : in std_logic; --时钟信号datain : in std_logic; --串行输入信号reset : in std_logic; --复位信号keyin4 : in std_logic_vector(3 downto 0); --键盘输入信号code : out std_logic_vector(4 downto 0); --解码后的编码,可输入CD4511显像led : out std_logic; --彩灯控制信号,用于区分单击/连续键user : out std_logic_vector (2 downto 0); --用户端信号beep : out std_logic ); --蜂鸣信号end analyze;architecture behav of analyze istype statetype is (s0, s1, s2, s3, s4,action);signal state : statetype ;constant beeptime : integer := 80 ;beginst: process (clk,datain)variable cnt1,cnt2,cnt3 : integer range 0 to 30; --定义三个计数器:cnt1是收到0的个数variable reg : std_logic_vector(11 downto 0); --cnt2是收到1的个数cnt3控制响铃时间variable temp : std_logic_vector (4 downto 0);variable templed : std_logic;begin---------------------------------------------------------------------------------------------------------------------- -- 检测键盘输入和开始远程端接收部分,设置为遥控发射器优先if reset= '1' then --复位,进入s0状态state <= s0; code <= "00000"; led <= '1'; user <="111";elsif rising_edge (clk) thencase state iswhen s0 =>if datain = '0' thenreg:="000000000000"; templed:= '1'; temp:="00000"; --若接收到遥控器发出的低--电平即开始启动计数器cnt1:=0; cnt2:=0; cnt3 := 0; --计数器、寄存器和数据暂存器清零state <= s1;elsif keyin4 = "0111" then --当键盘输入为"1"时code <= "00001"; beep<='1'; led <= '1'; user <="111";elsif keyin4 = "1011" then --当键盘输入为"2"时code <= "00010"; beep<='1'; led <= '1'; user <="111";elsif keyin4 = "1101" then --当键盘输入为"3"时code <= "00011"; beep<='1'; led <= '1'; user <="111";elsif keyin4 = "1110" then --当键盘输入为"4"时code <= "00100"; beep<='1'; led <= '1'; user <="111";elsestate <= s0;beep<='0';led <= '1';end if;---------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------- --译码部分,检测发射端的发射信号when s1 => --扫描发射器是否有输出低电平if datain = '0' then --如果收到低电平那么转到s2状态并启动计数器cnt1 state <= s2;elsestate <= s1; --否则继续检测end if;---------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------when s2 =>if datain = '0' then --收到一个低电平就计数一次cnt1:=cnt1 + 1;state <= s2;elsif datain='1' then --如果收到一个高电平表明收到一位数此时停止计数器cnt1 state <= s3; --并进入状态2启动计数器cnt2,开始计已收到多少位数end if;---------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------when s3 =>cnt2:=cnt2 + 1; --cnt2计算已收到多少位数--以7为分界线,区分出收到的数是0还是1 if cnt1 < 7 then --如果收到的低电平数少于7个则表明收到的是0reg:=reg(10 downto 0) & '0'; --此时将0存入12位的移位寄存器中else --若收到的低电平数大于或等于7,则收到的是1reg:=reg(10 downto 0) & '1'; --此时将1存入12位的一位寄存器中end if;if cnt2 = 12 then state <= s4; --如果计数器cnt2的计数值为12,--表明已经接收完一个发射码else cnt1:= 0 ; --否则将cnt1清零以后继续检测收到的数state <= s1;end if;---------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------- --译码部分,对译码之后的信号进行相应的译码输出when s4 =>beep <= '1' ;case reg(8 downto 0) iswhen "100100000" =>temp := "00001";-- 1when "100010000" =>temp := "00010";-- 2when "100001000" =>temp := "00011";-- 3when "100000100" =>temp := "00100";-- 4when "100000010" =>temp := "00101";-- 5when "100000001" =>temp := "00110";-- 6when "010100000" =>temp := "00111";-- 7when "010010000" =>temp := "01000";-- 8when "010001000" =>temp := "01001";-- 9when "010000100" =>temp := "10000";--10when "010000010" =>temp := "10001";--11when "010000001" =>temp := "10010";--12when "001100000" =>temp := "10011";--13when "001010000" =>temp := "10100";--14when "001001000" =>temp := "10101";--15when "001000100" =>temp := "10110";--16when "001000010" =>temp := "10111";--17when "001000001" =>temp := "11000";--18when others =>temp := "00000";end case;user <= reg(11 downto 9); --移位寄存器的前三位是用户码templed := not reg(8); --可以用12位接收码的第4位(H)作为连续键的标志state <= action ; --位来区分其他单击键,将其取反后作为连续键指示灯的输入---------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------when action => --响应状态led <= templed; --led信号输出给连续键指示灯控制其亮灭code <= temp;cnt3 := cnt3+1; --每翻译出一个码,响铃计数器cnt3就计数一次if cnt3 = beeptime then --计数到设定的时间后,铃声不再响跳到初始状态beep <= '0'; --检测下帧数据(一帧数据是12位码)state <= s0 ;elsestate <= action ;end if;when others =>state <= s0;end case;end if;end process st;end behav;(5)仿真图:a)键盘直接输入(遥控器不按下时)的仿真图:由上图可知,当顺序循环按下键盘上的1~4号按键时,可以看到经解码模块解码后得到的对应输出编码分别为“00001”,“00010”,“00011”,“00100”;响铃信号为高电平,铃响;单击/连续指示信号为低电平,灯不亮。

相关文档
最新文档