《红外遥控总结》.docx
《《红外遥控总结》.docx》由会员分享,可在线阅读,更多相关《《红外遥控总结》.docx(16页珍藏版)》请在冰豆网上搜索。
《红外遥控总结》
《红外遥控总结》
红外遥控器的制作
摘要
本文以STC89C52单片机为核心,设计和制作了一个红外遥控收发系统,其结构主要由单片机控制和数据处理模块、4X4键盘模块、发射模块、接收显示模块等部分组成,具有按键编码发射、数据接收处理、显示等功能。
本设计具有体积小、功耗低、功能强、成本低等特点。
适用于彩电、录像机、音响设备、空调机以及玩具等其他小型电气装置上。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外遥控不仅完全可靠而且能有效地隔离电气干扰。
具有较大的实际意义和应用价值。
本论文及系统设计、硬制作和程序调试于一身,是理论与实际的结合,应用了我们所学的单片机、模拟电子、数字电子等知识,对培养和提高应用所学理论知识解决实际问题的能力、动手能力和创新能力具有较大帮助。
关键词:
STC89C52单片机、红外接收、红外发射。
1概
述
2红外遥控的功能与特
占•••••••
小、
••••
3总体设计方
案
4系统硬电路设
计
4.1发射电路部
分
4.2接收电路部
分
5遥控程序的发射及接收流程
图
6遥控的发射及接收程
序
1概述
红外遥控的频带宽,能携带的信息量多,不易受干扰。
由于红外线的频谱居于可见光之外,所以抗干扰能力强,具有广泛的直线传播特性,不易产生相互干扰,是很好的信息传输媒体。
信息可以直接对红外光进行调制,接收端再去掉载波,取到信息。
容易实现信息的传送,所以在日常生活中应用广泛。
2红外遥控的功能与特点
红外遥控技术是一种利用红外线进行点对点通信的技术,其相应的软和硬技术都已经比较成熟。
它是把红外线作为载体的红外遥控方式。
由于红外线的波长远小于无线电的波长,因此在采用红外遥控方式时,不会干扰电器的正常工作,也不会影响临近的无线电设备。
红外线是利用波长为0.6~1.5微米之间的近红外信号来传递控制信号的。
它具有以下特点:
1.
由于为不可见光,因此,对环境影响很小。
红外线的波长远小于无线电的波长,所以,红外线不会干扰其他家电,也不会影响临近的无线电设备。
2.
红外线为不可见光,具有很强的保密性和隐蔽性,因此在防盗、警戒等安全保卫装置中也得到广泛应用。
3.
红外遥控的遥控距离一般为几米至几十米或更远。
4.
红外遥控具有结构简单,制作方便,成本低廉,抗干扰能力强,工作可靠性高等一系列优点。
同时,由于红外遥控器,工作电压低,功耗小,外围电路简单,因此,在日常生活中广泛应用。
3总体设计方案
利用单片机控制红外线传输方式进行遥控系统的收发。
总体方案结构如图1:
图1
总体方案结构
在发射部分采用4X4按键,以及单片机最小系统,和红外反射管,其框图如图2所示:
图2
红外发射框图
在接收显示部分,使用了红外接收头,单片机最小系统,以及数码管显示,其框图如图3所示:
图3
红外接收框图
4系统硬电路设计
4.1发射电路部分
1)
1、0和1
的编码
根据NEG格式编码原理,当发射器按键按下后,就有遥控码发出,故按下的键不同遥控码也不同。
这种遥控码具有以下特征:
采用脉宽调制串行码,以脉宽0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1"。
2)
按键的编码
当我们按下遥控器的按键时,遥控器将发出一串二进制代码,我们称它为一帧数据。
根据各部分的功能。
可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。
遥控器发射代码时.均是低位在前。
高位在后。
引导码高电平为4.5ms,低电平为4.5mso当接收到此码时.表示一帧数据的开始。
单片机可以准备接收下面的数据。
地址码由8位二进制组成,共256种。
地址码重发一次可以加强遥控器的可靠性。
如果两次地址码不相同.则说明本帧数据有错,应丢弃。
不同的设备可以拥有不同的地址码,因此,同种编码的遥控器只要设置地址码不同,也不会相互干扰。
地址码为十六进制的0EII(注意低位在前),在同一个遥控器中,所有按键发出的地址码都是相同的;数据码为8位,可编码256种状态,代表实际所按下的键;数据反码是数据码的各位求反。
通过比较数据码与数据反码,可判断接收到的数据是否正确。
如果数据码与数据反码之间的关系不满足相反的关系.则本次遥控接收有误,数据应丢弃。
在同一个遥控器上,所有按键的数据码均不相同。
数据码为十六进制的OCH,数据反码为十六进制的0F3H(注意低位在前).两者之和应为OFFHo
3)
红外发射电路图
如图4所示:
图4
红外发射电路
4.2接收电路部分
1)
红外接收
红外遥控接收可采用一体化红外接收头,它将红外接收二极管、放大、解调、整形等电路做在一起,只有三个引脚,分别是+5V电源、地、信号输出。
红外接收头的信号输出接单片机的INTO或INT1脚。
2)
遥控信号的解码算法及程序编制
平时,遥控器无键按下,红外发射二极管不发出信号,遥控接收头输出信号1;有键按下时,0和1编码的高电平经过遥控头反相后会输出信号0。
由于与单片机的中断脚相连,将会引起单片机中断(单片机预先设定为下降沿时产生中断)。
单片机在中断时使用定时器0或定时器1开始计时,到下一个脉冲到来时,即再次产生中断时,先将计数值取出。
清零计数值后再开始计时,通过判断每次中断与上一次中断之间的时间间隔,便可知接收到的是引导码还是
0或1。
如果计数值为9ms,接收到的是引导码;如果计时值等于1・12ms,接收到的是编码0;如果计数值等于2
25ms,接收到的是编码1。
在判断时间时,应考虑一定的误差值。
因为不同的遥控器由于晶振参数等原因,发射及接收到的时间也会有很小的误差
3)
解码方法如下:
(1)设外部中断0(或者1)为下降沿中断,定时器0(或者1)为16位计时器.初始值均为0。
(2)第一次进入遥控中断后,开始计时。
(3)从第二次进入遥控中断起,先停止计时。
并将计时值保存后,再重新计时。
如果计时值等于前导码的时间,设立前导码标志。
准备接收下面的一帧遥控数据,如果计时值不等于前导码的时间,但前面已接收到前导码,则判断是遥控数据的()还是1。
(4)继续接收下面的地址码、数据码、数据反码。
(5)当接收到32位数据时,说明一帧数据接收完毕。
此时可停止定时器的计时,并判断本次接收是否有效。
如果两次地址码相同且等于本系统的地址,数据码与数据反码之和等于OFFH,则接收的本帧数据码有效,否则丢弃本次接收到的数据。
(6)接收完毕,初始化本次接收的数据,准备下一次遥控接收。
4、红外接收电路图
如图5所示:
图5
红外接收电路
5遥控程序的发射及接收流程图
5.1发射流程图
如图6所示:
图6
发射流程图
6.2接收流程图接
1)接收主程序流程图如图7所示
图7
接收主程序流程图
2)接收子程序流程图如图8所示
图8
接收子程序流程图
6遥控的发射及接收程序
6.1发射程序
#include
static
bit
OP;
〃红外发射管的亮灭
static
unsigned
int
count;
〃延时计数器
static
unsigned
int
endcount;
//终止延时计数
static
unsigned
int
temp;
//按键
static
unsigned
char
flag;
//红外发送标志
static
unsigned
char
num;
sbitir_in=P3^4;
//红外发射管脚
//sbit
LED二P0"0;
char
iraddrl;
〃十六位地址的第一个字节
char
iraddr2;
//十六位地址的第二个字节
unsigned
char
code
table[]={
0xf9,0xa4,OxbO,0x99,0x92,0x82,0xf8,0x80,0x90,OxcO,0x88,0x83,0xc6,Oxal,0x86,0x8e
};
〃共阳数码管
//红外数据传输void
SendIRdata(char
p_irdata);
//红外数据传输void
delay(unsignedint);
void
keyscan();
//4键盘扫描
void
main(void)
num=O;
Pl=0x3f;count
0;
flag
0;
OP
0;
ir_in=
0;
EA
1;
//允许CPU中断
TMOD
0x11;
〃设定时器0和1为16位模式1
ETO
1;
//定时器0中断允许
TII0
OxFF;
TLO
0xE6;
//设定时值0为38K
也就是每隔26us中断一次
TRO
1;
〃开始计数
iraddrl=3;
//00000011
iraddr2=252;
//11111100
do
keyscan();
)
wh订e⑴;
}
/***********************定时器0中断处理
vXx
void
timeint(void)
interrupt
1
{
TH0=0xFF;
TL0=0xE6;
//设定时值为38K
也就是每隔26us中断一次
count++;
if
(flag==l)
0P=~0P;
//发射管亮
}
else
OP
0;
}
ir_in=
OP;//红外发射
//LED二OP;
}
void
SendIRdata(char
p_irdata)
{
//红外数据传输
int
1;
char
irdata二p_irdata;
//发送9ms的起始码
endcount二223;
flag=l;
count=0;
do{}while(count>l;
}
irdata=iraddr2;
for(i=0;i>l;
/******************发送八位数据
^ix
irdata=p_irdata;
for(i=0;i>l;
irdataJp—irdeita;
for(i=0;i>l;
}
//红外数据传输
endcount二10;
flag=l;
count二0;
do{}while(countO;x--)
for(y=110;y>0;y--);
}
/*********************4X4键盘扫描按下按键发射数据
voidkeyscan(){
P2=0xfe;//第一行temp二P2;
temp二temp
//判断有无按键按下while(temp!
=0xf0)
//有按键按下
{
//delay(5);
temp二P2;
switch(temp)
case
Oxee:
num二1;
break;
case
Oxde:
num二2;
break;
case
Oxbe:
num=3;
break;
case
0x7e:
num二4;
break;
while(temp!
=OxfO)
temp二P2;
temp=temp
Pl二table[num-1];
SendIRdata(table[num-1]);
P2=0xfd;
//第二行
temp二P2;
temp二temp
//判断有无按键按下while(temp!
=OxfO)
//有按键按下
{
temp二P2;
switch(temp)
{
case
Oxed:
num二5;
break;
case
Oxdd:
num二6;
break;
case
Oxbd:
num=7;
break;
case
0x7d:
num二8;
break;
}
while(temp!
=0xf0)
temp=P2;
temp二temp
}
Pl=table[num-1];
SendIRdata(table[numT]);
}
P2=0xfb;
//第三行
temp=P2;
temp二temp
//判断有无按键按下
while(temp!
=OxfO)
//有按键按下
{
temp二P2;
switch(temp)
{
case
Oxeb:
num二9;
break;
case
Oxdb:
num二10;
break;
case
Oxbb:
num二11;
break;
case
0x7b:
num二12;
break;
while(temp!
=OxfO)
temp二P2;
temp=temp
Pl二table[num-1];
SendIRdata(table[num~l]);
P2二Oxf7;
//第四行
temp二P2;
temp二temp
〃判断有无按键按下
while(temp!
=OxfO)
//有按键按下
{
temp二P2;
switch(temp)
{
case
0xe7:
num=13;
break;
case
0xd7:
num=14;
break;
case
0xb7:
num二15;
break;
case
0x77:
num=16;
break;
while(temp!
=0xf0)
temp二P2;
temp二temp
}
Pl=table[num-1];
SendIRdata(table[numT]);
}
}
6.2接收程序
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
dis_num,num,numl,num2tnum3;
sbit
led=PO0;
unsigned
char
code
table[]={
OxcO,0xf9,0xa4,OxbO,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,Oxal,0x86,0x8e
};
//共阳数码管
0〜~f
sbit
prem
二P3“2;
//定义遥控头的接收脚
uchar
ram[4]={0,0,0,0};//存放接受到的4个数据
地址码16位+按键码8位+按键码取反的8位
void
delaytime(uint
time)
//延迟90uS
{
uchar
a,b;
for(a=time;a>0;a一一)
for(b=40;b>0;b--);
}
)
void
rem()interrupt
0
〃中断函数
{
uchar
ramc=0;
〃定义接收了4个字节的变量
uchar
count二0;
〃定义现在接收第几位变量
uint
1=0;
//此处变量用来在下面配合连续监测9MS
内是否有高电平
prem=l;
for(i=0;i