《红外遥控总结》word版 本文关键词:遥控,word
《红外遥控总结》word版 本文简介:红外遥控器的制作摘要本文以STC89C52单片机为核心,设计和制作了一个红外遥控收发系统,其结构主要由单片机控制和数据处理模块、4×4键盘模块、发射模块、接收显示模块等部分组成,具有按键编码发射、数据接收处理、显示等功能。本设计具有体积小、功耗低、功能强、成本低等特点。适用于彩电、录像机、音响设备、
《红外遥控总结》word版 本文内容:
红外遥控器的制作
摘要
本文以STC89C52单片机为核心,设计和制作了一个红外遥控收发系统,其结构主要由单片机控制和数据处理模块、4×4键盘模块、发射模块、接收显示模块等部分组成,具有按键编码发射、数据接收处理、显示等功能。本设计具有体积小、功耗低、功能强、成本低等特点。适用于彩电、录像机、音响设备、空调机以及玩具等其他小型电气装置上。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外遥控不仅完全可靠而且能有效地隔离电气干扰。具有较大的实际意义和应用价值。本论文及系统设计、硬件制作和程序调试于一身,是理论与实际的结合,应用了我们所学的单片机、模拟电子、数字电子等知识,对培养和提高应用所学理论知识解决实际问题的能力、动手能力和创新能力具有较大帮助。
关键词:STC89C52单片机、红外接收、红外发射。
目录
1概述··············································
2红外遥控的功能与特点·······························
3总体设计方案·······································
4系统硬件电路设计···································
4.1发射电路部分····································
4.2接收电路部分····································
5遥控程序的发射及接收流程图·························
6遥控的发射及接收程序·······························
7总结···············································
1概述
红外遥控的频带宽,能携带的信息量多,不易受干扰。由于红外线的频谱居于可见光之外,所以抗干扰能力强,具有广泛的直线传播特性,不易产生相互干扰,是很好的信息传输媒体。信息可以直接对红外光进行调制,接收端再去掉载波,取到信息。容易实现信息的传送,所以在日常生活中应用广泛。
2红外遥控的功能与特点
红外遥控技术是一种利用红外线进行点对点通信的技术,其相应的软件和硬件技术都已经比较成熟。它是把红外线作为载体的红外遥控方式。由于红外线的波长远小于无线电的波长,因此在采用红外遥控方式时,不会干扰电器的正常工作,也不会影响临近的无线电设备。红外线是利用波长为0.6~1.5微米之间的近红外信号来传递控制信号的。它具有以下特点:
1.
由于为不可见光,因此,对环境影响很小。红外线的波长远小于无线电的波长,所以,红外线不会干扰其他家电,也不会影响临近的无线电设备。
2.
红外线为不可见光,具有很强的保密性和隐蔽性,因此在防盗、警戒等安全保卫装置中也得到广泛应用。
3.
红外遥控的遥控距离一般为几米至几十米或更远。
4.
红外遥控具有结构简单,制作方便,成本低廉,抗干扰能力强,工作可靠性高等一系列优点。同时,由于红外遥控器件,工作电压低,功耗小,外围电路简单,因此,在日常生活中广泛应用。
3总体设计方案
利用单片机控制红外线传输方式进行遥控系统的收发。总体方案结构如图1:
图1
总体方案结构
在发射部分采用4×4按键,以及单片机最小系统,和红外反射管,其框图如图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.5ms。当接收到此码时.表示一帧数据的开始。单片机可以准备接收下面的数据。地址码由8位二进制组成,共256种。地址码重发一次可以加强遥控器的可靠性。如果两次地址码不相同.则说明本帧数据有错,应丢弃。不同的设备可以拥有不同的地址码,因此,同种编码的遥控器只要设置地址码不同,也不会相互干扰。地址码为十六进制的0EH(注意低位在前),在同一个遥控器中,所有按键发出的地址码都是相同的;数据码为8位,可编码256种状态,代表实际所按下的键;数据反码是数据码的各位求反。通过比较数据码与数据反码,可判断接收到的数据是否正确。如果数据码与数据反码之间的关系不满足相反的关系.则本次遥控接收有误,数据应丢弃。在同一个遥控器上,所有按键的数据码均不相同。数据码为十六进制的0CH,数据反码为十六进制的0F3H(注意低位在前).两者之和应为0FFH。
3)
红外发射电路图
如图4所示:
图4
红外发射电路
4.2接收电路部分
1)
红外接收
红外遥控接收可采用一体化红外接收头,它将红外接收二极管、放大、解调、整形等电路做在一起,只有三个引脚,分别是+5V电源、地、信号输出。
红外接收头的信号输出接单片机的INTO或INT1脚。
2)
遥控信号的解码算法及程序编制
平时,遥控器无键按下,红外发射二极管不发出信号,遥控接收头输出信号1;有键按下时,O和1编码的高电平经过遥控头反相后会输出信号O。由于与单片机的中断脚相连,将会引起单片机中断(单片机预先设定为下降沿时产生中断)。单片机在中断时使用定时器0或定时器1开始计时,到下一个脉冲到来时,即再次产生中断时,先将计数值取出。清零计数值后再开始计时,通过判断每次中断与上一次中断之间的时间间隔,便可知接收到的是引导码还是
O或1。如果计数值为9ms,接收到的是引导码;如果计时值等于1.12ms,接收到的是编码O;如果计数值等于2
25ms,接收到的是编码1。在判断时间时,应考虑一定的误差值。因为不同的遥控器由于晶振参数等原因,发射及接收到的时间也会有很小的误差
3)
解码方法如下:
(1)设外部中断0(或者1)为下降沿中断,定时器0(或者1)为16位计时器.初始值均为O。
(2)第一次进入遥控中断后,开始计时。
(3)从第二次进入遥控中断起,先停止计时。并将计时值保存后,再重新计时。如果计时值等于前导码的时间,设立前导码标志。准备接收下面的一帧遥控数据,如果计时值不等于前导码的时间,但前面已接收到前导码,则判断是遥控数据的O还是1。
(4)继续接收下面的地址码、数据码、数据反码。
(5)当接收到32位数据时,说明一帧数据接收完毕。此时可停止定时器的计时,并判断本次接收是否有效。如果两次地址码相同且等于本系统的地址,数据码与数据反码之和等于0FFH,则接收的本帧数据码有效,否则丢弃本次接收到的数据。
(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;
sbit
ir_in=P3^4;
//红外发射管脚
//sbit
LED=P0^0;
char
iraddr1;
//十六位地址的第一个字节
char
iraddr2;
//十六位地址的第二个字节
unsigned
char
code
table[]={
0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
//共阳数码管
0~~f
//红外数据传输
void
SendIRdata(char
p_irdata);
//红外数据传输
void
delay(unsigned
int);
void
keyscan();
//4键盘扫描
/******************主函数**************************/
void
main(void)
{
num=0;
P1=0x3f;
count
=
0;
flag
=
0;
OP
=
0;
ir_in=
0;
EA
=
1;
//允许CPU中断
TMOD
=
0x11;
//设定时器0和1为16位模式1
ET0
=
1;
//定时器0中断允许
TH0
=
0xFF;
TL0
=
0xE6;
//设定时值0为38K
也就是每隔26us中断一次
TR0
=
1;
//开始计数
iraddr1=3;
//00000011
iraddr2=252;
//11111100
do
{
keyscan();
}
while(1);
}
/***********************定时器0中断处理*********************/
void
timeint(void)
interrupt
1
{
TH0=0xFF;
TL0=0xE6;
//设定时值为38K
也就是每隔26us中断一次
count++;
if
(flag==1)
{
OP=~OP;
//发射管亮
}
else
{
OP
=
0;
}
ir_in=
OP;//红外发射
//LED=OP;
}
void
SendIRdata(char
p_irdata)
{
//红外数据传输
int
i;
char
irdata=p_irdata;
//发送9ms的起始码
endcount=223;
flag=1;
count=0;
do{}while(count>1;
}
/**********************发送十六位地址的后八位******************/
irdata=iraddr2;
for(i=0;i>1;
}
/******************发送八位数据********************************/
irdata=p_irdata;
for(i=0;i>1;
}
/***********************发送八位数据的反码**********************/
irdata=~p_irdata;
for(i=0;i>1;
}
//红外数据传输
endcount=10;
flag=1;
count=0;
do{}while(count0;x--)
for(y=110;y>0;y--);
}
/*********************4×4键盘扫描按下按键发射数据************************/
void
keyscan()
{
P2=0xfe;
//第一行
temp=P2;
temp=temp
//判断有无按键按下
while(temp!=0xf0)
//有按键按下
{
//delay(5);
temp=P2;
switch(temp)
{
case
0xee:num=1;
break;
case
0xde:num=2;
break;
case
0xbe:num=3;
break;
case
0x7e:num=4;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp
}
P1=table[num-1];
SendIRdata(table[num-1]);
}
P2=0xfd;
//第二行
temp=P2;
temp=temp
//判断有无按键按下
while(temp!=0xf0)
//有按键按下
{
temp=P2;
switch(temp)
{
case
0xed:num=5;
break;
case
0xdd:num=6;
break;
case
0xbd:num=7;
break;
case
0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp
}
P1=table[num-1];
SendIRdata(table[num-1]);
}
P2=0xfb;
//第三行
temp=P2;
temp=temp
//判断有无按键按下
while(temp!=0xf0)
//有按键按下
{
temp=P2;
switch(temp)
{
case
0xeb:num=9;
break;
case
0xdb:num=10;
break;
case
0xbb:num=11;
break;
case
0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp
}
P1=table[num-1];
SendIRdata(table[num-1]);
}
P2=0xf7;
//第四行
temp=P2;
temp=temp
//判断有无按键按下
while(temp!=0xf0)
//有按键按下
{
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
}
P1=table[num-1];
SendIRdata(table[num-1]);
}
}
6.2接收程序
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
dis_num,num,num1,num2,num3;
sbit
led=P0^0;
unsigned
char
code
table[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,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
i=0;
//此处变量用来在下面配合连续监测9MS
内是否有高电平
prem=1;
for(i=0;i<1100;i++)
//以下FOR语句执行时间为8MS左右
{
if(prem)
//进入遥控接收程序首先进入引导码的前半部判断,即:是否有9MS左右的低电平
return;
//引导码错误则退出
}
while(prem!=1);
//等待引导码的后半部
4.5
MS
高电平开始的到来。
delaytime(50);
//延时大于4.5MS时间,跨过引导码的后半部分,来到真正遥控数据
32位中
//第一位数据的0.56MS开始脉冲
for(ramc=0;ramc<4;ramc++)//循环4次接收4个字节
{
for(count=0;count<8;count++)
//循环8次接收8位(一个字节)
{
while(prem!=1);
//开始判断现在接收到的数据是0或者1
,首先在这行本句话时,
保已经进入数据的0.56MS
低电平阶段
//等待本次接受数据的高电平的到来。
delaytime(9);
//高电平到来后,数据0
高电平最多延续0.56MS,而数据1,高电平可延续1.68MS
//红外数据传输
//延续1.66MS大于0.8MS
后我们可以再判断遥控接收脚的电平,
if(prem)
//如果这时高电平仍然在继续那么接收到的数据是1的编码
{
ram[ramc]=(ram[ramc]<<1)+1;//将目前接收到的数据位1放到对应的字节中
delaytime(11);
//如果本次接受到的数据是1,那么要继续延迟1MS,这样才能跨入下个位编码的低电平中(即是开始的0.56MS中)
}
else
//否则目前接收到的是数据0的编码
ram[ramc]=ram[ramc]<<1;
//将目前接收到的数据位0放到对应的字节中
}
//本次接收结束,进行下次位接收,此接收动作进行32次,正好完成4个字节的接收
}
if(ram[2]!=(~(ram[3]i<4;i++)
//没有此对应关系则表明接收失败,清除接受到的数据
ram[i]=0;
return
;
}
dis_num=ram[2];
//将接收到的按键数据赋给显示变量
}
main()
{
IT0=1;
//设定INT0为边沿触发
EX0=1;
//打开外部中断0
EA=1;
//全局中断开关打开
while(1)
{
switch(dis_num)
{
case
0x81:
num=0;
break;
case
0xcf:
num=1;
break;
case
0x92:
num=2;
break;
case
0x86:
num=3;
break;
case
0xcc:
num=4;
break;
case
0xa4:
num=5;
break;
case
0xa0:
num=6;
break;
case
0x8f:
num=7;
break;
case
0x80:
num=8;
break;
case
0x84:
num=9;
break;
case
0x88:
num=10;break;
case
0xe0:
num=11;break;
case
0xb1:
num=12;break;
case
0xc2:
num=13;break;
case
0xb0:
num=14;break;
case
0xb8:
num=15;break;
}
P1=table[num];
P0=0xf0;
delaytime(5);
}
}
7总结
通过红外发射与红外界接收电路实现了红外遥控的控制,不过在实验中应注意传输距离的提高。提高传输距离的方法如下:
1)
尽量提高脉冲峰值电流,减小占空比,一般彩电红外遥控器工作脉冲占空比为1/4~1/3。本实验中用占空比1/3。
2)
减小9014的集电极电阻。在实验中,集电极电阻接100欧姆电阻时,发射距离可以达到4米多
。