目录
红外通讯
红外通讯简述
- 红外通讯可实现通讯双方近距离的无线可靠数据传输
红外通讯特点
- 控制简单、接口简单、价格便宜、传输可靠、抗干扰能力强
常用红外通讯的器件
- 光电计数器、红外光电开关、一体化接收头、发射管(透明)、接收管(黑色)
注:红外为不可见光,但是可以通过照相功能去观察其闪烁
红外通讯原理
组成部分及作用
- 发送端:将待发送的二进制信号编码调制为一系列的脉冲串信号(38k载波),通过其发送红外信号
- 接收端:完成对红外信号的 接收、放大、检波、整形、解调出编码的脉冲
注:发射与接受 是一对逆过程,即发射端原始端对应高电平,接收端输出就是低电平,反之亦然
引导码
发送端:9ms的高电平+4.5ms的低电平
接收端:9ms的低电平+4.5ms的高电平
二进制逻辑 0 与逻辑 1的定义
逻辑0
发送端:0.565ms的高电平+0.565ms的低电平
接收端:0.565ms的低电平+0.565ms的高电平
逻辑1
发送端:0.565ms的高电平+3*0.565ms(1.695ms)的低电平
接收端:0.565ms的低电平+3*0.565ms(1.695ms)的高电平
注:发射与接受 是一对逆过程,即发射端原始端对应高电平,接收端输出就是低电平,反之亦然
红外解码硬件设计与程序设计
硬件设计
注:接收引脚直接与外部中断相连,即检测到上升沿或下降沿则进入外部中断
程序设计
低电平检测
u16 getLowTime()//获取低电平时间9ms
{
TH1 = 0;//计数器清零
TL1 = 0;
TR1 =1 ;//开始计时
while(IRIN == 0)//等待置1
{
if(TH1>0x40) //9000us/1.085us=8294个 换算为十六进制 为 0x2066*2=0x40cc 最长等待时间18ms
{break;}
}
TR1 =0; //停止计时
return (TH1*256+TL1);//返回时间
}
高电平检测
u16 getHightTime()//获取高电平时间4.5ms
{
TH1 = 0;//计数器清零
TL1 = 0;
TR1 =1 ;//开始计时
while(IRIN == 1)//等待置0
{
if(TH1>0x20) //4500us/1.085us=8294/2个 换算为十六进制 为 0x2066*2=0x40cc 最长等待时间9ms
{break;}
}
TR1 =0; //停止计时
return (TH1*256+TL1);//返回时间
}
外部中断解码
void EXT_INT0_Isr() interrupt 0//解码
{
u16 time;
u8 bit_data;
time = getLowTime();//如果返回值在 8.5ms/1.085=7834 到 9.5ms/1.085=8755 都可
if(time < 7834 || time >8755)
{
EA=0;//退出外部中断
return;
}
time = getHightTime(); //4ms~5ms 4000/1.085=3686 5000/1.085=4608
if(time < 3686 || time >4608)
{
EA=0;//退出外部中断
return;
}
for(i=0;i<4;i++)//4位
{
for(j=0;j<8;j++)//8bit
{
time = getLowTime();
if(time < 322 || time >645) //350us~700us
{
EA=0;//退出外部中断
return;
}
time = getHightTime;
if(time > 322 && time <645) //350us~700us
{
bit_data = bit_data<<1;//左移一位,接收时先接收最高位
bit_data = bit_data | 0x00;
}
else if (time > 1198 && time <1658) //1.3~1.8
{
bit_data = bit_data<<1;//左移一位
bit_data = bit_data | 0x01;
}
else
{
EA=0;//退出外部中断
return;
}
}
IRcode[i]=bit_data;//保存解码值
}
}
注:实际应用时只需判断 IRcode[2]键值码,来执行要执行的程序