课程设计学习型红外遥控器的设计.docx
《课程设计学习型红外遥控器的设计.docx》由会员分享,可在线阅读,更多相关《课程设计学习型红外遥控器的设计.docx(22页珍藏版)》请在冰豆网上搜索。
课程设计学习型红外遥控器的设计
河南大学物理与电子学院
学习型红外遥控器的设计
河南大学物理与电子学院
电子开放实验室
学习型红外遥控器设计
1设计要求及原理
利用单片机作为控制核心,要求可以学习不同遥控器的某个按件功能。
使用时先用原遥控器对着学习器按一下某操作键,学习器就可实现原遥控器中该键的遥控功能。
具体要求如下:
基本部分:
(1)最大学习码长:
206位。
(2)学习码识别范围:
起始位为15us~983ms,编码位为15us~3.825ms。
(3)读码误差:
±15us。
扩展部分:
学习型红外遥控器在按下K键待绿色指示灯亮后,用遥控器对着红外接收头按下某个功能键,当绿灯灭说明学习完毕,再按发射键就可以进行遥控操作。
当红外遥控器的某个按键按下时,发射出一组串行二进制遥控编码脉冲。
该脉冲由引导码、系统码、功能码和反码组成,通过设置这些编码以及码长便可区分不同的红外遥控器。
红外接收器负责红外信号的接收和放大并解调出TTL电平信号送至微处理器进行处理,微处理器通过比较和识别接收来的红外遥控编码便可执行相应的遥控功能[1]。
本系统的设计思想是不考虑红外编码方式,仅利用单片机AT89C52对多个红外遥控编码的脉冲宽度进行测量,并原封不动地把发射信号中高、低电平的时间宽度记忆至扩展存储区的指定地址。
当要发射红外信号时,从扩展存储区中还原出相应的红外遥控编码,并调制到40KHz的载波信号上,最后,通过三极管放大电路驱动红外发光二极管发射红外信号,达到学习和发射的目的,从而实现一个遥控器控制多种红外遥控设备。
2方案论证与对比
2.1方案一简易红外遥控电路
在不需要多路控制的应用场合下,可以使用由常规电路组成的单通道红外遥控电路[1]。
这中遥控电路不需要使用较贵的专用便译码器,因此成本较低。
图1方案一系统方框图
考虑到本方案电路是简单的单通道控制器,可直接产生一个控制功能的震荡频率,再通过红外发光二极管发射出去。
当红外接收头接收到控制频率时,由一个电路对其进行产生相应的控制功能。
2.2方案二利用STC89C52单片机控制电路
用单片机制作一个红外遥控器,并可通过程序控制记忆按键功能,达到学习记忆功能。
控制器
STC89C52
红外线
发射电路
红外线接收解码器
学习指示灯
遥控指示灯
操作键
图2方案二系统方框图
当按下遥控器按钮时,单片机产生相应的控制脉冲,由红外发光二极管发射出去。
当红外就收器接收到控制脉冲时,经单片机处理由显示设备显示出当前受控电器的序号,并判断是否对某一功能进行的操作。
2.3方案对比与选择
以上方案:
方案一未采用单片机,功能过于单一,仅能对一路电器进行简单遥控;方案二不仅可以用控制按键实现对电器的控制,而且可记忆学习按键功能,达到复制的功能,方便使用,且成本设计用STC89C52也比较便宜实用。
显然本设计采用方案二作为设计蓝本。
3遥控器硬件与程序设计
3.1遥控器硬件结构组成
为了实现遥控码的记录还原功能,系统应具有红外线的接收解码、红外线的调制发射、操作按键和功能控制单元。
由于功能定位学习一个遥控按键的遥控的功能,因此决定采用STC89C52RC单片机作为控制器。
STC89C52RC单片机中具有256字节的内存单元,可存储遥控码脉宽的数据。
遥控码的脉宽数据可以用红外线接收解码后送单片机读入,发射时由单片机产生40kHz红外调制信号送红外线发管发射。
学习型红外遥控器由红外接收电路、单片机控制器、红外发送电路、E
PROM存储器、操作键盘及LED遥控指示灯构成,如图2所示。
单片机STC89C52构成红外遥控的处理器,其数据存储器RAM(258B)用来存储学习过程中编码信号的脉冲宽度和编码。
(1)红外发射电路[5]:
40kHz方波直接由单片机模拟产生,经过三极管放大后,驱动红外发光二极管(注意:
40kHz载波不能用STC89C52定时器产生,因为40kHz载波信号的周期只有26μs,考虑到有载波时的占空比为1/3,即定时器的最小中断时间间隔只有8μs,在执行中断时中断处理过程(如保护现场等)实际运行时间根据中断点的不同需要的时间也不同,有时会大于8μs,这样不能保证40kHz信号的稳定性),在软件处理过程中应用延时程序模仿40kHz的红外载波信号。
(2)红外接收头:
在与单片机连接时,将接收来的红外遥控信号反相,其正向信号接外部中断0,反相信号接外部中断1。
通过记录2个中断间的间隔时间来测量红外遥控信号的高低电平的脉宽值。
(3)外接EPROM存储器:
用于存放学习到的控制命令的编码和高低电平信号的脉宽值。
(4)按键盘:
启动一个学习过程。
(5)LED指示灯:
用于显示遥控器的工作状态。
3.2系统硬件电路设计
【附录1】为该学习型遥控器的原理图,其中:
P1.0口接遥控码发射按键;
P1.6口用作状态指示,绿灯亮代表学习状态,绿灯灭代表码已读入。
P1.7口用于指示控制键的操作,闪烁时代表遥控码正在发射之中,在学习状态,绿灯灭代表码已读入。
第9脚为单片机的复位脚,采用简单的RC上电复位电路,
第12脚为中断输入口,用于工作方式的转换控制,当
脚为低电平时,系统进入学习状态。
第14脚用于红外线接收头的输出信号输入,
第15脚作为遥控码的输出口,用于输出40KHz的遥控码。
第18、19脚接12MHZ晶振。
由于采用最小化应用系统,控制线
(片外取指控制)、ALE(地址锁存控制)不用,
(片外存储器选择)接高电平,使低8K的E2PROM地址(0000H-1FFFH)指向片内。
3.3初始化程序
内容包括P0、P1、P3端口置位,P2口清零,清08H—6EH共103个工作寄存器,设置堆栈基址(70H),设置计数器计数模式、控制字,开外中断允许等等。
3.4遥控器读入程序处理
完成遥控码起始位的识别、脉宽计数功能,完成遥控码编码位的宽度计数功能,完成结束位的认别功能(流程图见图3)。
本程序模块在编程设计中非常重要,通过大量的不同种类的遥控码波形实验测试分析,遥控码的帧间歇位宽度均在10ms以上,起始位码宽度在100μs—20ms之间,编码位在100μs—5ms之间,为确保所有遥控器学习的成功,采用以下设计方法:
寻找起始位方法:
用16位DPTR计数器对高电平进行宽度计数,计数采样周期为21μs,当高电平结束时,如高8位计数器为非零,则说明高电平宽度超过5.35ms(255×21μs),紧接来的低电平码就是起始位,否则重新开始。
读起始位方法[3]:
采用16位DPTR对低电平进行宽度计数(最大可读宽度为1.376s),当高电平跳变时结束计数,并将DPTR的高8位、低8分别存入R4,R5寄存器。
读遥控编码的方法:
采用DPTR低8位计数器对码(高电平或低电平)进行宽度计数,电平跳变时结束计数,并将值存入规定的地址,在高电平码计数时,如DPTR高8位计数器为非零(宽度大于5.35ms),则判定为结束帧间隔位,在相应存储单元写入数据#OOH作为结束标志。
3.5遥控码发送处理程序
利用计数器计数中断功能,实现40KHz载波的发送,利用接收时接收的低电平位时间控制载波的发送时间。
3.6主程序
主程序在上电初始化后进行端口按键扫描,当确认有键按下时将编码发出去(见图3流程图)。
3.7程序延时
主要用于读键时消抖。
时间约为1ms。
4系统功能调试及整体指标分析
4.1程序调试
调试学习状态和发射状态下计数器的循环间隙时间是C程序中较为重要的内容,在汇编语言下可以精确地算出循环时间,这样在C编程时能在E磁盘目录下产生1个REMOTE.ASM的汇编源程序[4],在汇编程序清单中可以精确地算出循环时间,这样才能保证读入时的脉宽与发射时的脉宽一样,另外,也可以通过示波器观察比对原遥控器解码波形及学习器产生的波形,结合调试循环延时的间隔达到精确还原脉宽的目的。
4.2整体指标分析
学习型遥控器的设计性能及实现与其软件设计编写具有密切的关系,在设计中采用内部定时器对信号高低电平计时的方法来采集数据并保存。
当系统识别到起始码的低电平时,系统启动内部定时器对输入低电平计时,当起始码的低电平结束时保存定时器此时的值,记录下起始码的低电平信号脉冲宽度值;然后依次保存采集到的编码信号脉冲宽度值,如果采集到编码信号位数大于设定值M(程序中设定值),就认为编码采集已经结束,即学习子程序结束。
在软件设计过程中,使用了2个外部中断和2个内部定时器,外部中断0启动定时器0停止定时器1计数并保存定时器1的数据,外部中断1启动定时器1停止定时器0计数并保存定时器0的数据,用定时器0记录红外解调信号的高电平时长。
用定时器1记录红外解调信号的低电平时长,本文采用12MHz晶振,1个机器周期是1μs,计数器采用16位计数器。
如果在外部中断0和外部中断1之间不发生内部定时器中断,可以记录的最大时间间隔为65.5ms;如果在外部中断0和外部中断1之间发生内部定时器中断则可以记录的最大时间间隔是n×65.5ms,其中n为中断次数。
其值保存在设定的数据存储器中,然后写入到外部E
PROM存储器中。
发射过程再从外部的E
PROM存储器读出,通过用软件模仿40kHz载波信号发送编码信息。
在设计过程中研究发现:
尽管遥控器存在帧格式多样、码型多样、编码长短不同、发送方式不同等问题,但对于某一个独立的遥控器还是有规律可依的。
在系统设计方案时,选择通用性好的就能解决这个问题。
例如测得一款遥控器的1个命令码如下:
低电平(有红外发送载波)信号码时长数据是:
0x73680x05780x05770x05630x05550x05840x05640x05450x05720x0554……
高电平(无红外发送载波)信号码时长数据是:
0x05780x13770x05630x05550x13840x05640x05450x13820x05540x01345……
尽管码型有帧头、系统码、操作码、同步码、帧间隔码、帧尾,但不论是低电平(有红外发送载波)信号码时长或是高电平(无红外发送载波)信号码时长其结构都相对简单。
但是1个帧如此多的数据占据了大量的内存空间,增加了硬件成本和程序运行时间,有必要在数据分析的基础上采取数据压缩。
数据压缩根据使用场合和要求的不同分有损和无损压缩。
为了在数据发送时准确再现接收到的红外数据,本文采用无损压缩的方法,使用的编码方式是改进型的游程编码,根据游程编码的原理,游程长度(游程或游长)RL(Run-Length)指的是由信号采样值构成的数据流中各个数据重复重现的长度,只要给出重复的数据、数据长度和位置就可以恢复原来的数据流[2-3]。
其具体实现过程如下:
(1)在接收红外信号时分别按高电平和低电平不同的时间长度编号(时间长度规定一定的误差范围)[2],每1次测得的数据根据电平持续时间记录其编号,再将同编号的数据相加求平均值作为标准时间长度,根据红外信号格式的不同,可以选择4bit压缩方式和2bit压缩方式,即压缩比达到1/4和1/8。
在接收红外数据时采用的是中断方式,不占用过多的CPU时间,还可以一边学习一边存入E
PROM以达到节省内存空间的目的。
将上述遥控器的1个命令码(其中红外编码长度为150bit,压缩比为1/8)的数据存储在E
PROM中的数据格式如下:
01100101……(共10个字节低电平数据);11010101……(共10个字节高电平数据);0x96(字节总长度);0x13770x05600x05720x370(4个不同的时长);
(2)发送红外数据时,先从E
PROM中读出字节总长度、4个不同的时长及部分高低电平数据,在发送高电平时(即不发送红外载波信号)且时长大于1ms,再读E
PROM数据,这样更可以节省内存空间。
单键学习型遥控器可以学习任何遥控器的某个按键功能,采用最小化应用模式设计,电路简单,可靠性高,尤其是通过大量不同遥控码的特征分析,在遥控码的读入时选择了最佳采样频率,使遥控码的学习成功率大大提高,其技术可应用于多媒体教室、家庭集中控制器等设备。
使用时先按一下K,待绿色指示灯亮后,用遥控器对着红外接收头,按一下某个功能按键,当绿灯灭且红灯亮时说明学习完成,按发射键就可以进行遥控了。
5详细仪器清单
表格仪器清单
仪器名称
数量
STC89C52
1
电阻(1k)
6
电阻(10R)
1
发光二极管(红)
1
发光二极管(绿)
1
红外接收头
1
红外发射二极管
1
电容(33pf)
2
电容(104pf)
1
三极管(9015)
3
晶振(12Mhz)
1
按钮开关
3
Lcd1602
1
6总结、思考与致谢
本系统是以单片机STC89C52芯片为核心部件,实现遥控器学习并记忆按钮遥控功能。
此次在软件上是花费时间最多的,我们上网找资料,上图书馆,尽可能的了解有关于学习型遥控器这方面的知识。
通过这次毕业设计,使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。
使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧(特别是汇编语言)的掌握方面都能向前迈了一大步。
通过本次毕业设计,我们获得了丰富的理论知识,极大地提高了实践能力,单片机领域这对我们今后进一步学习计算机方面的知识有极大的帮助。
同时,因为学习知识的能力和时间有限,因此在本次的课程设计过程中,难免存在错误,恳请老师给以批评和指正,在此,衷心感谢老师以及许多同学的指导和支持。
参考文献
[1]沈红卫编著.单片机应用系统设计实例与分析[M].北京:
北京航空航天大学出版社,2002
[2]朱定华,戴汝平编著.单片微机原理与应用[M].北京:
清华大学出版社,2003
[3]胡汉才编著.单片机原理及接口技术[M].北京:
清华大学出版社,2004
[4]谭浩强编著.C程序设计(第三版)[M].北京:
清华大学出版社,2005
[5]楼然苗,李光飞编著.单片机课程设计指导[M].北京:
北京航空航天大学出版社,2007
附录1:
单键学习型红外遥控器原理图(proteus仿真):
另:
在单键遥控的基础上,添加了lcd1602液晶显示的拓展。
给元器件上电后,lcd1602会显示预设的字幕(字幕根据需要可自行设计),按下学习键后,等候学习遥控器发射的红外编码,学习成功后,字幕自动变换成另外的字幕(也是预设的字幕)。
其中lcd1602引脚连线如下proteus仿真图所示:
附录2:
单片机汇编程序:
/*********学习型红外遥控器汇编程序(包括lcd1602显示)*********/
LCDINIT1:
MOVA,#01H;清屏
LCALLBUSY
LCALLWRTC
LCALLDELAY0
MOVA,#01H;清屏
LCALLBUSY
LCALLWRTC
LCALLDELAY0;延时15ms
LCALLDELAY0
LCALLDELAY0
MOVA,#38H;显示模式设置(8位数据线,16*25*7点阵)
LCALLWRTC
LCALLDELAY0;延时5ms
MOVA,#38H
LCALLBUSY
LCALLWRTC
MOVA,#08H
LCALLBUSY
LCALLWRTC
MOVA,#01H;清屏
LCALLBUSY
LCALLWRTC
MOVA,#06H;显示光标移动设置
LCALLBUSY
LCALLWRTC
MOVA,#0CH;示开关控制,显示开,无光标,不闪烁。
LCALLBUSY
LCALLWRTC
MOVA,#0EH;写CGRAM地址.
LCALLBUSY
LCALLWRTC
MOVR2,#0FH
MOVDPTR,#TAB5;写CGRAM字模.
LCALLBUSY
LCALLWRTD
RET
DELAY4:
MOVR3,#20;延时0.2秒
LCDMAIN1:
MOVA,#0C0H;显示开及光标设置
LCALLBUSY
LCALLWRTC
MOVR2,#08H
MOVDPTR,#TAB6
LCALLDELAY0
LCALLWRTD
LCALLDELAY01
LCALLDELAY01
LCALLFLASH
MOVA,#80H;显示开及光标设置
LCALLBUSY
LCALLWRTC
MOVR2,#0FH
MOVDPTR,#TAB5
LCALLDELAY0
LCALLWRTD
LCALLDELAY01
LCALLDELAY01
RET
LCDINIT:
LCALLDELAY0;延时15ms
LCALLDELAY0
LCALLDELAY0
MOVA,#38H;显示模式设置(8位数据线,16*25*7点阵)
LCALLWRTC
LCALLDELAY0;延时5ms
MOVA,#38H
LCALLBUSY
LCALLWRTC
MOVA,#08H
LCALLBUSY
LCALLWRTC
MOVA,#01H;清屏
LCALLBUSY
LCALLWRTC
MOVA,#06H;显示光标移动设置
LCALLBUSY
LCALLWRTC
MOVA,#0CH;示开关控制,显示开,无光标,不闪烁。
LCALLBUSY
LCALLWRTC
MOVA,#40H;写CGRAM地址.
LCALLBUSY
LCALLWRTC
MOVR2,#40H
MOVDPTR,#TAB3;写CGRAM字模.
LCALLBUSY
LCALLWRTD
;***************初始化*****************
LCDMAIN:
MOVA,#80H;显示开及光标设置
LCALLBUSY
LCALLWRTC
MOVR2,#04H
MOVDPTR,#TAB1
LCALLDELAY0
LCALLWRTD
MOVA,#0C0H;显示开及光标设置
LCALLBUSY
LCALLWRTC
MOVR2,#04H
MOVDPTR,#TAB2
LCALLDELAY0
LCALLWRTD
LCALLDELAY01
LCALLDELAY01
MOVA,#01H;清屏
LCALLBUSY
LCALLWRTC
MOVA,#80H;显示开及光标设置
LCALLBUSY
LCALLWRTC
MOVR2,#0CH
MOVDPTR,#TAB4
LCALLDELAY0
LCALLWRTD
LCALLDELAY01
LCALLDELAY01
MOVA,#0c4H;显示开及光标设置
LCALLBUSY
LCALLWRTC
MOVR2,#08H
MOVDPTR,#TAB7
LCALLDELAY0
LCALLWRTD
LCALLDELAY01
LCALLDELAY01
RET
;***************写命令子程序*****************
WRTC:
CLRRS
CLRRW
CLRE
MOVP0,A
LCALLDELAY0;延时5ms
SETBE
LCALLDELAY0;延时5ms
CLRE
RET
;*****************写数据子程序***************
WRTD:
MOVR1,#00H
AGAIN:
MOVA,R1
MOVCA,@A+DPTR
SETBRS
CLRRW
CLRE
MOVP0,A
LCALLDELAY0
SETBE
LCALLDELAY0
CLRE
INCR1
MOVA,R1
MOVB,R2;数据写完没有.
CJNEA,B,AGAIN
RET
;*****************判忙子程序******************
BUSY:
PUSHACC
CLRRS
SETBRW
TT0:
SETBE
MOVA,P0
CLRE
ANLA,#80H
JNZTT0
POPACC
RET
TAB1:
DB00H,01H,02H,03H
TAB2:
DB04H,05H,06H,07H
TAB3:
DB03H,07H,0fH,1FH,1FH,1FH,1FH,1FH
DB18H,1EH,1FH,1FH,1FH,1FH,1FH,1FH
DB07H,1FH,1FH,1FH,1FH,1FH,1FH,1FH
DB10H,18H,1cH,1EH,1EH,1EH,1EH,1EH
DB0FH,07H,03H,01H,00H,00H,00H,00H
DB1fH,1FH,1FH,1FH,1FH,0FH,07H,01H
DB1fH,1FH,1FH,1FH,1FH,1CH,18H,00H
DB1CH,18H,10H,00H,00H,00H,00H,00H
TAB4:
DB"DESIGNEDBY:
"
TAB5:
DB"FLASHLEDSHOWS!
"
TAB6:
DB"IT'SOK!
"
TAB7:
DB"LIU&FU!
"
DELAY0:
MOVR6,#10
D1:
MOVR7,#250
DJNZR7,$
DJNZR6,D1
RET
DELAY01:
MOVR3,#255
D2:
MOVR4,#255
DJNZR4,$
DJNZR3,D2
RET
FLASH:
SETBP2^0
LCALLDELAY01
LCALLDELAY01
CLRP2^0
SETBP2^1
LCALLDELAY01
LCALLDELAY01
CLRP2^1
SETBP2^2
LCALLDELAY01
LCALLDELAY01
CLRP2^2
SETBP2^3
LCALLDELAY01
LCALLDELAY01
CLRP2^3
LCALLFLASH
RET
FLASH1:
SETBP2^0
LCALL