资源描述
电子电路综合设计实验报告
题目:红外遥控器信号接收和显示的设计实现(选题十四)
班级:08-0441
姓名:简杰
学号:2008044127
日期:2011.4.6—2011.4.13
成绩:
摘要:随着电子技术的发展,红外遥控器越来越多的用到电器设备中,为电器用户提供了极大的方便。但是,对于电器生产厂家来说,各种型号的遥控器的大量使用带来的遥控器的大批量多品种的生产检测却是一个难题。目前市场上对遥控器的检测还是使用比较落后的手动方式逐一进行,使得一线的检测工人既费时费力而又效率低下;另外,在电器产品的调试过程中,当出现控制故障时,很难判断到底是遥控器的发射故障还是电器上的接收故障。因此,研制一种智能红外遥控器检测装置,以改变生产一线的这种状况成为一种迫切的需要。本实验中的红外遥控器信号的接收和显示电路以单片机和一体化红外接收器为核心技术,具体由单片机最小系统、单片机与PC机间的通信模块、红外接收模块、数码管显示模块和流水灯模块组成。在实验的设计中,采用HS0038塑封一体化红外线接收器,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而且体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。整个电路分为四个模块:单片机最小系统、通信模块、红外接收模块以及数码管显示模块。根据输入信号的不同,在数码管显示电路上显示相应的按键数字或音量调节表现出的流水灯功能,并通过串口调试助手,在遥控器有按键按下时,将其键值显示在PC机上。
一.设计任务与要求:
结合单片机最小电路和红外线接收接口电路共同设计一个基于单片机的红外遥控信号接收与转发系统,用普通电视机遥控器控制该系统,使用数码管显示信号的接收结果。
1.当遥控器重复按下某数字键时,数码管显示不变。
2.当遥控器按下某数字键时,在数码管上显示其键值。如按下数字键1,则在数码管上显示号码“01”。
3.当遥控器按下音量加减键时,用两位数码的周围段实现顺时针或者逆时针旋转的流水灯功能。
4.运用串口调试助手,当遥控器有按键按下时,将其键值显示在PC机上。
二.系统概述
1 设计方案
为了实现系统整体功能,红外解码部分是核心,红外解码指将遥控发射器所产生的红外遥控编码脉冲所对应的键值翻译出来的过程。下面将系统方案做一论证,通常有硬件解码和软件解码两种方案。
方案一: 硬件解码
此方案中,使用专用遥控器作为控制信号发出装置,当按下遥控器的按键后,一体化红外接收装置接收到遥控器发出的设置控制信号,然后将信号送到专用的解码芯片中进行解码,解码后将信号送到单片机,由单片机查表判断这个信号是按键数值信号或控制音量、频道等信号,当确认是何种信号后,启动子程序,然后进行查询。每次红外接收头接收到红外信号传到解码器中,解码器解码完毕后送到单片机,单片机再通过查表确定这些数值并进行相应功能的控制。设计原理图如图1所示。
图1 方案一原理图
方案二:软件解码
此方案中,采用普通的家用遥控器作为控制信号发出装置,当按下遥控器的按键后,一体化红外接收装置接收到遥控器发出的红外线控制信号,然后把这个信号转换成电信号,传到单片机中,利用单片机对这个信号进行解码,解码完成后查表确定是按键数值信号或控制音量、频道等信号,启动子程序,进行相应的显示数字等功能。然后查询,重复上述流程。设计原理图如图2所示。
图2 方案二设计原理图
2 方案比较与选取
方案一为硬件解码方案,硬件解码需要使用与遥控器相配套的专用的解码器芯片,而解码芯片一般不易得到,价格也较贵,或者自行开发解码电路(但电路太复杂,性能欠佳)。
方案二为软件解码方案,软件解码可以不考虑遥控器的芯片是什么型号的,因为我们只需检测到它的发射编码,然后用软件方式来对它进行处理,从而得到所要的信息。软件解码具有灵活、硬件精简(仅需集成红外接收头和一片单片机)、可靠性高,成本低等特点。
基于以上特点,选取方案二作为实验方案。
3 系统框图
系统框图如图3所示。
图3 系统框图
遥控器为控制信号的发出装置,用一体化红外接收装置HS0038接收遥控器发出的红外线控制信号,并与单片机相连实现数据传输,通过单片机编程将接收到的数字编码在数码管上显示出来,当按下左右键时,数码管将实现流水灯现象。使用MAX232芯片、串口及若干电容来完成串口模块,以实现单片机和PC机的通信功能并且达到可以使用串口调试助手的目的。
三.单元电路设计与分析
1 单片机最小系统
单片机选用STC89C51,主要负责整个系统的控制及数据的存储和处理。放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容构成并联谐振电路,接在放大器的反馈回路中。根据情况本设计中选择11.0592MHz的晶振,补偿电容选择30pF左右的电容。单片机最小系统电路图如图4所示。
图4单片机最小系统
2通信模块
通信模块用于将编写好的程序下载至单片机中,采用MAX232与串口相连组成了通信下载电路。MAX232是MAXIM公司专门为PC视RS-232标准串口设计的电平转换电路。该芯片与TTL/COMS电平兼容,片内有2个发送器,2个接收器,且使用+5 V单电源供电。通信模块电路如图5所示。
图5 通信模块电路图
3 红外接收模块
本电路采用HS0038塑封一体化红外线接收器,它是一种集红外线接收、放大、整形于一体的集成电路,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,没有红外遥控信号时为高电平,收到红外信号时为低电平,而且体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。电路图如图6所示。
图6 红外接收电路
4 数码管显示电路
数码管显示电路采用两位共阳数码管LG5022BH,由单片机的P3^2和P3^3作为位选口,输出低电平时数码管被选中;P1口作为段选。选用三极管S8550驱动,e极与VCC相连,b极接电阻后与单片机的P3^2和P3^3口相连,c极与数码管的位选口相连。数码管显示电路如图7所示。
图7 数码管显示电路
四 安装调试及测量数据分析
总体电路一次组装完毕后,首先采用分块调试,采用这种调试的方法,可以缩小问题出现的范围,可及时发现,易于解决。
首先进行单片机最小系统的测试,将单片机的VCC与电源正极相连,连接完成后用示波器观察晶振两端起振,且30管脚有波形。单片机最小系统正常工作。
其次测试通信模块,测试单片机与PC机之间能否正常通信,单片机与PC机之间正常通信,通信模块测试正常。
再次对数码管显示电路进行测试,首先将数码管动态显示的程序下载至单片机中对数码管显示电路进行测试,数码管显示正常。
之后进行程序下载调试。主函数软件流程图如图8所示。
图8 主函数软件流程图
将编写好的程序下载到最小系统中后,数码管的按键和流水灯显示正常,在使用串口调试助手实现单片机与PC机之间的通信时,PC机接收到得数据有误,后经程序修正及调节串口调试助手的比特率,使得两机之间的通信顺利进行。至此,电路和程序全部调试完毕。
五.结束语
本实验设计结束后满足设计要求,实现了遥控器按下数字键时,在数码管上显示其键值。如按下数字键1,则在数码管上显示号码“01”; 当遥控器按下左键及右键时,两位数码的周围段实现顺时针或者逆时针旋转的流水灯功能;运用串口调试助手,在遥控器有按键按下时,能将其键值显示在PC机上。
本设计仍然存在着一些不足之处,例如只能实现对遥控器少量按键在数码管上的显示情况,而对于其他按键的显示大多没有规律或显示乱码,在此方面有待提高和改进。
通过此次试验的整个设计,焊接以及调试的完成,使我了解了常用红外接收器的原理并基本掌握了其设计和使用的方法,了解了实际遥控器编码的数据格式,掌握了数码管显示电路的实际构建方法,了解了单片机最小系统的构成及应用设计,熟悉了单片机串行通信模块的设计。以往的各类实验课实验中,多数为单元实验且电路模式比较固定,调试也较容易,多数实验没能培养出我们对整个电子电路系统的整体认识,而通过这次的实验,不仅使我学到了有关红外接收方面的知识,而且,提高了对整个电子电路系统从设计到调试整体的系统性认识,培养了综合运用多学科相关知识进行初步工程设计与实际装调系统电路的能力,收获颇多。
最后,感谢高敬鹏老师在整个实验过程中给我们的指点和帮助!
六.附录
附录一:元件表
元器件名称
数量
40脚IC座
1
16脚IC座
1
单片机STC89C51
1
红外接收器HS0038
1
MAX232
1
两位共阳数码管 (LG5022BH)
1
串口
1
开关
1
按键
1
11.0592M晶振
1
三极管8550
2
电容(104)
6
电容(30pF)
2
电阻(10K)
1
电阻(1K)
2
电阻(270)
8
单排座
1
万用板
1
附录二:参考文献
1. 《实用电子系统设计基础》 姜威. 北京理工大学出版社.
2. 《电子线路设计实验测试》 罗杰,谢自美. 电子工业出版社.
3. 《单片机实验与应用系统设计》 范蟠果. 国防工业出版社.
4. 《红外遥控在节能和无线操作方面的应用》 王伟生,郑小真. 河南工业大学
5. 《单片机C语言开发技术》 龚运新. 清华大学出版社
6. 《51单片机及其C语言程序开发实例》 戴仙金 北京-清华大学出版社
附录三:程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int//宏定义
sbit a=P3^3;
sbit b=P3^2;
int read,bj,result,yiweiresult,nuresult,k=0;
uchar table[4]={0};//定义数组用来存放用户码和数据码
uchar dis[16]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管显示编码
uchar tablea[3]={0xef,0xdf,0xfe}; //{0xef,0xdf,0xfe};
uchar tableb[4]={0xfe,0xfd,0xfb,0xf7};//{0xfe,0xfd,0xfb,0xf7};
uchar tableaf[2]={0xef,0xf7}; //{0xef,0xf7};
uchar tablebf[2]={0xfe,0xdf}; //{0xfe,0xdf};//数码管流水灯顺时针逆时针数组
void delay_9000us()
{
uint i,j;
for(i=0;i<5;i++)
for(j=0;j<308;j++);
} //延时9.0ms
void delay_5000us()
{
uint i,j;
for(i=0;i<2;i++)
for(j=0;j<308;j++);
} //延时5.0ms
void delay_100us()
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<11;j++);
} //延时100us
void delay_6ms()
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<660;j++);
} //延时6ms
void delay_500ms()
{
uint j;
for(j=0;j<12850;j++)
{ read=P3;
if((read&0x10)==0)
break;
}
} //延时500ms
void start_t0()
{
TH0=0;
TL0=0;
TR0=1;
} //定时计数器初始化
/*解码子函数*/
uchar jiema()
{
uchar i,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)两位数码管外围段顺时针转
void liushuideng()
{
int i=0;
while(1)
{
for(i=0;i<3;i++)
{
b=1;
a=0;
P1=tablea[i];
delay_500ms() ;
}
for(i=0;i<4;i++)
{
a=1;
b=0;
P1=tableb[i];
delay_500ms();
}
for(i=0;i<1;i++)
{
a=0;
b=1;
delay_500ms() ;
P1=0xf7;
}
delay_6ms();
read=P3;//查询
if((read&0x10)==0)
break;
}
}
//流水灯子函数(fan) 两位数码管外围段逆时针转
void fanliushuideng()
{
int i=0;
while(1)
{
for(i=0;i<2;i++)
{
b=1;
a=0;
P1=tableaf[i];
delay_500ms();
}
for(i=3;i>=0;i--)
{
a=1;
b=0;
P1=tableb[i];
delay_500ms();
}
for(i=0;i<2;i++)
{
a=0;
b=1;
P1=tablebf[i];
delay_500ms();
}
delay_6ms();
read=P3;//查询
if((read&0x10)==0)
break;
}
}
//显示子函数
void display(uchar dat)
{
while(1)
{
a=0;
b=1;
if(dat<=9)
{P1=0xc0;
delay_5000us();
P1=0xff;}
if(dat<=9)
{ a=1;
b=0;
P1=dis[dat];
delay_5000us();
P1=0xff;}
a=1;
b=0;
delay_100us();
read=P3;//查询
if((read&0x10)==0)
break;
}
nuresult=dat;
}
/*************串口发送子程序*****************/
void init(void)
{
TMOD=0x20;
TH1=0xf4;
TL1=0xf4;
PCON=0x00;
TR1=1;
SCON=0x50;
}
void checkout(unsigned int para)
{ unsigned int paracheck;
paracheck=para;
SBUF=paracheck;
while(TI==0);
TI=0;
}
void sent(unsigned int i)
{
checkout(i);//+48);
}
/*******************************************/
/************************/
void chuankou(uint f)
{
/********串口发送*******/
init();
sent(table[0]);//sent(0);
TI=0;
init();
sent(table[1]);//sent(0);
TI=0;
init();
sent(table[2]);//sent(0);
TI=0;
init();
sent(table[3]);//sent(0);
TI=0;
//init();
//sent(f);//sent(f);
//TI=0;
TMOD=0x01;
/*********************/
}
/**********************/
/*解码主函数*/
void main()
{
TMOD=0x01; //选择方式1,定时器工作模式
jj:
do read=P3;
while(read&0x10);//等待低电平
delay_100us();//消抖100us
do
read=P3;
while(!(read&0x10));//等待高电平
start_t0();
do
read=P3;
while(read&0x10);//等待低电平
TR0=0;//关闭定时器
bj=TH0;
if(bj>0x0c)//判断正常码和数据码
result=jiema(); //调用解码函数
chuankou(result);
if(result==0x5f) //1a音量增加按键
{
liushuideng();
goto jj;
}
if(result==0x5b) //1e音量减少按键
{
fanliushuideng();
goto jj;
}
// for(s=0;s<4;s++)
delay_9000us(); //显示延时
display(result); //显示
//chuankou(result);
goto jj; //等待再次发送数据
}
展开阅读全文