学习型红外线遥控器的设计.docx
《学习型红外线遥控器的设计.docx》由会员分享,可在线阅读,更多相关《学习型红外线遥控器的设计.docx(17页珍藏版)》请在冰豆网上搜索。
学习型红外线遥控器的设计
--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--
学习型红外线遥控器的设计(总22页)
湖南人文科技学院
课程设计报告
课程名称:
单片机课程设计
设计题目:
学习型红外线遥控器的设计
系别:
通信与控制工程系
专业:
电子信息工程
班级:
学生姓名:
学号:
起止日期:
指导教师:
教研室主任:
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
1、设计过程中出勤、学习态度等方面
2、课程设计质量与答辩
3、设计报告书写及图纸规范程度
总成绩
教研室审核意见:
教研室主任签字:
年月日
教学系审核意见:
主任签字:
年月日
摘要
当今社会科学技术的发展与日俱增,人们的生活水平也是日益提高,为了减少人的工作量,所以对各种家用电器、电子器件的非人工控制的要求也是越来越高,针对这种情况,设计出一种集成度比较高的控制体系是必然的。
单片机的集成度很高,它具有体积小、质量轻、价格便宜、耗电少等突出特点,尤其耗电少,又可使供电电源体积小、质量轻。
本课程设计介绍了基于单片机的一种学习型万能遥控器的设计与实现,可以对各种红外线遥控器发射的信号进行识别、存储和再现等功能,从而实现对各类家电的控制。
学习型红外遥控器由单片机、红外线接收、红外线发射、显示、存储、按键等部分组成。
本设计详细介绍了学习型红外遥控器的软硬件设计方法,并给出了具体的各单元电路设计、程序设计及主程序流程图。
在硬件设计中,我们选取STC89C52型号单片机为核心器件,并给出外围电路模块如红外接收模块、红外发射模块、显示模块、以及外部控制模块等组成部分的设计实现。
软件部分采用keil进行C程序设计与编译,并将编译后产生的hex文件通过STC_ISP_V479下载到单片机中,进行调试。
本学习型遥控器采用最小化应用模式设计,电路简单,尤其是通过大量不同遥控码的特征分析,在遥控码的读入时选择了最佳采样间隔,使遥控码的学习成功率大大提高。
关键词:
遥控学习;红外解码;单片机控制;红外遥控
学习型红外遥控器的设计
设计要求
学习型红外线遥控器要求可以学习不同遥控器的某个按键码功能。
使用时先用原遥控器对着学习器按一下某操作键,学习器就可以实现原遥控器中该键的遥控功能。
前言
本课程设计是一个基于单片机的学习型红外遥控器,能够学习不同遥控器的某个按键功能。
利用单片机STC89C52对多个红外遥控编码的脉冲宽度进行测量,并原封不动地把发射信号中高、低电平的时间宽度记忆至扩展存储区的指定地址。
当要发射红外信号时,从扩展存储区中还原出相应的红外遥控编码,并调制到38KHz的载波信号上,最后,通过三极管放大电路驱动红外发光二极管发射红外信号,达到学习和发射的目的,从而实现一个遥控器控制多种红外遥控设备。
1、方案论证
为了实现遥控码的记录还原功能,系统应具有红外线的接收解码、红外线调制发射、操作按键和功能控制功能等单元。
由于功能定为学习一个遥控器按键的遥控功能,因此决定采用STC89C52单片机作为控制器。
STC89C52单片机中具有256字节的内存单元,可存储遥控码脉宽的数据。
遥控码的脉宽数据可用红外线接收器解码后送单片机读入,接受电路图如图1所示。
发射时通过设置定时器的初值为F3H产生38kHZ红外调制信号送红外发射管发射,红外发射电路图如图2所示。
单键学习型红外遥控器的实现方案框图如图3所示。
图1红外接收电路原理图
图2红外发送电路原理图
图3单键学习型红外遥控器系统框图
2、基本功能模块设计与说明
.初始化模块
初始化模块的主要任务是清存放脉宽数据单元,关闭学习及发射指示灯,关闭遥控输出口,将定时器T1设为8位自动重装模式,设置中断。
遥控码读入处理模块
遥控码的学习处理程序主要是将原遥控器发出的脉冲码宽依次存入内存单元,存放规则为偶数地址(0、2、4、6等)存放低电平脉宽数据,奇数地址(1、3、5等)存放高电平脉宽数据。
定义文件中划了206个单元用于存放脉宽数据,符合常用遥控器的最大码长要求。
遥控码读入程序流程图如图4所示。
本程序在编程设计中非常重要,通过大量的、不同中来的遥控码波形实验测试分析,遥控码的帧间歇位宽度均在10ms以上,起始码宽度由9ms低电平的引导码和高电平的起始位组成。
编码位在100us~之间。
为确保所有遥控器学习的成功,可采用以下程序实现方法。
读起始位方法:
由于起始位的码宽范围较大,因此计数单元采用单独的2字节,计数周期约为15us,这样按65536*15us算,最大可存起始位脉宽为983ms。
当输入为低电平时,开始9ms的引导码计数,输入高电平时开始的起始位计数,当再次进入低电平时,则开始读遥控码并计数。
读遥控码的方法:
采用1字节计数单元对遥控码(高电平或低电平)进行宽度计数,电平跳变时结束计数,并将数据存入规定的地址。
在高电平码计数时,当计数值大于255时(宽度大于),则判定为结束帧间隔位,在相应存储单元写入数据0xOO作为结束标志。
遥控码发射处理模块
遥控码发射程序将原存于内存单元的脉冲数据还原成38KHZ方波,利用定时/计数器T1中断功能产生38KHZ载波,调制波从脚送出。
利用原读入时的低电平持续时间控制产生38KHZ方波的时间,而原读入时为高电平的脉宽数据将作为停发38KHZ方波的持续时间控制。
经过反向放大器,9ms的引导码变为高电平,的低电平变为高电平发送出去。
波形图如图5所示。
遥控码发射处理程序图如图6所示。
图5红外线发送波形图
主模块
主程序在完成上电初始化后进行按键查询,当确认有键按下时将编码发出去。
控制电视机。
在主程序中加入了数码管显示部分,用于显示接收到的引导码和起始位个数,原理图如图7。
主程序流程图8所示
图6数码管显示原理图
图4遥控码读入程序流程图图6遥控码发射处理程序图图8主程序流程图
3、调试与操作说明
3.1学习型红外遥控器的电路原理图的设计
图5所示为该学习机遥控器的电路原理图,单片机使用STC89C52。
其中:
口接遥控器发射按键;
口用作状态指示,绿灯亮代表学习状态,绿灯灭代表码已读入;
口用作指示遥控键的操作,闪烁代表遥控码正在发射之中;
第9脚为单片机的复位脚,采用RC上电复位电路;
第12脚为单片机中断输入口,用于工作方式的转换控制,当INT0脚为低电平时,系统进入学习状态;
第2脚用于红外线接收解码器的输出信号输入
第1脚作为遥控码红外调制信号的输出口,输出38KHZ的方波脉冲;
第18、19脚接12M晶振。
STC89C52芯片引脚如图6。
图9STC89C52引脚图
由于采用最小化应用系统,因此控制线PSEN(片外取指控制)、ALE(地址锁存控制)不用,EA(片外存储器选择)接高电平,使用片内程序存储器。
红外线接收器使用市场上用于电视机的三端一体化红外接收解调器,三极管可用9013系列,红外线发射二极管也用普通遥控器中使用的器件。
程序的编译及下载
1、创建工程并选择AT89C52型号芯片。
2、新建文件。
3、编写源程序并编译,如图10所示。
图10学习型遥控器的程序编译图
3、打开STC-ISP下载软件,选择STC89C52RC型号的芯片,选择串口3并导入编译生成的hex文件。
4、将单片机与计算机的串口相连,并将程序下载至单片机,如图11所示。
图11学习型红外遥控器程序下载图
3.3实际电路的测试
程序下载进单片机后,打开单片机开发板上电源接口开关以及P1口电源切换开关,按下中断0控制键,待绿色的流水灯亮后,将电视遥控器对准单片机开发板上的红外接收头按下某个按键,当绿灯熄灭时,此时代表学习完成了,然后关闭PI口电源切换开关按下单片机开发板上的发射键对电视机进行遥控操作。
测试可知,本次设计的学习型遥控器完全符合要求,达到了预期目的。
4、课程设计心得体会
本次课程设计的基于单片机学习型红外遥控器,在keil软件上进行了进行C程序的设计、编译,并将输出的的hex文件通过STC_ISP_V479下载到单片机中,最后在单片机开发板上进行调试,测试硬件电路功能。
经过实践验证,本设计是正确的。
测试中,我们选取了电视机的遥控器作为学习对象,通过学习遥控器上某个键的功能,能实现单片机对电视机的控制。
达到预期目的,设计完全成功。
本文给出的设计思想也适用于其他基于单片机的系统设计。
我们这次课程设计是通过小组的讨论与实验所完成的,在进行过程中碰到了一些困难。
首先,本次设计是采用keil与STC_ISP_V479软件来完成的。
因此对于这两种软件的使用也提出了一定的要求。
其次,由于在设计遥控码的码宽时,参数设置不够恰当,导致单片机无法成功对遥控器的按键功能进行学习。
再次,在硬件电路功能测试过程中,由于实际的单片机开发板的电路连接与本课程设计的硬件电路不完全一致,导致无法进行调试。
通过修改信号输入输出端口,并结合实际的单片机开发板硬件连接进行外部控制,最终成功实现了学习型遥控器的学习功能。
通过这次实验我们感觉到动手能力及思维方式得到很大的加强。
在这次课程设计中,我们学会了怎样去根据课题的要求运用学过的知识去设计电路和调试电路。
从中我们发现了实践的重要性,在以后的学习中我们要加强理论与实际的结合。
而且这次实验也体现了团队合作的重要性与探索精神的必要性。
5、元器件及仪器设备明细
表1元器件及仪器设备明细表
器件名称
型号/版本
数量
备注
微型计算机
联想
一台
keil软件
一套
STC_ISP_V479软件
一套
单片机开发板
STC89C52
一套
电视机
TCL
一台
电视机遥控器
TCL
一台
6、参考文献
[1]舒经文.最新彩电机芯及其遥控系统的原理与维修.北京:
电子工业出版社,1993
[2]李华.MCS-51系列单片机实用接口技术.北京:
航天航空大学出版社,1999
[3]麦山.基于单片机的协议红外遥控系统.电子技术:
1998
[4]何立民.MCS-51系列单片机应用系统设计,系统配置与接口技术.北京:
航空航天大学出版社,1995
[5]刘宁生周哨山.脉冲与数字电路.北京:
中国广播电视出版社,1995
[6]康光华,陈大钦.电子技术基础(模拟部分).高等教育出版社..第四版
[7]李建华.实用遥控器原理与制作.北京:
人民邮电出版社,1996
7、致谢
本组成员,接到课题后,经过认真激烈的讨论。
开始确定基本思路,然后查阅了大量资料,然后根据老师提供的单片机原理图了解和熟悉了红外线遥控模块的基本电路,利用keil软件编写C语言程序,调试程序无误后,打开STC-ISP下载软件将已编写好的程序下载到单片机中完成红外线遥控器的学习过程。
通过本学期对单片机的初步了解和学习,让我们对硬件和软件之间的联系有了更加深入的了解。
为期两个星期的课程设计不仅巩固了我们的理论知识而且也培养了学生们的动手实践能力。
此次课程设计是一次把理论应用于实际的实践,本次实践受益匪浅。
第一:
巩固和加深了单片机基本知识和理解,提高了综合运用所学知识的能力。
第二,提高了查阅手册,图表,文献资料以及相关软件的自学能力。
第三,通过第四,意识到,光有理论知识是不够的,还必须懂一些实践中的知识。
所以在课程设计的实践中,本组成员将理论知识与实际想结合,锻炼自己理论联系实际的能力和实际动手能力。
第五、充分意识到团结的需要性,明白了团结的力量是无穷大的。
为以后的工作打下基础。
第六、培养了严谨的工作作风和科学态度。
第九、熟悉了论文的正确规范的写作格式以及论文的基本框架的写作思路。
这些收获不管是对我们今后的学习还是工作,生活都有着非常重要的作用,为我们更好的学习本专业打下了坚实的基础。
此次的课程设计能过顺利完成,得力于老师们的悉心指导和同学们的热心帮助。
在这,借此机会,本组成员要特别感谢各位老师和同学,谢谢你们。
特别要感谢的是谭周文老师,谢谢你们的悉心指导,耐心讲解以及宝贵意见。
祝你们身体健康,万事如意。
8、附录
/*********************************************************************/
//
//学习型遥控器
//使用keilc51
/*********************************************************************/
//使用AT89C52单片机,12MHZ晶振,
#include<>
#include<>//_nop_();延时函数用
#include<>
#defineucharunsignedchar
#defineuintunsignedint
#definePAXBYTE[0xD0FF]
#definePBXBYTE[0xD2FF]
#definePCXBYTE[0xD4FF]
#defineCONXBYTE[0xD6FF]
voidfenmiao(uint,uint);
voidmiao(uint,uint);
voidfen(uint,uint);//数码管用于显示红外线引导码和起始码的个数
voiddelay(uint);
ucharcodea[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};
sbitstudylamp=P1^6;//学习状态指示灯
sbitlamp=P1^7;//发射指示灯
sbitstudykey=P3^2;//学习键(中断口)
sbitremotein=P1^1;//遥控信号输入口
sbitremoteout=P1^0;//遥控输出口
sbittxkey=P3^3;//发射键
uinti,j,m=255,n,k,s,t,y=0;
ucharidataremotedata[206];//存缓冲宽度数据用
uinthead,tou;//存起始位用
uintremdata;
uintge,shi,bai,qian,wan,shiwan,z;
/*********1毫秒延时程序**********/
delay1ms(uintt)
{
for(i=0;ifor(j=0;j<120;j++);
}
/***********初始化函数**********/
clearmen()
{
studylamp=1;//关学习灯
lamp=1;//关发射指示
remoteout=1;//关遥控输出
remotein=1;//关遥控输入
for(i=0;i<206;i++)//清内存
{remotedata[i]=0x00;}
IE=0x00;
IP=0x01;
TMOD=0x22;//8位自动重装模式
PCON=0X00;
TH1=0xf3;//38KHZ初值
TL1=0xf3;
IT0=1;
EX0=1;//外中断0允许
EA=1;//开总中断
EX1=0;
}
/**********键功能函数************/
keywork()
{
if(txkey==0)
{
while(txkey==0);
remoteout=0;
n=0;
delay
(1);//先发送低电平
ET1=1;TR1=1;//发送引导码高电平
for(i=(head-55);i>0;i--){;}//使输入与输出引导码个数一致
ET1=0;TR1=0;
remoteout=0;//发起始码低电平
for(i=tou;i>0;i--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
while
(1)
{
remoteout=1;
ET1=1;TR1=1;//发高电平
for(i=remotedata[n]-5;i>0;i--){;}//使输入与输出遥控码个数一致
ET1=0;TR1=0;
n++;
remoteout=0;
if(remotedata[n]==0x00){delay1ms(10);break;}
for(i=remotedata[n];i>0;i--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
n++;//低电平不发脉冲
}
}}
/***********主函数***************/
main()
{CON=0x80;
n=0;
head=0;
tou=0;
remdata=0;
clearmen();//初始化
while
(1)
{
keywork();//按键扫描
fenmiao(shi,ge);
miao(qian,bai);
fen(shiwan,wan);
qian=tou/1000;
bai=tou%1000/100;
shi=tou%1000%100/10;
ge=tou%10;
}
}
/*********40KHZ发生器***********/
//定时中断T1
voidtime_intt1(void)interrupt3
{remoteout=~remoteout;
}
/***********学习函数***********/
//外中断0
voidintt0(void)interrupt0
{while(studykey==0);//等待键释放下降沿触发
EA=0;
for(i=0;i<206;i++)//清内存
{remotedata[i]=0x00;}
head=0;tou=0;studylamp=0;lamp=1;n=0;remdata=0;
while(remotein==1);//等待遥控码输入
while(remotein==0){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();head++;}//接收引导码
while(remotein==1){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();tou++;}//接收起始码
while
(1)
{while(remotein==0){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();remdata++;}
remotedata[n]=remdata;n++;remdata=0;
while(remotein==0);//确定接收完
while(remotein==1){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();remdata++;}
if(remdata>m)//高电平>5毫
{remotedata[n]=0x00;EX0=1;EA=1;gotoend;}
remotedata[n]=remdata;n++;//存高电平脉
while(remotein==1);//确定接收完
remdata=0;//脉宽计数器清
}
end:
lamp=0;studylamp=1;
}
//*********************数码管显示部分//**************************//
voidfenmiao(uintshi,uintge)
{
PA=0XDF;
PB=a[ge];
delay
(1);
PA=0XFF;
PB=0XFF;
PA=0XEF;
PB=a[shi];
delay
(1);
PA=0XFF;
PB=0XFF;
}
voidmiao(uintqian,uintbai)
{
PA=0XF7;
PB=a[bai];
delay
(1);
PA=0XFF;
PB=0XFF;
PA=0XFB;
PB=a[qian];
delay
(1);
PA=0XFF;
PB=0XFF;
}
voidfen(uintshiwan,uintwan)
{
PA=0XFD;
PB=a[wan];
delay
(1);
PA=0XFF;
//PB=0XFF;
PA=0XFE;
PB=a[shiwan];
delay
(1);
PA=0XFF;
//PB=0XFF;
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
//*********************结束//**************************//