无线通信技术:红外遥控通信

红外线介绍:

红外线遥 控就是利用波长为 0.76~1.5μm 之间的近红外线来传送控制信号

红外遥控通信系统一般由红外发射装置红外接收设备两大部分组成

红外线优点:

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠, 功耗低,成本低,易实现等显著优点

开发红外接收设备,一定要知道 红外遥控器的编码方式 载波频率

基于51单片机红外遥控,使用的是NEC协议

1、8 位地址和 8 位指令长度;
2、地址和命令 2 次传输(确保可靠性)
3、PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;
4、载波频率为 38Khz;
5、位时间为 1.125ms 或 2.25ms;

无线通信技术:红外遥控通信_第1张图片

NEC 码的位定义:

一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us 脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms(560us 脉冲+560us 低电平)。
而红外接收头在收到脉冲的时候为低电平,在没有脉冲 的时候为高电平
这样,我们在接收头端收到的信号为:
逻辑 1 应该是 560us 低 +1680us 高,
逻辑 0 应该是 560us 低+560us 高。
所以可以通过计算高电平时间判断接收到的数据是 0 还是 1。

数据格式


无线通信技术:红外遥控通信_第2张图片

NEC 遥控指令的数据格式为:
引导码、地址码、地址反码、控制码、控制反码。
引导码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,
地址码、地址反码、控制码、控制反码均是 8 位数据格式。
按照低位在前,高位在后的顺序发 送 。采用反码是为了增加传输的可靠性(可用于校验)。


红外接收设备

红外接收设备:红外接收电路、红外解码、电源和应用电路组成

无线通信技术:红外遥控通信_第3张图片

三只脚:即电源正( VDD)、 电源负(GND)和数据输出(VOUT)
// 红外端口初始化函数,外部中断 0 配置
void ired_init(void)
{
    IT0=1; //下降沿触发
    EX0=1; //打开中断 0 允许
    EA=1; //打开总中断
    IRED=1; //初始化端口
}
// 外部中断函数
void ired() interrupt 0 //外部中断 0 服务函数
{
	u8 ired_high_time=0;
	u16 time_cnt=0;
	u8 i=0,j=0;
	if(IRED==0)
	{
		time_cnt=1000;
		while((!IRED)&&(time_cnt))//等待引导信号 9ms 低电平结束,若超过 10ms强制退出
		{
			delay_10us(1);//延时约 10us
			time_cnt--;
			if(time_cnt==0)return;
		}
		if(IRED)//引导信号 9ms 低电平已过,进入 4.5ms 高电平
		{
			time_cnt=500;
			while(IRED&&time_cnt)//等待引导信号 4.5ms 高电平结束,若超过 5ms 强制退?
			{
				delay_10us(1);
				time_cnt--;
				if(time_cnt==0)return;
			}
			for(i=0;i<4;i++)//循环 4 次,读取 4 个字节数据
			{
				for(j=0;j<8;j++)//循环 8 次读取每位数据即一个字节
				{
					time_cnt=600;
					while((IRED==0)&&time_cnt)//等待数据 1 或 0 前面的 0.56ms
					//结束,若超过 6ms 强制退出
					{
						delay_10us(1);
						time_cnt--;
						if(time_cnt==0)return;
					}
						time_cnt=20;
						while(IRED)//等待数据 1 或 0 后面的高电平结束,若超过 2ms 强制退出
						{
							delay_10us(10);//约 0.1ms
							ired_high_time++;
							if(ired_high_time>20)return;
						}
						gired_data[i]>>=1;//先读取的为低位,然后是高位
						if(ired_high_time>=8)//如果高电平时间大于 0.8ms,数据则 1,否则为 0
						gired_data[i]|=0x80;
						ired_high_time=0;//重新清零,等待下一次计算?
				}
			}
		}
		if(gired_data[2]!=~gired_data[3])//校验控制码与反码,错误则返回
		{
		for(i=0;i<4;i++)
		gired_data[i]=0;
		return;
		}
	}
}

你可能感兴趣的:(外设,51单片机,嵌入式硬件,单片机,学习,51单片机)