红外遥控的概述:
红外线的光谱位于红色光之外, 波长是0.76~1.5μm,比红光的波长还长。红外遥控是利用红外线进行传递信息的一种控制方式,红外遥控具有抗干扰,电路简单,容易编码和解码,功耗小,成本低的优点。红外遥控几乎适用所有家电的控制。
红外遥控系统的主要部分为调制、发射和接收,如图 所示:
1.调制
红外遥控是以调制的方式发射数据,就是把数据和一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源 功耗。
调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的矩形波,如图2所示,这是由发射端所使用的 455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9 kHz≈38kHz。
2.发射系统
目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。由于发射系统一般用电池供电,这就要求芯片 的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗。芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常 一点误差可以忽略不计。
红外线通过红外发光二极管(LED)发射出去,红外发光二极管(红外发射管)内部构造与普通的发光二极管基本相同,材料和普通发光二极管不同,在红外发射管两端施加一定电压时,它发出的是红外线而不是可见光。
如图3a和图3b是LED的驱动电路,图3a是最简单电路, 选用元件时要注意三极管的开关速度要快,还要考虑到LED的正向 电流和反向漏电流,一般流过LED的最大正向电流为100mA,电流越大,其发射的波形强度越大。
图3a电路有一点缺陷,当电池电压下降时,流过LED的电流会降低,发射波形强度降低,遥控距离就会变小。图3b所示的 射极输出电路可以解决这个问题,两个二极管把三级管基极电压钳位在1.2V左右,因此三级管发射极电压固定在0.6V左右, 发射极电流IE基本不变,根据IE≈IC,所以流过LED的电流也基本不变,这样保证了当电池电压降低时还可以保证一定的遥 控距离。
其实如果你是用单片机来解码或编码发送的话,我可以提供电路图及程序(发送和接收)(c):
发送程序:
#include?<reg52.h>?
#include?<intrins.h>
#define?uint?unsigned?int
#define?uchar?unsigned?char
#define?nop()?_nop_()
uchar?bdata?tt;
uchar?x;
sbit?OP=tt^1;//红外发射管的亮灭
unsigned?int?count;//延时计数器
unsigned?int?endcount;?//终止延时计数
unsigned?char?flag;?//红外发送标志
uchar?iraddr1;?//十六位地址的第一个字节
uchar?iraddr2;?//十六位地址的第二个字节
sbit?yaokong?=?P3^2;
void?SendIRdata(char?p_irdata);
void?delay();
void?main(void)?
{
count?=?0;
flag?=?0;
OP?=?0;
yaokong?=?0;
EA?=?1;?
TMOD?=?0x11;?
ET0?=?1;?
TH0?=?0xFF;?
TL0?=?0xE6;?//设定时值0为38K?也就是每隔26us中断一次?
TR0?=?1;
iraddr1=0x03;
iraddr2=0xfc;
do
{
for(x=125;x<0;x--);
SendIRdata(0x0c);
}while(1);
}?
//定时器0中断处理?
void?timeint(void)?interrupt?1?
{?
TH0=0xFF;? TL0=0xE6;?//设定时值为38K?也就是每隔26us中断一次 count++; if?(flag==1) {OP=~OP;
} else {OP?=?0;
} yaokong?=?OP;}?
void?SendIRdata(char?p_irdata)
{
int?i; char?irdata=p_irdata; endcount=223; flag=1; count=0; do { }while(count<endcount); endcount=117; flag=0; count=0; do { }while(count<endcount); irdata=iraddr1; for(i=0;i<8;i++) { endcount=10; flag=1; count=0;endcount=41;?
}else
{ endcount=15; }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); 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); irdata=irdata>>1; } endcount=10; flag=1; count=0; do{}while(count<endcount); flag=0;}
void?delay()
{
int?i,j; for(i=0;i<400;i++) {for(j=0;j<100;j++)
{
}
}}