基于C51的红外线解码.docx
《基于C51的红外线解码.docx》由会员分享,可在线阅读,更多相关《基于C51的红外线解码.docx(21页珍藏版)》请在冰豆网上搜索。
基于C51的红外线解码
课题:
红外解码课程设计
前言
传统的遥控器大多数采用了无线电遥控技术,但是随着科技的进步,红外线遥控技术的成熟,红外也成为了一种被广泛应用的通信和遥控手段。
继彩电、录像机之后,在录音机、音响设备、空调机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
所以采用单片机进行遥控系统的应用设计,遥控装置将同时具有编程灵活、控制范围广、体积小、功耗低、功能强、成本低、可靠性高等特点,因此采用单片机的红外遥控技术具有广阔的发展前景。
本设计主要研究并设计一个基于单片机的红外接收系统,并实现对电视遥控器的解码及编码值显示。
控制系统主要是由51系列单片机、电源电路、红外遥控器发射、红外接收电路、数码管显示电路等部分组成,红外接收头接收到的编码信息通过单片机处理,单片机根据不同的遥控器按键信息进行处理并在数码管上相应的显示相应的按键值编码信息以加深对红外编码的理解。
第1章红外解码系统分析
第1节 设计要求
整个控制系统的设计要求:
被控设备的控制实时反应,从接收信号到信号处理及对设备控制反映时间应小于1s;整个系统的抗干扰能力强,防止误操作;整个系统的安装、操作简单,维护方便;成本低。
红外载波、编码电路设计要求:
单片机定时器精确产生38KHz红外载波;根据控制系统要求能对红外控制指令信号精确编码并迅速发送。
红外解码电路设计要求:
精确接收红外信号,并对所接收信号进行解码、放大、整形、解调等处理,最后输出信号;对非红外光及边缘红外光抗干扰能力强。
设备扩展模块设计要求:
直流控制交流;抗干扰能力强;反应迅速不产生误动作;能承受大电流冲击。
第2节总体设计方案
2.1方案论证
(一)单片机控制器模块
方案一:
采用目前比较通用的51系列单片机。
此单片机的运算能力强,软件编程灵活,自由度大,市场上比较多见价格便宜且技术比较成熟容易实现。
方案二:
采用16位单片机SPCE061A作为控制核心。
与51单片机相比,SPCE061A具有更加丰富的资源,有32个可编程的I/O口,14个中断源。
但考虑到本设计没有用到如此多资源且价格贵,市场比较少见,技术不稳定。
综合分析考虑,选择方案一。
(二)红外解码电路的比较
方案一:
采用单片机加专用解码芯片
其优点是软件设计简单,但增加了外围电路的设计,使得单片机的I/O口的减少不利于多路开关电路的扩展。
方案二:
采用单片机软件解码
其外围电路简洁,空出的I/O口多,利于单片机扩展多路开关电路的设计,而编程就会复杂些。
根据实际情况进行选择,采用方案二。
2.2总体设计框图
经过上述方案的分析选择,得出系统硬件由以下几部分组成:
电视红外遥控器,51单片机最小系统,接收放大于一体集成红外接收头,数码管显示电路。
整体设计思路为:
根据扫描到不同的按键值转至相对应的ROM表读取数据。
确认设备及菜单选择键后89S512单片机从ROM读取出来的值,按照数据处理要求从P3.3输出控制脉冲与T0产生的38KHz的载波(周期是26.3μs)进行调制,经NPN三极管对信号放大驱动红外发光管将控制信号发送出去。
红外数据接收则是采用HS0038一体化红外接收头,内部集成红外接收、数据采集、解码的功能,只要在接收端INT0检测头信号低电平的到来,就可完成对整个串行的信号进行分析得出当前控制指令的功能。
然后根据所得的指令去操作相应的用电器件工作,如图1-1所示。
图1-1电路设计整体框图
第3节方案的可行性论证
实用性:
本系统具有实时性、灵活性、稳定性、以及多功能同时控制等优点,方便用户对多个设备进行控制。
经济可行性:
对于有多个红外遥控家电的用户来说,可通过识别已存储在ROM中的信号,实现以现有的单一红外信号,同时对任意红外遥控家用电器进行控制,由于节约了实现控制功能的多个遥控硬件,从而减少了用户的投资。
技术可行性:
单片机对数据进行处理,采用一体红外接收头对红外信号放大、解码、信号输出显示。
整个系统的设计要求抗干扰能力强,防止误动作;安装、操作简单,维护方便;总体成本低。
总体设计经过综合分析论证采取最优方案。
系统硬件由以下几部分组成:
红外遥控器,单片机最小系统,集成红外接收头,共阳数码管。
第2章红外解码硬件电路设计
第1节单片机及其硬件电路设计
1.1单片机的介绍
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8K字节Flash,256字节RAM,32位I/O口线,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
图2-1AT89S52引脚图
1.2时钟电路及RC复位电路
AT89S52芯片内部有一高增益反相放大器,用于构成振荡器反相放大器的输入端为XTAL1,输出端为XTAL2。
在XTAL1、XTAL2(第19、18引脚)两端接一个石英晶体振荡器,和两个电容就构成了稳定自激谐振电路。
晶振频率为11.0592MHz,C12、C13是两个瓷片电容,与晶振Y2构成了自激谐振电路。
其电容的作用主要是对频率进行微调,一般取30~45pF左右。
使用该电路可产生稳定的11.0592MHz频率,受外界的环境的干扰影响非常小。
其接法如图2-2所示:
图2-2晶振电路
复位是单片机初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元执行程序。
除了进入系统的正常初始化之外,当程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需要按复位键重新启动。
复位操作有上电自动复位和按键手动复位两种方式。
本设计采用了按键手动复位方式。
该复位电路如图2-3所示。
复位电路采用了按键与上电复位。
上电与按键均可以有效复位。
上电瞬间RST引脚获得高电平,单片机复位电路随着电容的C11的充电,RST引脚的高电平逐渐下降。
RST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。
按键复位是直接将高电平通过电阻R11、R10分压到达RESET引脚,实现复位操作。
图2-3复位电路图
第2节红外遥控器电路
2.1采用TC9012芯片编码的遥控器
TC9012是一块用于东芝系列红外遥控系统中的专用发射集成电路,采用CMOS工艺制造。
它可外接32个按键,提供8种用户编码,另外还具有3种双重按键功能。
TC9012的管脚设置和外围应用线路都进行了高度优化,以配合PCB的布图和低成本的要求。
图2-4TC9012引脚图
低压CMOS工艺制造,低功耗超小静态电流,低工作电压,精简条指令码,8种用户编码可选择,TSOP-20、SOP20、COB可选的封装形式。
应用范围:
电视机、组合音响设备、录音卡座、VCD、DVD播放机。
2.2红外发射电路
将脉冲编码信号调制在载波振荡器产生的载波上(也称脉码调制),然后用这脉码调制信号去驱动红外发光二极管,以发出经过调制的红外光波,其红外遥控系统电路如图2-5所示。
图2-5红外遥控系统电路框图
通常,红外遥控器将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去。
二进制脉冲码的形式有多种,其中最为常用的是PWM码(脉冲宽度调制码)和PPM码(脉冲位置调制码)。
前者以宽脉冲表示1,窄脉冲表示0。
后者脉冲宽度一样,但是码位的宽度不一样,码位宽的代表1,码位窄的代表0。
脉宽为0.56ms、间隔0.565ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.56ms、间隔1.69ms、周期为2.25ms的组合表示二进制的“1”。
如图2-6示。
本设计是以PPM码(脉冲位置调制码)对红外数据的发送进行论证。
图2-6指令脉冲图
遥控编码脉冲信号是由引导码、系统码、系统反码、功能码、功能反码等信号组成。
引导码也叫起始码,由宽度为4.5ms的高电平和宽度为4.5ms的低电平组成(不同的红外家用设备在高低电平的宽度上有一定区别),用来标志遥控编码脉冲信号的开始。
如图2-7所示。
图2-7信号引导码图
系统码也叫识别码,它用来指示遥控系统的种类,以区别其它遥控系统,防止各遥控系统的误动作功能码也叫指令码,它代表了相应的控制功能,接收机中的可根据功能码的数值完成各种功能操作。
系统反码与功能反码分别是系统码与功能码的反码,反码的加入是为了能在接收端校对传输过程中数据是否产生差错。
脉冲位置表示的“0”和“1”组成的32位二进制码,前16位控制指令,控制不同的红外遥控设备。
而不同的红外家用电器又有不同的脉冲调控方式,后16位分别是8位的功能码和8位的功能反码。
串行数据码时序图如2-8所示。
图2-8串行数据码时序图
将要发送的指令脉冲编码信号调制在38KHz的载波上,可以增加信号的抗干扰能力,提高信号传输效率。
信号调制时序如2-9所示。
图2-9信号调制图
TC9012作为红外遥控器控制核心,遥控编码脉冲信号是由引导码、系统码、系统反码、功能码、功能反码等信号组成。
以PPM码(脉冲位置调制码)对红外数据调制在38KHz的载波上对外进行发射信号。
图2-10红外遥控器实物图
第3节红外接收显示电路
硬件电路组成有:
红外接收电路、电源电路、共阳数码管显示。
3.1红外接收电路
HS0038是用于红外遥控接收的小型一体化接收头,集成红外线的接收、放大、解调,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输,中心频率38.0kHz。
接收器对外只有3个引脚:
OUT、GND、VCC与单片机接口非常方便。
图2-11HS0038实物图
1脚接电源(+VCC),2脚GND是地线(0V),3脚脉冲信号输出,经非门U6缓冲与P24的判断信号进行逻辑与使得进入INT0的信号恰好是红外数据发射电路输出端P25的相反相信号,只要检测到INT0信号下降沿从而测出控制指令的功能。
图2-12HS0038内部结构工作流程
HS0038接收原理:
红外线接收是把遥控器发送的数据(已调信号)转换成一定格式的控制指令脉冲(调制信号、基带信号),是完成红外线的接收、放大、解调,还原成发射格式(高、低电位刚好相反)的脉冲信号。
这些工作通常由一体化的接收头来完成,输出TTL兼容电平。
最后通过解码把脉冲信号转换成数据,从而实现数据的传输。
图2-13是一个红外线接收电路框图。
图2-13红外接收及控制电路框图
本设计的核心部分在于红外接收及数码管显示。
其中红外数据接收是对红外二进制脉冲的宽度进行测量,从而获得红外遥控的脉冲信息。
采用外部中断成为了理所当然的选择,外部中断只有低电平和下降沿触发两种方式,这就使得单片机只能一次性对脉冲的高电平或低电平进行测量,而一连串的脉冲是不可能分开多次测量的,因此,为了解决这一问题,本人将从接收头出来的红外二进制脉冲信号与标志位(P24)进行逻辑或非,然后再输入到INT0(P3.2)引脚,使得输入INT0的信号恰好是红外数据发射电路输出端P25的信号,只要检测到INT0信号下降沿到上升沿的这段时间。
如果相邻的两个中断间隔的时间长度为1.125ms,说明接收到的是“0”;时间长度是2.25ms则为“1”。
因此,脉冲电平的每一次跳变都会形成一次中断,在中断服务子程中即可实现一次性对一连串连续波形的测量,在测量后对0和1的各数据统计从而测出控制指令的功能。
硬件或非门的反应速度是纳秒级的,满足实时要求。
红外接收电路连接图如图2-14所示。
图2-14红外接收电路图
3.2共阳数码管显示
第3章红外解码程序设计
使用C语言编写程序,调用的库函数多,易于移植,编程简单。
第1节红外接收电路主程序流程图
主程序是首先初始化红外接收端口,然后检测是否接收红外信号,如果接收到红外信号就调用接收子程序,然后就通过数码管显示当前按键的解码值,如图3-1所示。
图3-1红外接收主程序流程图
第2节红外接收电路子程序流程图
子程序是首先读取T0定时器的长度,如果是1.125ms就认为是“0”,将其存入缓冲区并且计数器加1,如果是2.25ms就认为是“1”,将其存入缓冲区并且计数器加1。
如果计数器值为32时,就接收结束标志位并且将计数器清0,如果计数器值不为33时,就认为是接收误码,计数器也将清0,此时重新等待读取红外信号。
如图3-2所示。
图3-2红外接收程序流程图
总结
本设计通过51系列单片机对红外遥控器解码,红外遥控指令接收,接收主程序是首先初始化红外接收端口,然后检测是否接收红外信号,如果接收到红外信号就调用接收子程序,然后就通过数码管显示当前按键的解码值。
TC9012型红外遥控器被广泛用在家用电器和仪器仪表中,在了解了其发射的编码脉冲信号波形后,设计了基于单片机AT89S52的红外遥控器解码器,对解码器硬件和相应软件进行分析并给出程序流程图。
将红外遥控器用在生产即时显示系统中,作为参数设置和系统控制用红外遥控器,既操作灵活方便,又能提高系统抗干扰能力,在实际中收到了良好效果。
参考文献
[1]谭浩强,C程序设计(第3版)[M],北京:
清华大学出版社,2008:
69-77
[2]杨素行,模拟电子技术基础(第3版)[M],北京:
高等教育出版社,2008:
9-23
[3]余孟尝,数字电子技术基础(第3版)[M],北京:
高等教育出版社,2009:
73-90
[4]迟荣强,单片机原理及接口技术[M],北京:
高等教育出版,2009:
24-63
[5]徐玮,C51单片机高效入门[M],北京:
机械工业出版社,2007:
234-257
[6]郭天祥,新概念51单片机C语言教程[M],北京:
电子工业出版社,2009:
147-156
附录1
红外解码程序
#include
#include
#include
////////////////////////////////////////////////
#defineTURE1
#defineFALSE0
////////////////////////////////////////////////
sbitIR=P3^2;//红外接口标志
////////////////////////////////////////////
unsignedcharirtime;//红外用全局变量
bitirpro_ok,irok;
unsignedcharIRcord[4];
unsignedcharirdata[33];
//////////////////////////////////////////////
voidDelay(unsignedcharmS);
voidIr_work(void);
voidIrcordpro(void);
//////////////////////////////////////////////////////////////////
voidtim0_isr(void)interrupt1using1//定时器0中断服务函数
{
irtime++;
}
///////////////////////////////////////////////////////////////////////
voidex0_isr(void)interrupt0using0//外部中断0服务函数
{
staticunsignedchari;
staticbitstartflag;
if(startflag)
{
if(irtime>=33)//引导码TC9012的头码
i=0;
irdata[i]=irtime;//一次存储32位电平宽度
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{irtime=0;startflag=1;}
}
////////////////////////////////////////////////////////////////////
voidTIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;//reloadvalue
TL0=0x00;//initialvalue
ET0=1;//开中断
TR0=1;
}
///////////////////////////////////////////////////////////////////
voidEX0init(void)
{
IT0=1;//Configureinterrupt0forfallingedgeon/INT0(P3.2)
EX0=1;//EnableEX0Interrupt
EA=1;
}
voidIr_work(void)//红外键值散转程序
{
switch(IRcord[2])//判断第三个数码值
{
case0:
P0=0xf9;break;//1显示相应的按键值
case1:
P0=0xa4;break;//2
case2:
P0=0xb0;break;//3
case3:
P0=0x99;break;//4
case4:
P0=0x92;break;//5
case5:
P0=0x82;break;//6
case6:
P0=0xf8;break;//7
case7:
P0=0x80;break;//8
case8:
P0=0x90;break;//9
}
irpro_ok=0;//处理完成标志
}
voidIrcordpro(void)//红外码值处理函数
{
unsignedchari,j,k;
unsignedcharcord,value;
k=1;
for(i=0;i<4;i++)//处理4个字节
{
for(j=1;j<=8;j++)//处理1个字节8位
{
cord=irdata[k];
if(cord>7)//大于某值为1
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;
value=0;
}irpro_ok=1;//处理完毕标志位置1
}
/////////////////////////////////////////////////////////////////
voidmain(void)
{
EX0init();//EnableGlobalInterruptFlag
TIM0init();//初始化定时器0
P2=0xfe;//8位数码管全部显示
while
(1)//主循环
{
if(irok)
{
Ircordpro();//码值处理
irok=0;
}
if(irpro_ok)//steppresskey
{
Ir_work();//码值识别散转
}
}
}
附录2
系统总电路原理图
致谢
本次设计综合了大学几年所学到的专业知识,把理论联系到实际;此次的课程设计,通过自己学习单片机,对自己掌握的知识进行对课题进行设计。
通过上网查资料,不懂得问题及时向指导老师和同学请教,按时按量的完成老师布置的课题。
在这次的维持两个星期的课题设计中,自己收获很多,也学到很多,在各方面对自己的能力有所提高。
在吴全玉老师的指导和同学的帮助下,我和搭档对课题进行数次的探讨,最后顺利完成了本次设计任务。
通过本次设计,我对电路设计以及软件控制等方面都有了更为深刻的认识,并在实际中的开发板实现工作与原理中,掌握了很多技能。
我真诚的感谢吴老师和同学给予我们的帮主,吴老师对我们的设计思路及其最终实现都提出了非常宝贵的意见,并指出了设计思路中存在的不足,使得本次设计能够圆满成功。
本次毕业论文是一次理论与实际相结合的考验,它使我更加真切的体会到,作为一名自动化专业的学生,光会纸上谈兵是远远不够的,实际动手能力和扎实的理论知识同等重要。
本次设计对于我来说,既是一次对理论知识的巩固和提高,也是对实际动手操作能力的锻炼和加强。