红外遥控总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

红外遥控器的制作
摘要
本文以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所示:
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 <reg52.h>
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();
}
}
/***********************定时器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<endcount);
/**********************发送4.5ms的结果码***********************/ endcount=117;
flag=0;
count=0;
do{}while(count<endcount);
/********************发送十六位地址的前八位*******************/ irdata=iraddr1;
for(i=0;i<8;i++)
{
/*****先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)*****/ endcount=10;
count=0;
do{}while(count<endcount);
/***********停止发送红外信号(即编码中1.68ms的高电平)*************/ if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
{
endcount=41; //1为宽的高电平
}
else
{
endcount=15; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
/**********************发送十六位地址的后八位******************/ irdata=iraddr2;
for(i=0;i<8;i++)
{ endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{ //红外数据传输
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
/******************发送八位数据********************************/ irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
rdata=irdata>>1;
}
/***********************发送八位数据的反码**********************/ irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//红外数据传输
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void delay(unsigned int z)
{
unsigned char x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*********************4×4键盘扫描按下按键发射数据************************/ void keyscan()
{
P2=0xfe; //第一行
temp=P2;
temp=temp&0xf0; //判断有无按键按下
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&0xf0;
}
P1=table[num-1];
SendIRdata(table[num-1]);
}
P2=0xfd; //第二行
temp=P2;
temp=temp&0xf0; //判断有无按键按下
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&0xf0;
}
P1=table[num-1];
SendIRdata(table[num-1]);
}
P2=0xfb; //第三行
temp=P2;
temp=temp&0xf0; //判断有无按键按下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&0xf0;
}
P1=table[num-1];
SendIRdata(table[num-1]);
}
P2=0xf7; //第四行
temp=P2;
temp=temp&0xf0; //判断有无按键按下
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&0xf0;
}
P1=table[num-1];
SendIRdata(table[num-1]);
}
}
6.2接收程序
#include<reg52.h>
#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]&0x7f))) //本次接收码的判断
{
for(i=0;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米多。

相关文档
最新文档