天天看點

紅外 NEC編碼

它是一種電磁波,可以實作資料的無線傳輸

它的波長範圍為760nm ~ 1mm,不為人眼所見

紫外光波長為10-400nm

紅外與藍牙

紅外:對準、直接、0-10米,單對單

藍牙:10米左右,加強信号後最高可達100米,可以繞彎,可以不對準,可以不在同一間房間,連結最大數目可達7個,同時區分硬體

紅外線系統的組成

紅外線系統一般由紅外發射裝置和紅外接收裝置兩大部分組成

紅外發射裝置又可由鍵盤電路、紅外編碼晶片、電源和紅外發射電路組成

紅外接收裝置可由紅外接收電路、紅外解碼晶片、電源和應用電路組成

紅外遙控器發射

紅外遙控器是将遙控信号(二進制脈沖碼)調制在38KHz的載波上,經緩沖放大後送至紅外發光二極管,轉化為紅外信号發射出去的

紅外 NEC編碼

開發紅外接收裝置,一定要知道紅外遙控器的編碼方式和載波頻率

紅外線接收

大多都采用成品紅外接收頭。均有三隻引腳,即電源正(VDD)、電源負(GND)和資料輸出(VOUT)

紅外 NEC編碼

用時注意成品紅外接收頭的載波頻率

資料格式

資料格式包括了引導碼、使用者碼、資料碼和資料碼反碼,編碼總占32位

資料反碼是資料碼反相後的編碼,編碼時可用于對資料的糾錯

紅外 NEC編碼

第二段的使用者碼也可以在遙控應用電路中被設定成第一段使用者碼的反碼

位定義

使用者碼或資料碼中的每一個位可以是位‘1’ ,也可以是位‘0’

區分‘0’和‘1’是利用脈沖的時間間隔來區分,這種編碼方式稱為脈沖位置調制方式

紅外 NEC編碼

時間間隔取一個中間值(高電平時間1秒)

舉例

sbit IRIN = P3 ^ 2;

void IrInit()
{
	IT0 = 1; //下降沿觸發
	EX0 = 1; //打開中斷0允許
	EA = 1;	//打開總中斷

	IRIN = 1; //初始化端口
}

void ReadIr() interrupt 0
{
	u8 j, k;
	u16 err;
	Time = 0;					 
	delay(700);	//7ms
	if(IRIN == 0)		//确認是否真的接收到正确的信号
	{	 
		err = 1000;				//1000 * 10us = 10ms, 超過說明接收到錯誤的信号
		/*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程式出錯的時
		侯,程式死在這裡*/	
		while((IRIN == 0) && (err > 0))	//等待前面9ms的低電平過去  		
		{			
			delay(1);
			err--;
		} 
		if(IRIN == 1)			//如果正确等到9ms低電平
		{
			err = 500;
			while((IRIN == 1) && (err > 0))		 //等待4.5ms的起始高電平過去
			{
				delay(1);
				err--;
			}
			
			for(k = 0; k < 4; k++)		//共有4組資料
			{				
				for(j = 0; j < 8; j++)	//接收一組資料
				{
					err = 60;		
					while((IRIN == 0) && (err > 0)) //等待信号前面的560us低電平過去
					{
						delay(1);
						err--;
					}
					err=500;
					while((IRIN == 1) && (err > 0))	 //計算高電平的時間長度
					{
						delay(10);	 //0.1ms
						Time++;
						err--;
						if(Time > 30)
						{
							return;
						}
					}
					IrValue[k] >>= 1;	 //k表示第幾組資料
					if(Time >= 8)			//如果高電平出現大于565us,那麼是1
					{
						IrValue[k] |= 0x80;
					}
					Time = 0;		//用完時間要重新指派							
				}
			}
		}
		
		if(IrValue[2] != ~IrValue[3]) //使用者碼是否比對
		{
			return;
		}
	}			
}
           

使用邏輯分析儀分析遙控器協定

紅外 NEC編碼

抓取的二進制值:0b00000000 – 0b11111111 – 0b00110000 – 0b11001111

因為紅外接收是反相的,低位在前,高位在後。

是以解碼完的資料應該是:0b00001100 = 0x0c