基于单片机的红外线遥控器设计.docx
《基于单片机的红外线遥控器设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的红外线遥控器设计.docx(17页珍藏版)》请在冰豆网上搜索。
基于单片机的红外线遥控器设计
毕业设计
姓名:
专业:
班级:
指导教师:
课程设计任务书
姓名:
钟思
专业:
自动化
班级:
1301班
设计课题:
基于单片机的红外线遥控器设计
指导教师:
电子信息工程系印制
二○一五年十二月
第一章红外发射部分
1.设计要求与指标
红外遥控是目前使用较多的一种遥控手段。
功能强、成本低等特点。
系统。
设计要求利用红外传输控制指令及智能控制系统,借助微处理器强大灵活的控制功能发出脉冲编码,组成的一个遥控系统。
本设计的主要技术指标如下:
(1)遥控范围:
0—1米
(2)显示可控制的通道
(3)灵敏可靠,抗干扰能力强
(4)控制用电器电流最高为2A
红外遥控的特点是不影响周边环境的、不干扰其他电器设备。
由于其无法穿透墙壁,故不同房间的家用电器可使用通用的遥控器而不会产生相互干扰;多路遥控。
红外遥控系统由发射和接收两大部分组成,系统采用编/解码专用集成电路和单片机芯片来进行控制操作。
设计的电路由几个基本模块组成:
直流稳压电源,红外发射电路,红外接收电路及控制部分。
发射电路,利用遥控发射利用键盘,这种代码指令信号调制在40KHz的载波上,激励红外光二极管产生具有脉冲串的红外波,通过空间的传送到受控机的遥控接收器。
2.红外遥感发射系统的设计
红外遥控系统由发射和接收两大部分组成,系统采用编/解码专用集成电路和单片机芯片来进行控制操作。
发射系统设计的电路由如下的几个基本模块组成:
直流稳压电源,红外发射电路。
系统框图如图所示。
3.红外发射电路的设计
3.1.摇控码的编码格式
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合二进制的“1”。
3.2遥控码的发射
当某个操作按键按下时,单片机先读出键值,然后根据键值设定遥控码的脉冲个数,再调制成40kHz方波由红外线发光管发射出去。
P3.5端口的输出调制波如图2-2所示。
图2-2单一按键波形
图2-2连续按键波形
3.3红外发射电路图
遥控发射通过键盘,每按下一个键,即产生具有不同的编码数字脉冲,这种代码指令信号调制在40KHz的载波上,激励红外光二极管产生不同的脉冲,通过空间的传送到受控机的遥控接收器。
电路如下图所示。
4调试结果及其分析
(1)电路要求遥控控制距离为0—1m,在利用38KHz的接收头时,虽然能接收到信号,但是接收的距离很有限。
经过反复调试,换用40KHz的接收头时基本满足了设计需求。
(2)由于将3ms的接收脉冲放在1ms的后面,编码解调出现错误,导致接受端无信号输出。
解决方法是将3ms的接收脉冲放在前面就可以接收到信号。
单
片机进行数码帧的接收处理,3ms的脉冲检验,当第一位低电平码的脉宽小于2ms时就会错误处理。
在初始化过程中,将P1口全置0,但是继电器仍工作,通过反复调试,将初始化的P1口全置1,通过反向使得输出全为0,从而满足上电复位,继电器掉电,满足初始化要求。
第二章红外接受部分
1.红外遥控系统的设计
红外遥控系统由发射和接收两大部分组成,系统采用编/解码专用集成电路和单片机芯片来进行控制操作。
设计的电路由如下的几个基本模块组成:
红外发射电路,红外接收电路及控制部分。
1.系统框图(如图3-1所示)
2.XTAL2接外部晶体的另一个引脚。
在单片机内部,它是上述振荡器的反相放大器的输出端。
采用外部振荡器时,此引脚应悬浮不连接。
3.输入/输出引脚P0.0~P0.7、P10.~P1.7、P2.0~P2.7和P3.0~P3.7。
①P0端口(P0.0~P0.7)P0是一个8位漏极开路型双向I/O端口。
作为输出口用时,
每位能以吸收电流的方式驱动8个TTL输入,对端口写1时,又可作高阻抗输入端用。
在访问外部程序和数据存储器时,它是分时多路转换的地址(低8位)/数据总线,在访问期间激活了内部的上拉电阻。
②P1端口(P1.0~P1.7)P1是一个带有内部上拉电阻的8位双向I/O端口。
P1的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。
对端口写1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。
因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。
③P2端口(P2.0~P2.7)P2是一个带有内部上拉电阻的8位双向I/O端口。
P2的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。
对端口写1时,通过内部的上拉电阻把端口拉到高电位,P2作输入口使用时,因为有内部的上拉电阻,这时可用作输入口。
P2作为输入口时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。
在访问外部程序存储器和16位地址的外部数据存储器(如执行MOVX@DPTR指令)时,P2送出高8位地址。
在访问8位地址的外部数据存储器(如执行MOVX@Ri,A指令)时,P2口引脚上的内容,在整个访问期间不会改变。
④P3端口(P3.0~P3.7)P3是一个带有内部上拉电阻的8位双向I/O端口。
P2的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。
对端输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。
在AT89C52中,P3端口还用于一些专门功能,这些兼用功能如下:
(1)P3.0RXD(串行输入口)
(2)P3.1TXD(串行输出口)
(3)P3.2/INT0(外部中断0)
(4)P3.3/INT1(外部中断1)
(5)P3.4T0(记时器0外部输入)
(6)P3.5T1(记时器1外部输入)
(7)P3.6/WR(外部数据存储器写选通)
(8)P3.7/RD(外部数据存储器读选通)
(9)P3口同时为闪烁编程和编程校验接收一些控制信号
4.振荡器特性:
XTAL1和XTAL2分别为反向放大器,该反向放大器可以配置为片内振荡器。
石英震荡和陶瓷震荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
由于输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
5.芯片擦除:
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,ALE管脚处于低电平10ms来完成。
在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
主控制器采用ATMEL公司的8位单片机AT89C52。
AT89C52是一个低功耗,高性能CMOS8位单片机,片内含8kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统。
图3-9:
主控制器电路原理图
2.系统的功能实现方法
2.1摇控码的编码格式
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合二进制的“1”,其波形如图4所示。
图4遥控码的“1”和“0”
红外遥控发射芯片采用PPM编码方式,当发射器按键按下后,将周期性地发出同一种32位二进制码,周期约为108ms的编码脉冲。
遥控编码脉冲由前导码、16位地址码(8位地址码、8位地址码的反码)和16位操作码(8位操作码、8位操作码的反码)组成。
通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之间的干扰。
编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。
前导码是一个遥控码的起始部分,由一个9ms的高电平(起始码)和一个4.5ms的低电平(结果码)组成,作为接受数据的准备脉冲。
图5发送一组完整的编码脉冲
上述“0”和“1”组成的32位二进制码经38khz的载频进行二次调制以提高发射频率,然后再通过红外发射二极管产生红外线向空间发射。
2.2遥控码的发射
当某个操作按键按下时,单片机先读出键值,然后根据键值设定遥控码的脉冲个数,再调制成40kHz方波由红外线发光管发射出去。
P3.5端口的输出调制波如图4-1所示。
2.3数码帧的接收处理
当红外线接收器输出脉冲帧数据时,第一位码的低电平将启动中断程序实时接收数据帧。
在数据帧接收时,将对第一位码的码宽进行验证。
若第一位低电平码的的脉宽小于2ms,将作为错误码处理。
当间隔位的高电平脉宽大于3ms时,结束接收,然后根据累加器A中的脉冲个数,执行相应输出口操作。
图4-2就是红外线接收器输出的一帧遥控码波形图。
3.红外接受电路图
在接收过程中,脉冲通过光学滤波器和红外二极管转换为40KHZ的电信号,此信号经过放大,检波,整形,解调,送到解码与接口电路。
如图5-1所示。
通常,红外遥控器将遥控信号(二进制脉冲码)调制在40KHz的载波上,经缓冲放大后送至红外发光二极管,产生红外信号发射出去。
将上述的遥控编码脉冲对频率为40KHz(周期为26.3ms)的载波信号进行脉幅调制(PAM),再经缓冲放大后送到红外发光管,将遥控信号发射出去。
4.软件设计:
本系统的软件程序主要包括主程序、接收解码程序、发射程序、遥控器学习识别程序几个大的模块程序。
5.调试结果及分析:
本电路总共设计了21个输入按键,其中11个为特殊按键,其他键均为数字键。
当输入一个按键0时,通过红外发射和接收电路,对应的继电器1的设备工作,液晶显示十六进制代码。
当按下按键1时,数码管显示不同的十六进制代码。
以此类推0—9号数字键功能同上,特殊按键,根据按的特殊按键的不同,会实现不同功能,如快进。
本设计在调试过程中也遇到很多问题。
1.电路要求遥控控制距离为0—1m,在利用38KHz的接收头时,虽然能接收到信号,但是接收的距离很有限。
经过反复调试,换用40KHz的接收头时基本满足了设计需求。
在初始化过程中,将P1口全置0,但是继电器仍工作,通过反复调试,将初始化的P1口全置1,通过反向使得输出全为0,从而满足上电复位,继电器掉电,满足初始化要求。
6.结论:
由于目前的遥控装置大多对某一设备进行单独控制,而在本设计中的红外遥控电路设计了多个控制按键,可以对不同的设备,也可以对同一设备的多个功能进行不同的控制。
基本符合技术要求。
但是本电路也有不完,它只能单通道实现对多个设备的控制,即它不能同时控制两个或者两个以上的设备。
在设计过程中,通过大量的查阅资料,认真研究材料,对单片机有了更为深刻的理解,在设计软件时,须仔细的分析硬件电路,画出程序流程图,培养了我的耐性和刻苦钻研的精神。
参考文献
[1]全国大学生电子设计竞赛组委会.第五届全国大学生电子设计竞赛获奖作品选编,第1版,北京理工大学出版社,2005年,P10-17.
[2]康华光,陈大钦.电子技术基础模拟部分,第4版,高等教育出版社,1999年,第四版,P82-155.
[3]康华光,邹寿彬.电子技术基础数字部分,第4版,高等教育出版,2000年,第四版,P83-155.
附录:
主程序:
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include
#include
#defineTURE1
#defineFALSE0
sbitIR=P2^2;//红外接口标志
//定义液晶接口
sbitRS=P3^5;//Pin4
sbitE=P3^4;//Pin6
#defineDataP1//数据端口
unsignedinthour,minute,second,count;
charcodeTab[16]="0123456789ABCDEF";
chardataTimeNum[]="";
chardataTest1[]="";
/******************************************************************/
/*变量声明*/
/******************************************************************/
unsignedcharirtime;//红外用全局变量
bitirpro_ok,irok;
unsignedcharIRcord[4];//处理后的红外码,分别是客户码,客户码,数据码,数据码反码
unsignedcharirdata[33];//33个高低电平的时间数据
/******************************************************************/
/*函数声明*/
/******************************************************************/
voidIr_work(void);
voidIrcordpro(void);
voidShowString(unsignedcharline,char*ptr);
/******************************************************************/
/*定时器0中断服务函数*/
/******************************************************************/
voidtim0_isr(void)interrupt1using1//定时器0中断服务函数
{
irtime++;//用于计数2个下降沿之间的时间
}
/******************************************************************/
/*外部中断0函数*/
/******************************************************************/
voidex0_isr(void)interrupt0using0//外部中断0服务函数
{
staticunsignedchari;//接收红外信号处理
if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5ms
i=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
/******************************************************************/
/*屏蔽数码管程序*/
/******************************************************************/
/******************************************************************/
/*定时器0初始化*/
/******************************************************************/
voidTIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;//重载值
TL0=0x00;//初始化值
ET0=1;//开中断
TR0=1;
}
/******************************************************************/
/*外部中断初始化*/
/******************************************************************/
voidEX0init(void)
{
IT0=1;//指定外部中断0下降沿触发,INT0(P3.2)
EX0=1;//使能外部中断
EA=1;//开总中断
}
/******************************************************************/
/*红外键值处理*/
/******************************************************************/
voidIr_work(void)//红外键值散转程序
{
TimeNum[5]=Tab[IRcord[0]/16];//处理客户码并显示
TimeNum[6]=Tab[IRcord[0]%16];
TimeNum[8]=Tab[IRcord[1]/16];//处理客户码并显示
TimeNum[9]=Tab[IRcord[1]%16];
TimeNum[11]=Tab[IRcord[2]/16];//处理数据码并显示
TimeNum[12]=Tab[IRcord[2]%16];
TimeNum[14]=Tab[IRcord[3]/16];//处理数据反码并显示
TimeNum[15]=Tab[IRcord[3]%16];
ShowString(1,TimeNum);//显示处理过后的码值
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,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;
value=0;
}irpro_ok=1;//处理完毕标志位置1
}
/******************************************************************/
/*微秒延时函数*/
/******************************************************************/
voidDelayUs(unsignedcharus)//delayus
{
unsignedcharuscnt;
uscnt=us>>1;/*Crystalfrequencyin12MHz*/
while(--uscnt);
}
/******************************************************************/
/*毫秒函数声明*/
/******************************************************************/
voidDelayMs(unsignedcharms)//delayMs
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
/******************************************************************/
/*写入命令函数*/
/******************************************************************/
voidWriteCommand(unsignedcharc)
{
DelayMs(5);//操作前短暂延时,保证信号稳定
E=0;
RS=0;
_nop_();
E=1;
Data=c;
E=0;
}
/******************************************************************/
/*写入数据函数*/
/******************************************************************/
voidWriteData(unsignedcharc)
{
DelayMs(5);//操作前短暂延时,保证信号稳定
E=0;
RS=1;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/******************************************************************/
/*写入字节函数*/
/******************************************************************/
voidShowChar(unsignedcharpos,unsignedcharc)
{
unsignedcharp