目前,人們的物質(zhì)文化生活水平日益提高,各種各樣的家用電器走進(jìn)了千家萬戶,其中,大多數(shù)的家用電器都有各自不同的遙控器,人們常常為了控制某臺(tái)電器而到處尋找其對應(yīng)的遙控器,這樣,就給人們的生活帶來了很多不便。為了解決這個(gè)問題,本文提出一個(gè)多功能遙控器的設(shè)計(jì)方案:該遙控器可以通過自學(xué)習(xí)而擁有對多臺(tái)電器的遙控功能,即省時(shí)、又省力,從而使人們免除同時(shí)面對功能眾多遙控器的煩惱。
紅外遙控器原理
遙控器由紅外接收及發(fā)射電路、信號調(diào)理電路、中央控制器8031.程序及數(shù)據(jù)存儲(chǔ)器、鍵盤及狀態(tài)指示電路組成。
遙控器有兩種狀態(tài):學(xué)習(xí)狀態(tài)和控制狀態(tài)。當(dāng)遙控器處于學(xué)習(xí)狀態(tài)時(shí),使用者每按一個(gè)控制鍵,紅外線接收電路就開始接收外來紅外信號,同時(shí)將其轉(zhuǎn)換成電信號,然后經(jīng)過檢波、整形、放大,再由CPU定時(shí)對其采樣,將每個(gè)采樣點(diǎn)的二進(jìn)制數(shù)據(jù)以8位為一個(gè)單位,分別存放到指定的存儲(chǔ)單元中去,供以后對該設(shè)備控制使用。
當(dāng)遙控器處于控制狀態(tài)時(shí),使用者每按下一個(gè)控制鍵,CPU從指定的存儲(chǔ)單元中讀取一系列的二進(jìn)制數(shù)據(jù),串行輸出(位和位之間的時(shí)間間隔等于采樣時(shí)的時(shí)間間隔)給信號保持電路,同時(shí)由調(diào)制電路進(jìn)行信號調(diào)制,將調(diào)制信號經(jīng)放大后,由紅外線發(fā)射二極管進(jìn)行發(fā)射,從而實(shí)現(xiàn)對該鍵對應(yīng)設(shè)備功能的控制。
1. 原理
紅外遙控器是利用一個(gè)紅外發(fā)光二極管,以紅外光為載體來將按鍵信息傳遞給接收端的設(shè)備。紅外光對于人眼是不可見的,因此使用紅外遙控器不會(huì)影響人的視覺(可以打開手機(jī)攝像頭,遙控器對著攝像頭按,可以看到遙控器發(fā)出的紅外光)。
2. 調(diào)制
日常生活環(huán)境中有很多紅外光源,太陽、蠟燭火光、白熾燈、甚至是我們的身體。這些紅外光源都可能會(huì)對我們的接收設(shè)備產(chǎn)生干擾,為了屏蔽干擾,只接收有效信息,我們就需要用到調(diào)制。調(diào)制是我們使需要的信號區(qū)別于噪音方法。通過調(diào)制我們可以使紅外光以特定的頻率閃爍。紅外接收器會(huì)適配這個(gè)頻率,其它的噪音信號都將被忽略。你可以認(rèn)為這種閃爍是引起接收器“注意”的方法,正如我們?nèi)祟愄貏e容易被黃色的燈光引起注意一樣,甚至在白天。
上圖左邊,調(diào)制信號通過驅(qū)動(dòng)放大由紅外 LED 發(fā)射;上圖右邊,信號通過接收器檢測輸出。
在串行通訊里,我們經(jīng)常談及‘ mark’和‘ space’標(biāo)記?!?space’是個(gè)默認(rèn)信號,是指發(fā)射管關(guān)閉狀態(tài),在‘ space’期間,紅外光不被發(fā)射。反之在‘ mark’狀態(tài)期間,紅外光以特定的頻率脈沖形式發(fā)射。在消費(fèi)類電子產(chǎn)品里,脈沖頻率普遍采用 30KHz 到 60KHz 這個(gè)頻段,紅外遙控器一般使用的是38KHz。
在接收端,一個(gè)‘ space’信號以高電平方式重現(xiàn)輸出。反之一個(gè)‘ mark’信號便是以低電平方式重現(xiàn)。請注意,這里的‘ mark’和‘ space’不是我們需要發(fā)送的狀態(tài) 1 和 0。‘ mark’和‘ space’以及 1和 0 之間的真正關(guān)系取決于被應(yīng)用的協(xié)議。
3. 協(xié)議
NEC協(xié)議
8 位地址碼, 8 位命令碼
完整發(fā)射兩次地址碼和命令碼,以提高可靠性
脈沖時(shí)間長短調(diào)制方式
38KHz 載波頻率
位時(shí)間 1.12ms 或 2.25ms
引導(dǎo)嗎:
下圖為一個(gè)引導(dǎo)碼的調(diào)制波形:
引導(dǎo)碼 由“9ms mark + 4.5ms space”構(gòu)成,表示一組 鍵碼 的開始。
邏輯0和1:
下圖為邏輯0和邏輯1的調(diào)制波形:
邏輯“1”由“560us mark + 1690 space”組成,symbol period 為2.25ms;邏輯“0”由“560us mark + 560us space”組成,symbol period 為 1.12ms。
完整的一組鍵碼:
下圖位NEC 協(xié)議的典型脈沖鏈:
協(xié)議規(guī)定低位首先發(fā)送,如上圖所示的情況,發(fā)送的地 址碼為“59”,命令碼為“16”,總的碼值為 0x59A616E9。
重復(fù)碼:
下圖為重復(fù)碼的調(diào)制波形:
重復(fù)碼由 “9ms mark + 2.25ms space”組成,symbol period 為 11.25ms,重復(fù)碼表示一個(gè)重復(fù)按鍵,當(dāng)按鍵按著不松時(shí),會(huì)先發(fā)一個(gè)完整的鍵碼,接著每 110ms 發(fā)送一個(gè)重復(fù)碼,直到松開按鍵,如下面的波形圖所示:
接收端輸出:
在接收端,一個(gè) mark 對應(yīng)一個(gè)低電平輸出,一個(gè) space 對應(yīng)一個(gè)高電平輸出,因此起始碼、邏輯0 1、重復(fù)碼等在接收端的輸出波形如下圖所示:
協(xié)議解碼程序片段:
[cpp] view plain copytypedef struct ir_symbol_s
{
unsigned short mark_period;
unsigned short symbol_period;
} ir_symbol_t;
typedef struct ir_key_s
{
unsigned int value;
int state;
}ir_key_t;
int NEC_Decode(ir_symbol_t symbol_buf[], int symbol_num, ir_key_t *ir_key)
{
unsigned int key_value;
if(symbol_num == 33) //解析鍵值,設(shè)定300us的容錯(cuò)范圍
{
key_value = 0;
//引導(dǎo)碼判斷
if ( (symbol_buf[0].symbol_period 》 (13500 - 300)) && (symbol_buf[0].symbol_period 《 (13500 + 300))
&& (symbol_buf[0].mark_period 》 (9000 - 300)) && (symbol_buf[0].mark_period 《 (9000 + 300)) )
{
for(i = 0; i 《 (symbol_num-1); i ++)
{
//無效的符號位
if( (symbol_buf[i].symbol_period 《 (1120-300)) || (symbol_buf[i].symbol_period 》 (2250+300)) )
{
printf(“symbol %d, is invalid\n”, i);
return -1;
}
else
{
key_value 《《= 1;
//邏輯1判斷
if( (symbol_buf[i].symbol_period 》 (2250-300)) && (symbol_buf[i].symbol_period 《= (2250+300)) )
{
key_value |= 1;
}
}
}
ir_key-》value = key_value;
ir_key-》state = KEY_STATE_PRESS;
}
}
else if(symbol_num == 2) //NEC協(xié)議的重復(fù)鍵
{
ir_key-》value = 0;
ir_key-》state = KEY_STATE_REPEAT;
}
else
{
ir_key-》value = 0;
ir_key-》state = KEY_STATE_NONE;
}
return 0;
}
評論
查看更多