红外通信
简单介绍
红外线遥控器已被广泛使用在各种类型的家电产品上,它的出现给使用电器提供了很多的便利。红外线系统一般由红外发射装置和红外接收设备两大部分组成。红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。通常为了使信号更好的被发射端发送出去,经常会将二进制数据信号调制成为脉冲信号,通过红外发射管发射。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。
本次采用的是PPM。
数据格式
思想:利用中断系统,收到起始码就进入判断环节。
- 用户码或数据码中的每一个位可以是位 ‘1’ ,也可以是位 ‘0’。区分 ‘0’和 ‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式,英文简写PPM。
一般来说是取中间时间,1ms来判断0/1
代码如下:
#include <REGX52.H>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit io=P3^2;
void start()
{
EA=1;
EX0=1;
IT0=1;
io=1;
}
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};//显示0~F的值
uchar sj[3];
uchar date[4];
void delay(uint i)
{
while(i--);
}
void DigDisplay()
{
uchar i;
for(i=0;i<3;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
// case(3):
// LSA=1;LSB=1;LSC=0; break;//显示第3位
// case(4):
// LSA=0;LSB=0;LSC=1; break;//显示第4位
// case(5):
// LSA=1;LSB=0;LSC=1; break;//显示第5位
// case(6):
// LSA=0;LSB=1;LSC=1; break;//显示第6位
// case(7):
// LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=smgduan[sj[i]];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void sjproc()
{
sj[0]=date[2]/16;
sj[1]=date[2]%16;
sj[2]=16;
}
void main()
{
start();
while(1)
{
sjproc();
DigDisplay();
}
}
void int0() interrupt 0
{
uchar i,j;
uint time=0,err;
delay(700);
if(io==0)
{
err=1000;
while(!io&&err)
{
delay(1);
err--;
}
if(err==0)
return;
else if(io==1)
{
err=500;
while(io&&err)
{
delay(1);
err--;
}
for(i=0;i<4;i++)
for(j=0;j<8;j++)
{
err=56;
while(!io&&err)
{
delay(1);
err--;
}
err=300;
while(io&&err)
{
delay(10);
time++;
err--;
if(time>30)
return ;
}
date[i]>>=1;
if(time>10)
date[i]=date[i]|0x80;
}
time=0;
}
if(date[2]!=~date[3])
return ;
}
}