红外遥控和C语言51红外遥控解码程序设计实例

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

红外遥控和C语言51红外遥控解码程序设计实例红外遥控和C语言51红外遥控解码程
序设计实例
什么是红外线?人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。

其中红光的波长范围为0.62~0.76μm;比红光波长还长的光叫红外线。

红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.
红外线遥控就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。

红外发光二极管一般有黑色、深蓝、透明三种颜色。

红外遥控系统一般分发射和接收两个部分。

发射部分的主要元件为红外发光二极管。

目前大量使用的红外发光二极管发出的红外线波长为940mm左右,外形与普通φ5发光二极管相同。

接收部分的红外接收管是一种光敏二极管。

红外发光二极管一般有圆形和方形两种。

由于红外发光二极管的发射功率一般都较小(100mW左右),所以红外接收二极管接收到的信号比较微弱,因此就要增加高增益放大电路。

最近几年大多都采用成品红外接收头。

成品红外接收头的封装大致有两种:一种采用铁皮屏蔽;一种是塑料封装。

均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VO或OUT)。

红外接收头的引脚排列因型号不同而不尽相同,可参考厂家的使用说明。

成品红外接收头的优点是不需要复杂的调试和外壳屏蔽,使用起来如同一只三极管,非常方便。

但在使用时注意成品红外接收头的载波频率。

红外遥控常用的载波频率为38kHz,这是由发射端所使用455kHz晶振来决定的。

在发射端要对晶振进行整数分频,分频系数一般
取12,所以455kHz?12?37.9kHz?38kHz。

也有一些遥控系统采用36 kHz、40
kHz、56 kHz等,由发射端晶振的振荡频率来决定。

红外遥控的特点是不影响周边环境的、不干扰其他电器设备。

室内近距离(小
于10米)遥控中得到了广泛的应用。

红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码
协议,但一般都是由引导码,系统码,键码三部分组成.
引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有
不同的误别码,以免搞错.
遥控器上不同的按键有不同的键码,系统码和键码都是16位码,8位正码,8位
反码.如SC6122的系统码是FF00,FF和00互为反码,键码1为EF10也是互为反码.
SC6122的引导码为低电平为9000微秒,高电平为4500微秒.当然高电平不可能
精确为9000微秒,在8000微秒到10000微秒都看作是正常范围,低电平在4000-5000之间都看作是正常范围.引导码后的32位编码(16位系统码和16位不管高低电平,载波时间都是560微秒,但低电平持续时间是1125微秒,高键码) 电平持续时间是2250微秒,所以低电平除去载波时间大约是560微秒,高电平

低电平也有一个波动范围,在400-700之间都看作去载波时间大约是1680微秒.
是正常的,具体多少可以通过示波器测量出来.高电平也有一个波动范围,在
400-2000之间都看作是正常的,具体多少也是根据经验.当然范围越宽,捕捉红外线
的范围也越宽,越精确.在捕捉到有高低电平之间,在560-1680之间取一个中间值1120微秒,认为小于1120微秒是低电平,大于1120微秒是高电平.
//////////////////////////////////////////////////////
//红外接收后的数据通过UART发出
//晶振:12M
//author:cole
//date:09.6.6
//////////////////////////////////////////////////////
#include reg52.h void uart_init(void);
#define c(x)(x)
sbit Ir_Pin=P3^2;
unsigned char Ir_Buf[4];//用于保存解码结果 unsigned int Ir_Get_Low() {
TL0=0;
TH0=0;
TR0=1;
while(~Ir_Pin&&(TH0&0x80)==0); TR0=0;
return TH0*256+TL0;
}
//===
unsigned int Ir_Get_High()
{
TL0=0;
TH0=0;
TR0=1;
while(Ir_Pin&&(TH0&0x80)==0); TR0=0;
return TH0*256+TL0; }
//==
main()
{
unsigned int temp; char i,j;
P3=0xff;
uart_init();
do{
restart:
while(Ir_Pin);
temp=Ir_Get_Low(); if(temp c(8500)||temp c(9500))continue;//引导脉冲低电平9000
temp=Ir_Get_High();
if(temp c(4000)||temp c(5000))continue;//引导脉冲高电平4500
for(i=0;i 4;i++)//4个字节 {
for(j=0;j 8;j++)//每个字节8位
{
temp=Ir_Get_Low();
if(temp c(200)||temp c(800))goto restart; temp=Ir_Get_High();
if(temp c(200)||temp c(2000))goto restart;Ir_Buf[i]=1;
if(temp c(1120))Ir_Buf[i]|=0x80; }
}
for(i=2;i 4;i++)
{
SBUF=Ir_Buf[i];
while(TI==0);
TI=0;
}
}while(1);
}
/////////////////////////////////////////////////////////
//UART初始化
//波特率:9600
/////////////////////////////////////////////////////////
void uart_init(void) {
unsigned char u;
ET1=0;
TMOD=0x21;//定时器1工作在方式2(自动重装) SCON=0x50;//10位uart,容许串行接受 TH1=0xFD;
TL1=0xFD;
u=SBUF;
TR1=1;
}。

相关文档
最新文档