万能红外遥控器设计.docx
《万能红外遥控器设计.docx》由会员分享,可在线阅读,更多相关《万能红外遥控器设计.docx(17页珍藏版)》请在冰豆网上搜索。
![万能红外遥控器设计.docx](https://file1.bdocx.com/fileroot1/2023-2/26/015afb1f-3964-43e9-aa48-c063853f88a1/015afb1f-3964-43e9-aa48-c063853f88a11.gif)
万能红外遥控器设计
课程设计报告
课程名称:
单片机原理及应用课程设计
设计题目:
万能红外线遥控器的设计
系别:
通信与控制工程系
专业:
电子信息工程
班级:
09级1班
学生姓名:
学号:
0940914609409147
起止日期:
2011年12月19日~2011年12月30日
指导教师:
谭周文田汉平
教研室主任:
侯海良
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
1、设计过程中出勤、学习态度等方面
0.2
2、课程设计质量与答辩
0.5
3、设计报告书写及图纸规范程度
0.3
总成绩
教研室审核意见:
教研室主任签字:
年月日
教学系审核意见:
主任签字:
年月日
摘要
本设计详细介绍了学习型万能遥控器的软硬件设计方法,并给出了具体的各单元电路设计、程序设计及主程序流程图。
在硬件设计中,我们选取STC89C52型号单片机为核心器件,并给出外围电路模块如红外接收模块、红外发射模块、显示模块、以及外部控制模块等组成部分的设计实现。
软件部分采用keil进行C程序设计与编译,并将编译后产生的hex文件通过STC_ISP_V479下载到单片机中,进行调试。
本学习型遥控器采用最小化应用模式设计,电路简单,尤其是通过大量不同遥控码的特征分析,在遥控码的读入时选择了最佳采样间隔,使遥控码的学习成功率大大提高。
关键词:
遥控学习;红外解码;单片机控制;红外遥控
学习型红外遥控器的设计
设计要求
学习型红外线遥控器要求可以学习不同遥控器的某个按键码功能。
使用时先用原遥控器对着学习器按一下某操作键,学习器就可以实现原遥控器中该键的遥控功能。
前言
本课程设计是一个基于单片机的学习型红外遥控器,能够学习不同遥控器的某个按键功能。
利用单片机STC89C52对多个红外遥控编码的脉冲宽度进行测量,并原封不动地把发射信号中高、低电平的时间宽度记忆至扩展存储区的指定地址。
当要发射红外信号时,从扩展存储区中还原出相应的红外遥控编码,并调制到40KHz的载波信号上,最后,通过三极管放大电路驱动红外发光二极管发射红外信号,达到学习和发射的目的,从而实现一个遥控器控制多种红外遥控设备。
1方案论证
1.1方案
目前,市场上一般设备系统均采用专用的遥控器编码及解码集成电路,具有制作简单、间隔低廉等特点,但由功能键数及功能受到特定的限制,只适合于某一专用电器产品的应用,应用范围受到限制。
而采用单片机进行遥控系统的应用设计,具有编程灵活多样,操作码个数可随意设定等优点。
为了实现遥控码的记录还原功能,系统应具有红外线的接收解码、红外线调制发射、操作按键和功能控制功能等单元。
由于功能定为学习一个遥控器按键的遥控功能,因此决定采用STC89C52单片机作为控制器。
STC89C52单片机中具有256字节的内存单元,可存储遥控码脉宽的数据。
遥控码的脉宽数据可用红外线接收器解码后送单片机读入,发射时有单片机产生40kHZ红外调制信号送红外发射管
发射.单键学习型红外遥控器的实现方案框图如图1所示。
图1单键学习型红外遥控器系统框图
1.2方案二
方案二的系统由STC89C52为核心,扩展4KB的EEPROM用来存储遥控信号,系统采用12MHZ晶振,选用AT24LC32它可在线电擦除和电写入的存储器,其容量为4KB。
遥控器的结构框图如图2所示。
图2学习型红外遥控器系统框图
1.3方案对比与选择
方案二采用EEPROM来存储遥控信号,这样需要扩展存储器。
而方案一不需要扩展存储器,直接利用STC89C52中的ROM。
同时,方案二必定会增加成本,同时电路较复杂。
综上所述,所以选择方案一来设计红外遥控器。
2基本功能模块设计与说明
2.1初始化模块
初始化模块的主要任务时清存放脉宽数据单元,关闭学习及发射指示灯,关闭遥控输出口,将定时器T1设为8位自动重装模式,设置中断。
2.2遥控码读入处理模块
遥控码的学习处理程序主要是将原遥控器发出的脉冲码宽依次存入内存单元,存放规则为偶数地址(0、2、4、6等)存放高电平脉宽数据,奇数地址(1、3、5等)存放低电平脉宽数据。
定义文件中划了206个单元用于存放脉宽数据,符合常用遥控器的最大码长要求。
遥控码读入程序流程图如图2所示。
本程序在编程设计中非常重要,通过大量的、不同的遥控码波形进行实验测试分析,遥控码的帧间歇位宽度均在10ms以上,起始码宽度在100us~20ms之间,编码位在100us~3.5ms之间。
为确保所有遥控器学习的成功,可采用以下程序实现方法。
读起始位方法:
由于起始位的码宽范围较大,因此计数单元采用单独的2字节,计数周期约为15us,这样按65536*15us算,最大可存起始位脉宽为983ms。
当输入为高电平时,停止起始位计数,进入高电平计数。
读遥控码的方法:
采用1字节计数单元对(高电平或低电平)进行宽度计数,电平跳变时结束计数,并将数据存入规定的地址。
在高电平码计数时,当计数值大于255时(宽度大于3.825ms),则判定为结束帧间隔位,在相应存储单元写入数据0x00作为结束标志。
2.3遥控码发射处理模块
遥控码发射程序将原存于内存单元的脉冲数据还原成40KHZ方波,利用定时/计数器T1中断功能产生40KHZ载波,调制波从P3.5脚送出。
利用原读入时的低电平持续时间控制产生40KHZ方波的时间,而原读入时为高电平的脉宽数据将作为停发40KHZ方波的持续时间控制。
遥控码发射处理程序图如图5所示
2.4电路原理图的设计
图3所示为该学习机遥控器的电路原理图,单片机使用STC89C52。
其中:
P1.2口接遥控器发射按键;
P1.6口用作状态指示,绿灯亮代表学习状态,绿灯灭代表码已读入;
P1.7口用作指示遥控键的操作,闪烁代表遥控码正在发射之中;
第9脚为单片机的复位脚,采用RC上电复位电路;
第12脚为单片机中断输入口,用于工作方式的转换控制,当INT0脚为低电平时,系统进入学习状态;
第14脚用于红外线接收解码器的输出信号输入
第15脚作为遥控码红外调制信号的输出口,输出40KHZ的方波脉冲;
第18、19脚接12M晶振。
由于采用最小化应用系统,因此控制线PSEN(片外取指控制)、ALE(地址锁存控制)不用,EA(片外存储器选择)接高电平,使用片内程序存储器。
红外线接收器使用市场上用于电视机的三端一体化红外接收解调器,三极管可用9013系列,红外线发射二极管也用普通遥控器中使用的器件。
图3单键遥控码学习控制器电路原理图
2.5程序流程图
主程序在完成上电初始化后进行按键查询,当确认有键按下时将编码发出去。
主程序流程图6所示
图4遥控码读入程序流程图图5遥控码发射处理程序图图6主程序流程图
3调试与操作说明
3.1程序的编译及下载
1、创建工程并选择AT89C52型号芯片。
2、新建remote.c文件。
3、编写源程序并编译,如图7所示。
图7学习型遥控器的程序编译图
4、打开STC-ISP下载软件,选择STC89C52RC型号的芯片,选择串口1并导入编译生成的hex文件。
5、将单片机与计算机的串口相连,并将程序下载至单片机,如图7所示。
图8学习型红外遥控器程序下载图
3.2实际电路的测试
程序下载进单片机后,打开单片机开发板上电源接口开关以及P1口电源切换开关,按下中断0控制键,待绿色的流水灯亮后,将电视遥控器对准单片机开发板上的红外接收头按下某个按键,当绿灯熄灭时,此时代表学习完成了,然后关闭P1口电源切换开关按下单片机开发板上的发射键对电视机进行遥控操作。
测试可知,本次设计的学习型遥控器完全符合要求,达到了预期目的。
4课程设计心得体会
本次课程设计的基于单片机学习型红外遥控器,在keil软件上进行了进行C程序的设计、编译,并将输出的的hex文件通过STC_ISP_V479下载到单片机中,最后在单片机开发板上进行调试,测试硬件电路功能。
经过实践验证,本设计是正确的。
测试中,我们选取了电视机的遥控器作为学习对象,通过学习遥控器上某个键的功能,能实现单片机对电视机的控制。
达到预期目的,设计完全成功。
本文给出的设计思想也适用于其他基于单片机的系统设计。
我们这次课程设计是通过小组的讨论与实验所完成的,在进行过程中碰到了一些困难。
首先,本次设计是采用keil与STC_ISP_V479软件来完成的。
因此对于这两种软件的使用也提出了一定的要求。
其次,由于在设计遥控码的码宽时,参数设置不够恰当,导致单片机无法成功对遥控器的按键功能进行学习。
再次,在硬件电路功能测试过程中,由于实际的单片机开发板的电路连接与本课程设计的硬件电路不完全一致,导致无法进行调试。
通过修改信号输入输出端口,并结合实际的单片机开发板硬件连接进行外部控制,最终成功实现了学习型遥控器的学习功能。
通过这次实验我们感觉到动手能力及思维方式得到很大的加强。
在这次课程设计中,我们学会了怎样去根据课题的要求运用学过的知识去设计电路和调试电路。
从中我们发现了实践的重要性,在以后的学习中我们要加强理论与实际的结合。
而且这次实验也体现了团队合作的重要性与探索精神的必要性。
5元器件及仪器设备明细
表1元器件及仪器设备明细表
名称
数量
备注
微计算机
一台
keil软件
一套
STC_ISP_V749软件
一套
STC89C52单片机
一片
电视机
一台
电视机遥控器
一个
电阻
三个
10K
电阻
两个
0.56K
电阻
一个
0.01K
电阻
一个
4.7K
电容
一个
0.001F
电容
一个
0.01F
轻触开关
两个
三极管
三个
红外接收器
一个
红外发射器
一个
6参考文献
[1]舒经文.最新彩电机芯及其遥控系统的原理与维修[M].北京:
电子工业出版社,1993
[2]李华.MCS-51系列单片机实用接口技术[M].北京:
航天航空大学出版社,1999
[3]麦山.基于单片机的协议红外遥控系统.电子技术[M]:
1998
[4]何立民.MCS-51系列单片机应用系统设计,系统配置与接口技术[M].北京:
航空航天大学出版社,1995
[5]刘宁生周哨山.脉冲与数字电路[M].北京:
中国广播电视出版社,1995
[6]康光华,陈大钦.电子技术基础(模拟部分)[M].高等教育出版社.1999.6.第四版
[7]李建华.实用遥控器原理与制作[M].北京:
人民邮电出版社,1996
7致谢
本次课程设计主要由我们两人共同完成,其间当然老师也同样是付出了大量的时间和精力来帮助我们。
不论结果怎样,我们都会欣然接受,因为我们努力过了。
同时我们也要衷心地感谢我们所有的老师,以及帮助我们的同学,要是没你们的帮助我们是不能这么好的完成这次课程设计的。
8附录
/*********************************************************************/
//remote.c
//学习型遥控器
//使用keilc512004.10.12
/*********************************************************************/
//使用AT89C52单片机,12MHZ晶振,
#include
#include//_nop_();延时函数用
#defineucharunsignedchar
#defineuintunsignedint
sbitstudylamp=P1^7;//学习状态指示灯
sbitlamp=P1^2;//发射指示灯
sbitstudykey=P3^2;//学习键(中断口)
sbitremotein=P1^1;//遥控信号输入口
sbitremoteout=P1^0;//遥控输出口
sbittxkey=P3^3;//发射键
//
uinti,j,m=255,n,k,s,t;
ucharidataremotedata[206];//存肪冲宽度数据用
uinthead,tou;//存起始位用
uintremdata;
////
/*********1毫秒延时程序**********/
delay1ms(uintt)
{
for(i=0;ifor(j=0;j<120;j++)
;
return-1;
}
//
/***********初始化函数**********/
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;//外中断允许
EA=1;//开总中断
EX1=0;
return-1;
}
/**********键功能函数************/
keywork()
{
if(txkey==0)
{
//while(txkey==0);
remoteout=0;
n=0;
delay1ms
(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];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_();}
n++;
}
}
return-1;
}
//
/***********主函数***************/
main()
{
n=0;
head=0;
tou=0;
remdata=0x00;
clearmen();//初始化
while
(1)
{
keywork();//按键扫描
}
}
//
/*********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=0x00;
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=0x00;
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=0x00;//脉宽计数器清
}
end:
lamp=0;studylamp=1;
}
//
//*********************结束//**************************//