红外遥控器信号接收和显示的设计.docx
《红外遥控器信号接收和显示的设计.docx》由会员分享,可在线阅读,更多相关《红外遥控器信号接收和显示的设计.docx(27页珍藏版)》请在冰豆网上搜索。
红外遥控器信号接收和显示的设计
电子电路综合设计总结报告
题目:
红外遥控器信号接收和显示的设计(设计选题十四)
姓名:
班级:
学号:
成绩:
摘要:
随着电子技术的发展,红外遥控器越来越多的应用到电器设备中,但各种型号遥控器的大量使用带来的遥控器大批量多品种的生产,使得检测成为难题,因此智能的红外遥控器检测装置成为一种迫切的需要。
在该红外遥控器信号的接收和显示电路以单片机和一体化红外接收器为核心技术,具体由单片机最小系统、单片机与PC机间的通信模块、红外接收模块、数码管显示模块和流水灯模块组成。
在本系统的设计中,利用红外接收器接收遥控器发出的控制信号,并通过软件编程将接收信号存储、处理、比较,并将数据处理送至数码管显示模块。
总之,通过对电路的设计和实际调试,可以实现红外遥控器信号的接收与显示功能。
根据比较接收信号的不同,在数码管显示电路及流水灯电路上显示相应的按键数字或闪烁变化功能,并可实现单片机及PC机之间的通信功能,使得控制信号能在PC机上显示。
关键词:
单片机红外接收器HS0038解码串口调试
设计任务
结合单片机最小电路和红外线接收接口电路共同设计一个基于单片机的红外遥控信号接收与转发系统,用普通电视机遥控器控制该系统,使用数码管显示信号的接收结果。
1、实现单片机最小系统的设计。
2、当遥控器按下数字键时,在数码管上显示其键值。
如按下数字键1,则在数码管上显示号码01。
3、当遥控器按下音量△及音量▽时,用两位数码的周围段实现顺时针或者逆时针旋转的流水灯功能。
(为使得音量的增减清晰显示,试验中在单片机的P1口外接一排流水灯,具体功能的实现见方案的可行性论证)
* 运用串口调试助手,在遥控器有按键按下时,将其键值显示在PC机上。
* 当遥控器按下频道△及频道▽时,在数码管上显示加1或减1后的数值。
一、系统方案比较与论证
1、方案比较与选择
为了实现系统整体功能,红外解码部分是核心,红外解码是指将遥控发射器所产生的红外遥控编码脉冲所对应的键值翻译出来的过程。
下面将系统方案做一论证,通常有硬件解码和软件解码两种方案。
方案一:
此方案中,使用专用遥控器作为控制信号发出装置,当按下遥控器的按键后,一体化红外接收装置接收到遥控器发出的设置控制信号,然后将信号送到专用的解码芯片中进行解码,解码后将信号送到单片机,由单片机查表判断这个信号是按键数值信号或控制音量、频道等信号,当确认是何种信号后,启动子程序,然后进行查询。
每次红外接收头接收到红外信号传到解码器中,解码器解码完毕后送到单片机,单片机再通过查表确定这些数值并进行相应功能的控制。
设计原理图如图1所示。
图1、方案一设计原理图
方案二:
此方案中,采用普通的家用遥控器作为控制信号发出装置,当按下遥控器的按键后,一体化红外接收装置接收到遥控器发出的红外线控制信号,然后把这个信号转换成电信号,传到单片机中,利用单片机对这个信号进行解码,解码完成后查表确定是按键数值信号或控制音量、频道等信号,启动子程序,进行相应的显示数字等功能。
然后查询,重复上述流程。
设计原理图如图2所示。
图2、方案二设计原理图
方案三:
此方案中采用分立元件实现红外接收装置,通过外围电路实现将遥控信号的接收、放大、检波、整形等功能,并将信号转换成单片机识别的TTL信号。
其余与方案二相同。
方案的比较如下:
方案一为硬件解码方案,硬件解码需要使用与遥控器相配套的专用的解码器芯片,而解码芯片一般不易得到,价格也较贵,或者自行开发解码电路(但电路太复杂,性能欠佳)。
方案二为软件解码方案,软件解码可以不考虑遥控器的芯片是什么型号的,因为我们只需检测到它的发射编码,然后用软件方式来对它进行处理,从而得到所要的信息。
软件解码具有灵活、硬件精简(仅需集成红外接收头和一片单片机)、可靠性高,成本低等特点。
方案三所用的红外接收外围电路设计工作复杂,电路复杂程度相对较大,不方便使用,并且性能欠佳。
经以上的论证,我采用方案二的软件解码方案,成本低,方便实现,并且系统整体性能和可靠性高。
2、方案的可行性论证
采用方案二的具体思路如下:
遥控器为控制信号的发出装置,用一体化红外接收装置HS0038接收遥控器发出的红外线控制信号,并与单片机相连实现数据传输,将信号解码成二进制编码,并按位进行存储,通过单片机编程将接收到的数字编码在数码管上显示出来,编程比较若接收到信号为音量增减则实现数码管外围段的流水灯显示功能(在实验中我在P1口连接了8个流水灯,使得音量增加或减少在流水灯上显示为自下向上流动或自上向上流动),在比较中若接收到的信号为频道的增减则实现在原本显示数值上加1或减1的功能。
用单片机的P0口控制数码管的段选,P3^2及P3^3控制数码管的位选,在数码管显示模块中,利用动态扫描的方式来显示数字或数码管流水灯。
使用MAX232芯片、串口及若干电容来完成串口模块,以实现单片机和PC机的通信功能并且达到可以使用串口调试助手的目的。
有上述论证可知此方案可行。
3、经以上方案的选择和论证,确定总体系统框图如下:
图3、总体系统框图
二、系统各单元电路的设计与分析
1、单片机最小系统
单片机的主要功能是负责整个系统的控制及数据的存储和处理,因此在设计本系统时选用STC89C51。
其中,系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。
引脚XTAL1和XTAL2分别是振荡器的高增益反相放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容C3和C4构成并联谐振电路,接在放大器的反馈回路中。
根据情况本设计中选择12MHz的晶振,补偿电容选择30pF左右的瓷片电容,如图中Y1、C3、C4;复位电路则采用手动按键复位方式,通过按键将电阻R9与VCC接通,复位脉冲的高电平宽度大于2个机器周期,即可实现复位,如图中的R9、C1所示;P0口外接上拉电阻,其结构如图中103,采用10K的排阻以提供给I/O口合适的电流。
在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
单片机最小系统电路图如图4所示。
图4、单片机最小系统电路图
2、通信模块的设计
通信模块选用MAX232芯片。
MAX232是MAXIM公司专门为PC视RS-232标准串口设计的电平转换电路。
该芯片与TTL/COMS电平兼容,片内有2个发送器,2个接收器,且使用+5V单电源供电,使用非常方便。
现从MAX232芯片中两路发送接收中任选一路作为接口,其发送接收的引脚一一对应。
本系统中使T2in接单片机的发送端TXD,同时R2out接单片机的RXD端,1、3脚和4、5脚接104瓷片电容,其接口电路如图5所示。
图5、通信模块电路图
3、红外接收模块设计
一体化的红外接收装置将遥控信号的接收、放大、检波、整形集于一身,并且输出可以让单片机识别的TTL信号,这样大大简化了接收电路的复杂程度和电路的设计工作,方便使用。
在本系统中我们采用红外一体化接收头HS0038。
HS0038黑色环氧树脂封装,不受日光、荧光灯等光源干扰,内附磁屏蔽,功耗低,灵敏度高。
在用小功率发射管发射信号情况下,其接收距离可达35m。
它能与TTL、COMS电路兼容。
HS0038为直立侧面收光型。
它接收红外信号频率为38kHz,周期约26μs,同时能对信号进行放大、检波、整形,得到TTL电平的编码信号。
三个管脚分别是地、+5V电源、解调信号输出端。
解调信号输出端与单片机P3^4相连,Vcc与GND间接104瓷片电容滤波整形,电路图如图6所示。
图6、红外接收模块电路图
4、数码管显示电路设计
数码管显示电路采用两位共阳数码管LG5022BH,具体电路如图7。
其中由单片机的P3^2和P3^3作为位选口,输出低电平时数码管被选中;P0口外接上拉电阻后作为段选,输出低电平时相应的段被点亮。
数码管的驱动选用三极管S8550,图中的电阻R10和R11选取1K的阻值大小,以提供合适的电流使三极管导通。
图7、数码管显示电路电路图
5、流水灯电路设计
流水灯电路采用八个发光二极管,所有发光二极管的正极接到单片机的P1口,负极分别通过一个1k的限流电阻接到GND端,当单片机的相应端口为高电平时发光二极管点亮,通过控制单片机P1端口的高低电平实现流水灯功能,电路图如图8所示。
图8、流水灯电路
6、程序设计和说明
在本设计中,数据的处理、存储、比较以及芯片的控制都是由单片机编程实现的。
其中,判断是显示按键数值或按键为音量增减键调用流水灯函数或按键为频道增减键调用加减函数及显示加1或减1后的数值信息等,均是使用单片机的软件部分实现,在整个设计中还存在较多的延时函数的调用和循环语句。
具体程序见附录。
主函数软件流程图如下图9所示。
图9、主函数软件流程图
三、系统的安装调试及测试数据分析
1、测试仪器
晶体管直流稳压电源1台
数字万用表1块
示波器1台
2、硬件调试的方法和过程
完成电路设计后,采用整体布局、分模块安装调试再连调的方法。
整个过程中对出现的问题进行了比较适当的解决。
、单片机最小系统焊接完成后,不能正常工作,经观察发现单片机的Vcc没有和电源正极相连,连接完成后用示波器观察晶振两端起振,且30管脚有波形。
单片机最小系统正常工作。
b、数码管显示部分在安装调试过程工作不稳定。
经老师提醒,是数码管管脚过细与插槽接触不良导致。
将管脚镀锡后在进行调试,问题得到了良好的解决。
c、在焊接完通信模块后单片机不能与PC机之间进行通信,仔细检查电路,发现MAX232的V-管脚没有接地,将此电路焊接完成后,单片机和PC机之间的通信功能得以实现。
在硬件调试的过程中有两处失误的原因均为电路芯片的管脚没有和公共的Vcc或GND接到一起,寻找错误的原因是在焊接电路的过程中均将Vcc和GND悬空,待其它电路焊接完成,最后焊接公共端,在最后寻找的过程中由于不细心导致有遗漏,对此颇有体会,在以后的实验或是工程中将更加细心。
3、软件调试问题及解决方法
A、首先在将最初编写好的程序下载到电路板上后,只能接受一次数据,第二次发送数据后不能再数码管上显示其结果,后经细心研究,增加无条件转移指令,使得能端口能一直查询红外接收电路是否有电平的变化,从而达到每次发送信号时均能在数码管上显示。
B、其次,在将数码管流水灯及外接的流水灯程序加进后,当程序走到流水灯的循环之后,不能自动的跳转出循环,经耐心的学习探讨,找到两种解决方案,一是用外部中断,使得程序能挑出循环,但由于中断的功能及调用的方法不能灵活运用,所以又经细心的研究选择使用查询的方法,同样达到了目的,也使程序简单易懂。
C、再次,使用示波器测得音量及频道增减按键的编码时,由于示波器显示的时间以及人为按下按键时间间隔不好掌控,需要测量很多次,方可测得所需要的编码,将编码测得后,写入相应的程序,若编码错误则不能实现相应按键按下所要得到的功能,在此过程中需要耐心细致,最后均测得了正确的编码。
D、再次,在写数码管和流水灯的显示数组时,将有的数组编写错误,这是较容易发现及解决的问题,经细心修正后,使得所有的数组均能正确的显示想要表示的功能。
E、再次,在显示数值时发生过数值跳变的情况,由一个数值跳变为乱码,后经在程序中增加延时函数解决此问题。
F、再次,当按键按下频道的增减按键时,每按下一次时增加或减少的数值不均为1,经过多次试验调试,在函数中增加了延时函数以达到消除抖动的目的,使得此问题得到良好的解决。
G、最后,在使用串口调试助手实现单片机与PC机之间的通信时,PC机接收到得数据有误,后经程序修正及调节串口调试助手的比特率,使得两机之间的通信顺利进行,并且没有误差。
经过以上的硬件以及软件的调试工作,基本排除了电路上或软件编程上的问题。
4、整机调试及实现的功能
在最后的整机调试过程中,能很好的完成老师的功能。
并且在要求的基础上,自己将电路的部分功能进行了扩展,完成的功能如下:
1、能实现按下数字键时在两位数码管上显示其数值,按下按键9,显示09。
2、按下音量△及音量▽时可以实现数码管外围段的顺时针或逆时针流水灯功能,并再此增加了外围的流水灯,使在音量增加或减少时流水灯能自下向上流动或自下向上流动,使得按键的功能一目了然。
3、能够使用串口调试助手实现单片机及PC机之间的通信功能。
可以在PC机上显示按键的数值。
按键按下1时,PC机上显示01。
4、在此实验中除增加流水灯的功能外还实现了当按下频道的增减按键时,数码管上显示的数值为原数值加1或减1的功能。
总体来说本次试验得到了良好的试验效果。
四、结论与改进意见及鸣谢
由整机测试的结果可知,本设计较好地满足了题目要求,在红外接收数据及其显示等功能方面得到了良好的稳定性。
并且在整个设计与装调过程中出现的问题得到了较好的解决,并最终完成了基于单片机的红外遥控信号接收和显示的设计与实现。
其实本次实验设计还有一定的提升空间和改进措施。
比如本次实验所用到的遥控器为一种固定编码的遥控器,当遥控器的型号不同即遥控器内部的红外线发射器的编码不同时,本程序并不一定能得到想要的预期结果,同时软件程序中的解码部分由了更高的要求。
现在市面上的遥控器种类有很多,增加软件部分的功能及外围电路即可实现不同型号遥控器的解码功能。
使得功能更加完善。
但由于时间原因以及理论水平有限,没能很好的达到。
通过本次设计,我了解了红外线解码的基本工作原理和设计方法,掌握了流水灯及数码显示电路的实际使用方法,了解了单片机最小系统的构成及应用设计,熟悉了单片机串行通信模块的设计。
最为重要的是,在我掌握了电子电路系统设计的基本方法的同时,提高了综合利用多学科相关知识并且进行初步工程实践与实际装调系统电路的能力,可谓是收获颇丰。
最后,在整个实验过程中,我还得到了指导老师老师的悉心指点,在这里也表示我衷心的感谢!
五、参考文献
1.龚运新单片机C语言开发技术北京-清华大学出版社2006
2.戴佳,戴卫恒51单片机C语言应用程序设计实例精讲北京-电子工业出版社2006
3.喻宗泉,喻晗,李建民单片机原理与应用技术西安-西安电子科技大学出版社2006
4.戴仙金51单片机及其C语言程序开发实例北京-清华大学出版社2008
5.王伟生,郑小真红外遥控在节能和无线操作方面的应用河南郑州河南工业大学2006
附录一:
元件清单表
元器件名称
数量
40脚IC座
1
16脚IC座
1
STC89C51
1
HS0038
1
MAX232
1
两位共阳数码管(LG5022BH)
1
串口
1
开关
1
按键
1
12M晶振
1
发光二极管
8
三极管8550
2
电容(104)
6
电容(30pF)
2
电容(10uF)
1
电阻(10K)
1
电阻(1K)
10
排阻(10k)
1
单排座
1
万用板
1
附录二:
程序
#include
#defineucharunsignedchar
#defineuintunsignedint//宏定义
sbitshu1=P3^3;
sbitshu2=P3^2;
inta,read,bj,result,yiweiresult,nuresult,k=0,gewei,gaowei,gewei1,gaowei1;
uchartable[4]={0};//定义数组用来存放用户码和数据码
uchardis[16]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};//数码管显示编码
uchartablea[3]={0xef,0xdf,0xfe};//{0xef,0xdf,0xfe};
uchartableb[4]={0xfe,0xfd,0xfb,0xf7};//{0xfe,0xfd,0xfb,0xf7};
uchartableaf[2]={0xef,0xf7};//{0xef,0xf7};
uchartablebf[2]={0xfe,0xdf};//{0xfe,0xdf};数码管流水灯数组
ucharnew1[4]={0x20,0x10,0x08,0x04};
ucharnew[2]={0x01,0x02};
ucharnew2[2]={0x40,0x80};
ucharold[3]={0x80,0x40,0x20};
ucharold1[4]={0x10,0x08,0x04,0x02};//流水灯数组
voiddelay_9000us()
{
uinti,j;
for(i=0;i<5;i++)
for(j=0;j<308;j++);
}//延时9.0ms
voiddelay_5000us()
{
uinti,j;
for(i=0;i<2;i++)
for(j=0;j<308;j++);
}//延时5.0ms
voiddelay_100us()
{
uinti,j;
for(i=0;i<1;i++)
for(j=0;j<11;j++);
}//延时100us
voiddelay_6ms()
{
uinti,j;
for(i=0;i<1;i++)
for(j=0;j<660;j++);
}//延时6ms
voiddelay_500ms()
{
uintj;
for(j=0;j<12850;j++)
{read=P3;
if((read&0x10)==0)
break;
}
}//延时500ms
voidstart_t0()
{
TH0=0;
TL0=0;
TR0=1;
}//定时计数器初始化
/*解码子函数*/
ucharjiema()
{
uchari,j,rd,pd,dat=0;
for(i=4;i>0;i--)
{
for(j=8;j>0;j--)
{
dat>>=1;
do
rd=P3;
while(!
(rd&0x10));//等待高电平
start_t0();//初始化定时器
do
rd=P3;
while(rd&0x10);//等待低电平
TR0=0;//关闭定时器
pd=TH0;
if(pd>0x03)
dat=(dat|0x80);//接收1并存储
else
dat=(dat&0x7f);//接收0并存储
}
table[i]=dat;//接收8位数据完毕
}//接受32位数据完毕
return(table[2]);//返回数据码
}
//流水灯子函数(zheng)数码管顺时针循环,流水灯由下向上循环点亮
voidliushuideng()
{
inti=0;
while
(1)
{
for(i=0;i<3;i++)
{
shu2=1;
shu1=0;
P0=tablea[i];//数码管顺时针循环数组1
P1=old[i];//流水灯自下向上循环点亮数组1
delay_500ms();
}
for(i=0;i<4;i++)
{
shu1=1;
shu2=0;
P0=tableb[i];//数码管顺时针循环数组2
P1=old1[i];//流水灯自下向上循环点亮数组2
delay_500ms();
}
for(i=0;i<1;i++)
{
shu1=0;
shu2=1;
P0=0xf7;
P1=0x01;
delay_500ms();
}
delay_6ms();
read=P3;
if((read&0x10)==0)//查询
break;
}
}
//流水灯子函数(fan)数码管逆时针循环,流水灯由上向下循环点亮
voidfanliushuideng()
{
inti=0;
while
(1)
{
for(i=0;i<2;i++)
{
shu2=1;
shu1=0;
P0=tableaf[i];
P1=new[i];
delay_500ms();
}
for(i=3;i>=0;i--)
{
shu1=1;
shu2=0;
P0=tableb[i];
P1=new1[i];
delay_500ms();
}
for(i=0;i<2;i++)
{
shu1=0;
shu2=1;
P0=tablebf[i];
P1=new2[i];
delay_500ms();
}
delay_6ms();
read=P3;
if((read&0x10)==0)//查询
break;
}
}
//显示子函数jia频道键加
voiddisplayjia()
{
if(nuresult<=9)
{nuresult=nuresult+1;
gewei1=nuresult%10;
gaowei1=nuresult/10;}
else
{nuresult=yiweiresult+1;
gewei1=nuresult%10;
gaowei1=nuresult/10;}
while
(1)
{
shu1=1;
shu2=0;
P0=dis[gewei1];
delay_5000us();
P0=0xff;
shu1=0;
shu2=1;
P0=dis[gaowei1];
delay_5000us();
P0=0xff;
delay_6ms();
read=P3;
if((read&0x10)==0)//查询
break;
}
delay_6ms();
}
//显示子函数jian频道键减
voiddisplayjian()
{
if(nuresult<=9)
{nuresult=nuresult-1;
gewei1=nuresult%10;
gaowei1=nuresult/10;}
else
{nuresult=yiweiresult-1;
gewei1=nuresult%10;
gaowei1=nuresult/10;}
while
(1)
{
shu1=1;
shu2=0;
P0=dis[gewei1];
delay_5000us();
P0=0xff;
shu1=0;
shu2=1;
P0=dis[gaowei1];
delay_100us();
delay_100us();
delay_100us();
delay_100us();delay_5000us