当前位置:文档之家› 51单片机红外解码资料+源代码

51单片机红外解码资料+源代码


位地 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 址
源代码如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7;
uchar irtime; //红外时间 uchar startflag; //启动接收 uchar irdata[33]; uchar bitnum; uchar irreceiveok; //红外接收完毕 uchar ircode[4]; uchar irprosok; uchar disp[8]; uchar code smg_du[]={
发射器发射的的信号为
接收器接收到的信号为
即 9ms 低电平后 4.5ms 高电平作为起始码,之后接受到两次 8 位客户码,一次八位数据码,和一次八位数据反码。
遥控器在按键按下之后周期性的发出同一种 32 位二进制编 码周期约为 108ms,一组码持续时间随本身的“0”“1”个数不同
而不同。大约在 45~63ms 之间,当一个键按下 36ms,振荡器使芯 片激活,将发射一组 108ms 的编码脉冲这 108ms 编码脉冲由一个 起始码(9ms),一个结束码(4.5ms),低八位地址码(9~18ms), 高八位地址码(9~18ms),八位数据码(9~18ms),和这八位数据 码反码(9~18ms),如果按下超过 108ms 仍未松开,接下来发射 的代码(连发代码)将仅有起始码(9ms)和结束码(2.5ms)组 成。
解码的关键是如何识别零和一: “0”和“1”都是以 0.56ms 低电平开始的,不同的是高电平 宽度不同,“0”为 0.56ms“1”为 1.168ms,所以必须根据高电平 宽度来区别“0”和“1”。 如果从 0.56ms 低电平过后,开始延时,0.56ms 后,若读到的 电平为低,说明该位为零,反之则为一,可靠其间,延时必须比 0.56ms'长一些,又不能超过 1.12ms,否则如果该位为零,读到的 已是下一位高电平,因此取(1.12+0.56)/2=0.84ms 最为可靠,一 般取 0.84ms 左右均可。根据码的格式,应该等待 9ms 起始码和 4.5ms 结束码完成后才能读码。 备注:定时器/计数器控制寄存器 TCON 位序 D7 D6 D5 D4 D3 D2 D1 D0 号 位符 TF1 TR1 TF0 IR0 IE1 IT1 IE0 IT0 号
{ TMOD=0X02; //方式 2
TH0=0X00; //高第八位清零
TL0=0X00;
EA=1; //打开全局中断允许位 (中断允许寄存器 IE)
ET0=1;
//打开定时器 0 中断允许位 (中断允许寄存器
IE) TR0=1;
//寄存器 TCON,置一启动定时器 0
} void int0init(void)
}
irprosok=1;
} void main()
//从这里开始
{ timer0init(); int0init(); while(1)
//定时器 0 初始化 //外部中断 0 初始化 //大循环
{
if(irreceiveok)
{
irpros();
irreceiveok=0;
}
if(irprosok)
红外发射电路如图: 左边是一个 222 的无极性电容,然后接地。 发送 38K 方波,就是载波
上述“0”和“1”组成 32 位二进制代码,包括两次 8 位用户码, 8 位数据码,和 8 位数据反码以及最后的同部位。 一体化红外接收管原理图
一体化红外接收头在检测到 38K 红外遥控载波信号时输出低
电平,在未检测到 39K 的红外遥控载波信号时输出高电平。
wela=1;
P0=smg_we[i];
wela =0;
delay(1);
P0=0xff;
delay(1);
}
}
void irpros(void) 零)
//1.125ms/0.2777=4.39=4.05 个 irtime(数据
{ 中间值 6
//2.25ms/0.2777=8.10 个 irtime (数据一)取
uchar k,i,j;
uchar value; k=1; //跳过引导码
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{ value=value>>1; //7 次
if(irdata[k]>6) //8 次
{
value=value | 0x80;
}
k++;
}
ircode[j]=value;
{
irwork();
irprosok=0;
}
display();
}
}
void timer0 () interrupt 1 //定时器 0,初值自动重装的 8 位定时器
{
//最大计数值 256,2 的 8 次方
irtime++; //256 //每加一,计数 256 次,计数一次时间为
0.001085069ms
//外部中断 0 初始化
{
IT0=1; //置一,跳变沿触犯方式,引脚 INT0 上,下降沿的
负跳变有效
EX0=1;
//外部中断 0 中断允许位
EAHale Waihona Puke 1; //全局中断允许位}
void irwork(void)
{
disp[0]=ircode[0]/16;
disp[1]=ircode[0]%16;
disp[2]=ircode[1]/16; disp[3]=ircode[1]%16;
51 单片机红外解码(NEC)
1,遥控发射及其编码
红外遥控编码具有以下特征: (1),采用脉宽调制串行码,以脉宽为 0.565ms,间隔 0.56ms, 周期为 1.125ms 的组合表示二进制的“0”。 (2)一脉宽为 0.565ms,间隔 1.685ms,周期为 2.25ms 的组合 表示二进制的“1”。
}
//每加一,计数 256 次,共需 0.2777ms
void int0 () interrupt 0 //外部中断 0(INT0)
{
if(startflag)
{
if(irtime>32) //说明收到的是引导码 13.5ms(引导码)
/0.2777=48.7 个 irtime { bitnum=0; }
}; uchar code smg_we[]={ 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf,
0xbf,
0x7f,
};
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
} void timer0init(void) //定时器 0 初始化
0x3F,/*0*/ 0x06,/*1*/
0x5B,/*2*/ 0x4F,/*3*/ 0x66,/*4*/ 0x6D,/*5*/ 0x7D,/*6*/ 0x07,/*7*/ 0x7F,/*8*/ 0x6F,/*9*/ 0x77,/*A*/ 0x7C,/*b*/ 0x39,/*C*/ 0x5E,/*d*/ 0x79,/*E*/ 0x71,/*F*/
disp[4]=ircode[2]/16; disp[5]=ircode[2]%16;
disp[6]=ircode[3]/16; disp[7]=ircode[3]%16; } void display(void) { uchar i; for(i=0;i<8;i++)
{ dula=1; P0=smg_du[disp[i]]; dula=0; P0=0xff;
irdata[bitnum]=irtime; irtime=0; bitnum++;
if(bitnum==33) { bitnum=0; irreceiveok=1; } } else { startflag=1; irtime=0; } }
相关主题