紅外遙控是我們現(xiàn)實(shí)生活中必不可少的一員。遙控,顧名思義即在遙遠(yuǎn)的地方進(jìn)行控制,其實(shí)也就是說遠(yuǎn)程通信。紅外遙控就是以紅外線為傳輸介質(zhì)的遙控。
紅外遙控器是怎么工作的?其實(shí)它內(nèi)部就是有一個(gè)單片機(jī),單片機(jī)的I/O口控制一個(gè)紅外LED燈(當(dāng)然一般會(huì)加外部放大電路以增大傳輸距離),在內(nèi)部編碼后發(fā)送出去,然后電視或者空調(diào)之類的可以用紅外遙控控制的電器在接收到紅外信號(hào)后就會(huì)進(jìn)行解碼,并根據(jù)制定好的協(xié)議執(zhí)行特定動(dòng)作,比如電視可能換臺(tái)、調(diào)節(jié)音量等?,F(xiàn)在有的手機(jī)就帶有紅外遙控功能,其實(shí)也是用單片機(jī)的功能實(shí)現(xiàn)的。
紅外遙控解碼
有的時(shí)候,我們希望模擬一些遙控器的功能,這時(shí)候就要對(duì)這些遙控器的數(shù)據(jù)進(jìn)行解碼。
在進(jìn)行解碼前,我們先來了解一下紅外編碼。紅外編碼有很多種,最常用的編碼是NEC編碼。NEC格式的編碼如下:
NEC格式的紅外編碼是連續(xù)的32位二進(jìn)制碼組。32位二進(jìn)制碼組之前的引導(dǎo)碼,用于區(qū)分每次的傳輸;在起始碼之后的才是32位二進(jìn)制碼組,其中8位用戶識(shí)別碼和8位反碼(反碼主要用于)校驗(yàn),用戶識(shí)別碼的作用主要是區(qū)分不同品牌的遙控器;接著就是8位操作碼和反碼,用于表示哪個(gè)按鍵被按下。
NEC格式的編碼除引導(dǎo)碼和起始碼外,用于交互數(shù)據(jù)的信息采用脈寬調(diào)制的串行碼,在38kHz的載波下,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進(jìn)制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進(jìn)制的“1”,其波形如下所示:
了解了紅外編碼,就可以進(jìn)行紅外解碼了。
實(shí)現(xiàn)方法
一般,進(jìn)行紅外解碼我們需要先將接受到的有效信號(hào)與外界環(huán)境的干擾信號(hào)分離開,這就是載波的作用?,F(xiàn)在市面上有很多一體化紅外接收頭,內(nèi)部是紅外接收二極管 +放大電路 +解調(diào)器。當(dāng)接收到紅外信號(hào)后,先將其放大,然后把38kHz的信號(hào)保留下來。需要注意的是一般一體化紅外接收頭接收到信號(hào)時(shí)輸出是低電平,沒有接收信號(hào)時(shí)是高電平。
上面是常用紅外接收頭的引腳,“OUT”腳接單片機(jī)的I/O口,“-”腳接電源負(fù)極,“+”腳接電源正極。
接好電路,就要進(jìn)行解碼工作了.其實(shí)解碼工作主要是識(shí)別引導(dǎo)碼,還有數(shù)據(jù)“0”“1”。我們看波形圖,只要識(shí)別紅外接收頭“OUT”引腳高低電平持續(xù)的時(shí)間就可以了。這個(gè)可以用定時(shí)器中斷完成,也可以用延時(shí)來判斷。由于只完成解碼工作,我們就用延時(shí)的方法更方便。
首先,紅外接收頭沒有接到信號(hào)時(shí)是高電平,等待其變低。之后,每隔900us測(cè)量一次,若在10次內(nèi)電平變高,說明這不是引導(dǎo)碼,退出重新開始;若10次內(nèi)并沒有變高,說明這就是引導(dǎo)碼,繼續(xù)下一步。接著可以不判斷起始碼,就是直接等待引腳電平變高再變低,就可以接收數(shù)據(jù)了。
接收數(shù)據(jù),就是進(jìn)行判斷“0”和“1”。從位的定義我們可以發(fā)現(xiàn)“0”、“1”均以0.56ms的低電平開始,不同的是高電平的寬度不同,“0”為0.56ms,“1”為1.68ms,所以必須根據(jù)高電平的寬度區(qū)別“0”和“1”。
每一位“0”或者“1”在接收頭接收信號(hào)即低電平的時(shí)間都是一樣的,直接等待低電平過去,在高電平時(shí)延時(shí)600us,如果600us時(shí)還是高電平,說明是“1”;如果是低電平即高電平過去了,說明是“0”。將這些數(shù)據(jù)結(jié)合到一起,就是接收到的編碼了。
將單片機(jī)的串口與電腦接好,就可以在串口顯示我們讀到的紅外遙控?cái)?shù)據(jù)了。
實(shí)現(xiàn)代碼:
#include <reg52.h>
// --- 紅外接收一體化輸出口 ----------------------------------
sbit IR_Out = P3^2;
bit START_Flag = 0;
bit BOOT_REPEATING_CODE_Flag = 0;
unsigned char DATA[4] = {0};
bdata unsigned char TEMP_BIT;
sbit B0 = TEMP_BIT^0;
sbit B1 = TEMP_BIT^1;
sbit B2 = TEMP_BIT^2;
sbit B3 = TEMP_BIT^3;
sbit B4 = TEMP_BIT^4;
sbit B5 = TEMP_BIT^5;
sbit B6 = TEMP_BIT^6;
sbit B7 = TEMP_BIT^7;
// --- 有無遙控信號(hào)判斷函數(shù) ----------------------------------
bit START_Judge();
// --- 連發(fā)碼判斷函數(shù) ----------------------------------------
bit BOOT_REPEATING_CODE_Judge();
// --- "0"和"1"識(shí)別 ------------------------------------------
bit H_L_LEVEL_Judge();
bit START_Judge()
{
bit TEMP_Flag = 1;
unsigned char i = 0;
//在正常無遙控信號(hào)時(shí),一體化紅外接收頭輸出是高電平,程序一直在循環(huán)。
while ( IR_Out == 1);
//重復(fù)10次,目的是檢測(cè)在6876~8352微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序
for(i =0;i <9; i++)
{
DELAY_Us(800); // 測(cè)試實(shí)際延時(shí)約為764~928us
if ( IR_Out == 1 )
{
TEMP_Flag = 0;
break;
}
}
return TEMP_Flag;
}
bit BOOT_REPEATING_CODE_Judge()
{
bit TEMP_Flag = 1;
while( IR_Out == 0 ) ; // 等待高電平避開9毫秒低電平引導(dǎo)脈沖
DELAY_M(jìn)s(1); // 測(cè)試實(shí)際延時(shí)約為1.007ms
DELAY_M(jìn)s(1); // 測(cè)試實(shí)際延時(shí)約為1.007ms
DELAY_Us(200); // 0.086ms
DELAY_Us(200); // 0.086ms
DELAY_Us(200); // 0.086ms
// 共計(jì)2.272ms
if( IR_Out == 0 )
{
TEMP_Flag = 1; // 是連發(fā)碼
}
else
{
TEMP_Flag = 0; // 不是連發(fā)碼,而是引導(dǎo)碼
}
return TEMP_Flag;
}
bit H_L_LEVEL_Judge()
{
while( IR_Out == 0 ); // 等待地址碼第一位的高電平信號(hào)
DELAY_Us(800); // 測(cè)試實(shí)際延時(shí)約為764~928us
if ( IR_Out == 1)
{
DELAY_M(jìn)s(1); // 測(cè)試實(shí)際延時(shí)約為1.007ms
return 1;
}
else
{
return 0;
}
// --- 串口初始化 --------------------------------------------
void DELAY_Us(unsigned int Us)
{
unsigned int x;
for(x = 0; x <= (Us/200-1); x++);
}
void DELAY_M(jìn)s(unsigned int Ms)
{
unsigned int x,y;
for(x = 0; x <= (Ms-1); x++)
{
for(y = 0; y <= 120; y++);
}
}
void main()
{
unsigned char i;
UART_Initial();
IR_Out = 1;
while(1)
{
START_Flag = START_Judge();
BOOT_REPEATING_CODE_Flag = BOOT_REPEATING_CODE_Judge();
if ( START_Flag && !BOOT_REPEATING_CODE_Flag )
{
for(i =0;i <4; i++)
{
B0 = H_L_LEVEL_Judge();
B1 = H_L_LEVEL_Judge();
B2 = H_L_LEVEL_Judge();
B3 = H_L_LEVEL_Judge();
B4 = H_L_LEVEL_Judge();
B5 = H_L_LEVEL_Judge();
B6 = H_L_LEVEL_Judge();
B7 = H_L_LEVEL_Judge();
DATA[i] = TEMP_BIT;
}
for(i =0;i <4; i++)
{
SBUF = DATA[i];
while( TI == 0 );
TI = 0;
}
}
}
}
void UART_Initial()
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = 0xFD; // TH1: reload value for 9600 baud @
// 11.0592MHz
TR1 = 1; // TR1: timer 1 run
EA = 0; // 關(guān)閉總中斷
ES = 0; // 關(guān)閉串口中斷
}
}
注
1、紅外遙控的編碼不只NEC,還有很多也有廣泛應(yīng)用如RC-5,RC-6等。
2、上面的代碼所用指令是STC 89C52單片機(jī),如需用其它芯片請(qǐng)另行更改。
責(zé)任編輯:wv
-
紅外遙控解碼
+關(guān)注
關(guān)注
0文章
2瀏覽量
1064
發(fā)布評(píng)論請(qǐng)先 登錄
藍(lán)牙語音遙控器:智能家居的智慧控制核心

單片機(jī)實(shí)例項(xiàng)目:NEC紅外線協(xié)議編碼與解碼
藍(lán)牙無線遙控小車
教你一招,破解紅外遙控器(可下載)
紅外發(fā)射器是什么_紅外發(fā)射器怎么安裝
CW32模塊使用 紅外解碼編碼模塊

華芯紅外智能解碼分析儀介紹

RF遙控器廠家:射頻遙控器將成為未來的控制主流
高清電視盒子方案分享,紅外遙控適配過程全解析

評(píng)論